本文不会提供具体的逆向的软件或者是成品,文章内容仅用于技术交流学习!
关于签名校验
- 对应用执行改包操作前,第一步就是要去掉签名校验,否则会闪退,或者让你到应用商店下载
- MT管理器-*.apk-功能-去除签名校验-确定
关于HOOK
APK1
逆向版本:2.4.6.7
- 登录账号后到会员页面,可以看到
立即开通
- *.arsc-资源查询-
立即开通
-搜索字符串- 点击检索的目标即可复制资源ID(7f0f049e
) - dex搜索代码
复制的资源ID
,可以锁定到com.screen.recorder.components.activities.vip.domestic.DomesticVIPActivity
- 将其转成java代码
public final void Z0() { boolean p = c13.p(this); boolean z = this.x && c13.n(this); this.p.setVisibility(z ? 8 : 0); if (z) { this.q.setVisibility(0); this.r.setVisibility(8); } else { this.q.setVisibility(8); this.r.setVisibility(0); this.r.setText((this.x && p) ? 0x7f0f0498 : 0x7f0f049e); m0(); } R0(false); }
- 通过分析java代码,
(this.x && p) ? 0x7f0f0498 : 0x7f0f049e
很明显是个三目运算符 - 当运算结果为
fasle
时是立即开通,所以true
时就会执行前面的0x7f0f0498
,通过查询这个代表的字符串是续期
- 如何让表达式为
true
?this.x暂且不论,直接去改p,也就是c13.p
为true
就行 -
直接转回smali代码定位跳转到
c13.p
smalimethod public static p(Landroid/content/Context;)Z .registers 1 .line 1 invoke-static {p0}, Lcom/duapps/recorder/b13;->D(Landroid/content/Context;)Lcom/duapps/recorder/b13; move-result-object p0 invoke-virtual {p0}, Lcom/duapps/recorder/b13;->K()Z move-result p0 return p0 .end method
java
public static boolean p(Context context) { return b13.D(context).K(); }
- 那么,修改思路就很清晰了,直接在smali的return p0前增加
const/4 p0,0x1
- 修改后保存编译发现就已经是vip了
- 但是此时你会发现不能登录了,可能会有点强迫症,那么此时我们再把会员页面去掉吧
- 会员页面是怎么触发的呢?当我们点击左上角的图标时就会触发,所以打开
开发助手
去定位其资源id(0x7f090277
) - 再根据资源id搜索,定位到了
com.screen.recorder.components.activities.HomeActivity
- 转java代码后
... ImageView imageView = (ImageView) findViewById(0x7f090277); this.m = imageView; imageView.setOnClickListener(new y60(this)); this.n = (ImageView) findViewById(0x7f090279); L0(); if (this.m.getVisibility() == 0) { l03.C("home_page", p03.g(this), x13.C(this).D()); }
- 本来没啥思路,当我看到getVisibility时眼前一亮,直接设置为不可见不就好了,而且根据代码
this.m.getVisibility() == 0
时会执行home_page
,所谓的home_page
应该就是主页面了,虽然不确定这个与vip页面有没有关,但是至少有路可以走,先走再说! - 根据代码,图标按钮被赋值成了
this.m
,那么home_page
的触发与否就看this.m
的可见性是否为0了 - 那么继续查看代码,看看有没有地方会去修改
this.m
的值,看到了个L0()
这个函数,那么直接定位看看public final void L0() { if (p03.i(this)) { this.l.setVisibility(0); this.m.setVisibility(0); ... } }
- 可以看到,当
p03.i(this)
的值为true
的时候就会触发设置this.m
的可见性为0 -
那么不让他触发,那肯定得让他的值为
false
,定位到p03.i
smali.method public static i(Landroid/content/Context;)Z .registers 1 .line 1 invoke-static {p0}, Lcom/duapps/recorder/u03;->h(Landroid/content/Context;)Z move-result p0 return p0 .end method
java
public static boolean i(Context context) { return u03.h(context); }
- 那么,修改思路就很清晰了,直接在smali的return p0前增加
const/4 p0,0x0
- 编译后打开软件发现果然vip相关的都消失了,此时新问题又来了,设置页面会有个
启用查看应用使用情况
的按钮,点击后跳转的授权页面竟然没有这个应用,没有还怎么授权?这应该是这个应用的一个bug,或者是可能没有适配安卓高系统 - 只能自己增加权限了,打开
AndroidManifest.xml
- 在权限并列处增加下列权限后编译即可
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
APK2
逆向版本:13.1.16
- 小黄鸟抓包:抓到vip的请求
https://pay.*.com/verify/vip/status { "code": 200, "data": { "vipStatus": 2, "expiryDate": "", "appSubManageInfo": null }, "msg": "" }
- 此时去dex里搜索vipStatus,稍加思索可定位到getvipStatus()
-
跳转进入对应的smali代码
.method public final getVipStatus()I .registers 2 iget v0, p0, Lcom/yiruike/android/billing/entity/UserStatusEntity;->a:I return v0 .end method
- 转成java代码
public final int getVipStatus() { return this.a; }
- 上方请求的vipStatus值为2,java代码返回值也刚好是int,所以直接猜想使用整数1去尝试
- 那么,修改思路就很清晰了,直接在smali的return v0前增加
const/4 v0,0x1
- 修改后保存编译签名即可!