安卓逆向学习笔记(二)
目录
学习过程
orz 昨天写完了但是忘记保存了,无奈再复习一遍。
在我将我写的文件拖进AK(Android Skiller)后,我发现在该软件上显示Mainactivity丢失,这里我们需要注意:
- 下载好AK之后,我们需要将apktool换成最新版,在AK中apktool出现在两个地方,一个是根目录下的
apktool,一个在Bin文件夹中,这两个都需要换。 - 我们需要确定我们的apk文件是导出是正确的,就是因为我的apk文件导出不正确,所以在AK中我的文件才会出现错误。(求自己细心一点orz)。如何在Android Studio中导出apk文件_android studio导出apk文件如果你不会导出apk文件,可以看看这篇文档。
以上算是我们的准备阶段,因为只有打开软件且他能用,我们才能开始我们的下一步。
我们反编译完成之后,可以看到有一个入口点的链接,我们打开入口点。
点击之后,我们就可以看见我们的代码了。
我们的目的是:当我们输入错误的账号与密码时,我们也可以登录上去。那么其实比较重要的就是check函数了,我们看一下check函数长什么样子。
我并没有将整个的check函数全部截图,其实重要的就是我圈住的代码,这是代码判断的逻辑,我们说一下重要的比较方法。
if-eqz:当p1=0时,执行cond_0中的代码,反之,如果p1=1时,就执行下面的代码。if-nez:当p1=1时,执行cond_0中的代码,反之,如果p1=0时,执行下面的代码。
那么我们知道这个方法之后,代码的逻辑就很清楚了,当我们输入正确的用户名和密码之后就会登录成功,当我们输入不正确的用户名和密码时,就会登录失败。
cond_0:就是执行登录失败的代码。- 如果一直往下执行不跳转,就会登录成功。
为了实现我们的目的(即当我们输入不正确的用户名与密码时也可以登录成功),我们有三种方法(老师给的):
- 将
if-eqz改成if-nez,原来是输入错误才会跳转cond_0,改之后,输入成功就会跳转cond_0,也就是说,我们输入正确的用户名和,密码反而会登录失败。 - 将两句判断
if-eqz注释或者删掉,我们没有跳转之后,会一直向下执行,最终登录成功。 - 使用
goto进行无条件跳转。
我自己当时在想,如果将登录失败的unicode码改成登录成功的unicode码是不是也可以?
答案是不可以,我来说一下原因:
- 修改unicode仅仅是修改表示,内部逻辑并没有变,所以这种方法是错误的。
- 联想实际不难理解,如果我们输错密码了,虽然显示的是登录成功,但是我们的界面还是登录失败的界面。这是因为内部逻辑没有改变,在一些reverse题中,有时会这样迷惑你。
ok,我们来展示一下这三种方法的代码。
将
if-eqz改成if-nez
将两句判断
if-eqz注释或者删掉
使用
goto进行无条件跳转/5.png)
第三种方法需要注意:goto需要写在const/4 v0 0*0,这是因为需要先声明变量,如果直接在method下面写goto,就会导致找不到变量从而发生错误。
最后当我们输入错误时候确实是显示的输入正确,这里我不在放截图了。
课后作业
课后作业是将滚动的天空设置成无限球版,我看的教程是老师给的其他大佬的文档安卓游戏内购破解之滚动的天空。写这个作业的时候,遇到了非常多的问题,我们边写边说。
首先是下载原版的apk文件,这个文件版本太老了(8年前的版本),那时候的是32位的,但是不知道为什么在32位模拟器也打不开,其他版本的话,虽然能打开,但是不知道为啥不能购买,点击购买毫无反应,很神奇,但是也学了很多东西的。
我是使用老师给的版本18年的版本好像,在我们修改代码前,我们需要注意:
- 文件是有签名的,但是我们是没有这个签名的,但是没有签名就不能导出apk文件,那么我们就要想办法绕过这个签名。
- 怎么绕过签名?
我们用最简单的办法吧(一天都花费在了怎么绕过签名上,最后问大佬才知道orz)
使用
apktool将文件解包。(我的apk文件路径是E:\liulanqi\rollsky\rollsky.apk)解包命令:
apktool d "E:\liulanqi\rollsky\rollsky.apk" -o "E:\liulanqi\rollsky\rollsky_decoded"删除签名,进入
rollsky_decoded的目录,删除META-INF文件夹。重新打包。
打包命令:
apktool b "E:\liulanqi\rollsky\rollsky_decoded" -o "E:\liulanqi\rollsky\rollsky-unsigned.apk"加签名。(我的签名路径是
D:\Key.store)加签名命令:
apksigner sign --ks "D:\Key.store" --ks-key-alias "key0" --out "E:\liulanqi\rollsky\rollsky-signed.apk" "E:\liulanqi\rollsky\rollsky-unsigned.apk"- Key0是我签名的别名
apksighner是AndroidSkiller中的工具,进入这个工具目录使用该命令即可。
到这一步我们可以将文件拖入Android Skiller中进行反编译了。
因为当我们支付失败时有支付失败的提示,在上面的练习中,我们知道反编译之后,文字是以unicode形式表示的,我们搜一下知道支付失败的unicode的编码是\u652f\u4ed8\u5931\u8d25,我们可以搜索一下字符串。
搜索完成后,有三个文件都出现了这个字符串,我们发现第三个文件就是我们需要修改的文件。
在字符串中我们可以大概了解到,里面应该是有支付成功和失败的逻辑的,聪明的我们立刻就能想到可以将支付成功的代码覆盖到支付失败上。
可以看到,我们程序的逻辑就彻底改变了,不管支付取消还是支付失败最终都是支付成功。
修改之后我们就可以将文件导出apk文件,编译时选择我们加签名那一步的签名(key0),那么这个作业就结束了。
心理感受
这个作业让我感受到了逆向其实是很有意思的,能切实体会到自己究竟在干啥,之前我一直都是在刷CTF的逆向题,感觉实战更有意思。
虽然最后apk文件运行不了,但是也学到了很多东西。加油!!!