主要学习smali,通过实际上手修改smali代码加深理解。
JVM
JVM是Java虚拟机,运行Java字节码程序。
Dalvik
Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)。
smali及其语法
smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。可以把Dalvik理解成x86,那么smali就是x86汇编。在反编译的时候不能修改该java代码,只能修改smali代码。
jadx
分析apk的工具,可以理解为分析java的ida。
vip终结
任务是一键三连,但是他弹窗提醒需要充值大会员,直接在jadx中使用搜索功能,搜索大会员。直接定位到这段代码。
首先他会判断我们的硬币数量,在判断我们是不是vip,解决方法
- 进入这个方法之后直接goto到 ChallengeSecond challengeSecond2 = challengeSecond;
- 修改硬币和isvip的判断
- 修改寄存器中的值
通过修改判断
jadx不支持修改代码,要使用mt管理器,提取apk文件并定位,反编译dex文件,搜索硬币,点击进入
if-ge全称greater equal(a>=b),a大于或等于则跳,在mt里直接修改成if-le也就是小于等于即可,这样我们就会直接跳转到标签cood_15处,下面看isvip判断
1 | if-eqz p0, :cond_43 |
如果p0等于0则跳转到cond_43处,而cood_43是提示请充值大会员的标签,所以我们可以选择直接注释掉这段代码,这样就不会发生跳转,或者讲逻辑改成不等于0.
保存并重新安装即可。
通过修改寄存器的值
p0是我们的硬币数量,v0被赋成了10,我们只需要将 const/16 v0, 0xa改成 const/16 v0, 0x0即可。下面跳转到isvip判断,长按点击跳转
逻辑是这样的
也就是返回0即假,直接const/4 v0,0x1即可
强制跳转
看一下goto的用法
直接照着葫芦画瓢
成功。