1. 查壳
查入口:AndroidManifest -> application 标签
2. Assests 分析
Assests 中一般储存着加密过的 dex 以及解密用的 so 等信息,因此先分析 Assests 可以有
效获取程序解壳思路
3. ProxyApplication 分析
1) 查找 so 文件并修复分析
2) native 函数记录
3) 解码函数定位
4. so 分析 分析 ,解码定位
带压缩的:一般使用 libz 中的 uncompresse 函数进行解码,因此可以使用该函数快速定
位解码关键点。
5. 内存 dexdump
找到解码 dex 的函数,直接 dump 有效数据
6. Demo 示例 示例( (360 加固)
使用 startApplication 方式进行调试
安装完成后开启调试端口并完成端口转发
调试打开 app
程序处于调试状态
因为调试 so 文件,所以需要设置当 so 文件加载的时候断下来
然后进行挂接
启动调试
在 JNI_ONLoad 函数中存在乱序混淆
写脚本对抗壳中的乱序混淆筛选出有用的代码
处理后得到该函数未混淆的代码
找到疑似的重要函数(JNI_ONLoad2 函数)
下好断点后重新进行调试
将相应的结构导入进去进行反编译分析
分析函数代码
找到真正的 JNI_Onload 函数(JNI_Onload3)
将目标区域(包括一些相邻字段)dump 下来
使用 IDA 打开 dump 文件,修改为 ARM 类型
将 ARM 状态转换成 Thumb 状态
获得目标函数内容
加载头文件出错,提示首先要进行编译
进行编译
导入所需的库文件
之后可以正常加载 header 文件了
修改函数中的相关名称
找到重要的判断函数,返回失败 or 返回 JNI_VERSION
跳转到可疑函数中并修改变量名
根据代码可以看出该函数很有可能跟 dex 函数释放有关联,首先读取内存中 maps 文件,从中寻找 dex 文件的相关地址
通过动态单步调试找到 Dex 文件的内存地址信息
使用脚本 dump 出 dex 文件
通过 while 循环部分来完成 dex 解码
脚本运行完之后得到原始 dex 数据
将 dump 出的 dex 文件反编译为 smali
最后完成 smali 文件替换,去掉 AndroidManifest.xml 中壳入口等相关信息
最后成功得到脱壳的程序