2016华山杯部分android逆向 |WP
参考链接https://bbs.pediy.com/thread-218555.htm
只能默默的膜一下大神
前言
这几个题总的来说不难,因为没有涉及到很难的算法,而且我感觉也确实考察了很多android逆向的知识点。很经典
题目一 virus02_02.apk
这道题主要考察samli注入…没什么好说的。
关于smali注入可以参考我的这篇文章
题目二 Shield.apk
看着样子是加壳了,但是我用查壳工具却查不出来。
主要的加壳部分是在ProxyAplication.class中实现的,分析其中的代码
可以看出来这个apk的结构为壳+源apk+源apk长度
到此我们有两种解决办法,一种就是按照参考文章的方法一样,照着加壳的过程写一个脱壳的代码。我这里采用另一种办法。
脱壳
在分析splitPayLoadFromDex
函数时,可以发现它将脱壳之后的apk写入了一个payload.apk中,然后加载该apk,在删除payload.apk。所以我能想到的思路就是在其脱壳完成后,将payload.apk dump
到本地,那么这个apk就是脱壳之后的包了。
此时只需要动态调试smali,在write函数下断。找到payload.apk的具体路径,使用adb pull到本地。
解密
得到脱壳后的apk后,可以看到正常的验证逻辑。一方面可以去看具体的加密过程,我这里简单点操作,直接smali注入,查看日志得到正确的***。
题目三 testndk4_Signed4.zip
绕过
拿到题目,无法安装,解压时提示密码,伪加密,修改504b0102的后几位。
安装后运行,提示没有权限!!??直接退出了。
调用native层的isExit(),使用IDA查看so
有点无语,这么生硬的代码,直接绕过就好了,这里有几种绕过方式。
第一种修改so文件
第二种修改smali,并回编译
第三种无视该activity,使用adb 在root权限下直接运行./MainActivity
如果用第三种方法,前面可以正常的绕过,但是点击确定按钮时会突然退出。所以可能还是不是很可靠。所以我采用修改smali的方法。
动态调试
代码逻辑很清楚了,在native做了判断,只需要动态调试,在内存中即可观察到正确的密码。
关于动态调试可以参考我的其它文章。
总结
这三道题设计的知识点还是比较多的,smali注入,脱壳,动态调试。如果在增加点反调试措施,或者来个加密协议,混淆,难度就会上来了。