目标样本为2022年某次比赛中一道Android逆向题目,按照解题情况来看,解出此题目的人数不多,难点在于大量的核心代码被抽取,需要逆向还原代码,掌握了此类考点后,再分析类似于抽取壳就比较容易了。
直接使用adb install对目标程序进行安装,发现报错,可以尝试使用adb -t 进行允许测试包的安装,也可自行修改配置文件,将测试选项修改掉。
通过逆向查看配置文件发现程序包名为 com.example.nothingcode ,其实其真实的包名应该为 com.example.testchouqu
直接查看其源代码,未能找到具体的核心逻辑。
程序有加壳特征。但是使用查壳工具暂未查出明显特征。
反编译后,继续使用逆向工具查看,依旧发现无任何核心业务逻辑代码 ,都被指令抽取。
先尝试使用blackdex 脱壳还原,拿到的dex文件如下:
使用反编译工具查看,发现其dex壳代码被脱下,及相关指令还是被抽取,无核心逻辑代码。
第一种方案失败,通过该抽取壳的官方描述:
dpt-shell是函数抽取壳的实现。一种将dex文件中的函数代码抽空,然后在程序运行时将函数代码填回的那么一种壳。因此这里继续使用frida-dexdump,直接从内存中将壳代码dump出来,看能否还原会源代码。该工具能直接暴力搜索程序的内存,使用-d(deep search)参数,从内存中进行暴力深搜,
命令如下:
frida-dexdump -U -d -n testchouqu -o xxxdex_out
frida-dexdump -U -d -n com.example.nothingcode -o xxxdex_out
在这里尝试使用 Android 8 Android8.1 Android 13 ,Android11 等多个版本,程序都闪退,未能完成脱壳。
抓取日志查看
adb logcat -c
adb logcat -> log.txt
通过分析日志,重新使用谷歌官方镜像,在Android studio中的模拟器,Android10下进行操作,按照以上步骤,adb install -t 成功安装目标apk,并成功完成脱壳,脱壳的内容很多,如下:
经过文件大小排序,逐一排查,发现最终脱壳成功的classes05.dex为我们的目标,因此分析此dex文件。
在Classes05.dex文件中先分析check函数,代码逻辑已经还原。
传递的参数也能看到,但是代码被混淆。
加密核心逻辑如下:
使用javadeobfuscator或者threadtear 进行去控制流进行解密,写出还原代码。
enc=[71 ,105 ,118 ,101 ,121 ,48 ,117 ,114 ,102, 49, 65, 103, 121, 107, 111, 99]
for i in enc:
print(chr(i),end="")
# Givey0urf1Agykoc
最终得到flag Givey0urf1Agykoc
该指令抽取壳相关项目地址:
https://github.com/luoyesiqiu/dpt-shell
总结
题目核心逻辑简单易懂,但是使用混淆以及指令抽取能极大的增加软件不被逆向的概率,作为比赛题目,对初次接触该领域的选手而言,还是具备一定难度的。
原文始发于微信公众号(山石网科安全技术研究院):移动安全安卓APP指令抽取壳浅析