【移动安全基础篇】——22、Android dvm 脱壳

1.  查壳
查入口:AndroidManifest -> application 标签

2. Assests  分析
Assests 中一般储存着加密过的 dex 以及解密用的 so 等信息,因此先分析 Assests 可以有
效获取程序解壳思路

3. ProxyApplication  分析
1)  查找 so 文件并修复分析
2)  native 函数记录

【移动安全基础篇】——22、Android dvm 脱壳_第1张图片

3)  解码函数定位

4. so 分析 分析 ,解码定位
带压缩的:一般使用 libz 中的 uncompresse 函数进行解码,因此可以使用该函数快速定
位解码关键点。

5.  内存 dexdump
找到解码 dex 的函数,直接 dump 有效数据

6. Demo 示例 示例( (360  加固)
使用 startApplication 方式进行调试

【移动安全基础篇】——22、Android dvm 脱壳_第2张图片

安装完成后开启调试端口并完成端口转发

【移动安全基础篇】——22、Android dvm 脱壳_第3张图片

调试打开 app

【移动安全基础篇】——22、Android dvm 脱壳_第4张图片

程序处于调试状态

【移动安全基础篇】——22、Android dvm 脱壳_第5张图片

因为调试 so 文件,所以需要设置当 so 文件加载的时候断下来

【移动安全基础篇】——22、Android dvm 脱壳_第6张图片

然后进行挂接

【移动安全基础篇】——22、Android dvm 脱壳_第7张图片

【移动安全基础篇】——22、Android dvm 脱壳_第8张图片

启动调试

【移动安全基础篇】——22、Android dvm 脱壳_第9张图片

在 JNI_ONLoad 函数中存在乱序混淆

【移动安全基础篇】——22、Android dvm 脱壳_第10张图片

写脚本对抗壳中的乱序混淆筛选出有用的代码

【移动安全基础篇】——22、Android dvm 脱壳_第11张图片

【移动安全基础篇】——22、Android dvm 脱壳_第12张图片

处理后得到该函数未混淆的代码

【移动安全基础篇】——22、Android dvm 脱壳_第13张图片

找到疑似的重要函数(JNI_ONLoad2 函数)

【移动安全基础篇】——22、Android dvm 脱壳_第14张图片

下好断点后重新进行调试

【移动安全基础篇】——22、Android dvm 脱壳_第15张图片

【移动安全基础篇】——22、Android dvm 脱壳_第16张图片

将相应的结构导入进去进行反编译分析

【移动安全基础篇】——22、Android dvm 脱壳_第17张图片

【移动安全基础篇】——22、Android dvm 脱壳_第18张图片

【移动安全基础篇】——22、Android dvm 脱壳_第19张图片

【移动安全基础篇】——22、Android dvm 脱壳_第20张图片

分析函数代码

【移动安全基础篇】——22、Android dvm 脱壳_第21张图片

【移动安全基础篇】——22、Android dvm 脱壳_第22张图片

【移动安全基础篇】——22、Android dvm 脱壳_第23张图片

找到真正的 JNI_Onload 函数(JNI_Onload3)

【移动安全基础篇】——22、Android dvm 脱壳_第24张图片

 

【移动安全基础篇】——22、Android dvm 脱壳_第25张图片

【移动安全基础篇】——22、Android dvm 脱壳_第26张图片

将目标区域(包括一些相邻字段)dump 下来

【移动安全基础篇】——22、Android dvm 脱壳_第27张图片

【移动安全基础篇】——22、Android dvm 脱壳_第28张图片

【移动安全基础篇】——22、Android dvm 脱壳_第29张图片

使用 IDA 打开 dump 文件,修改为 ARM 类型

【移动安全基础篇】——22、Android dvm 脱壳_第30张图片

将 ARM 状态转换成 Thumb 状态

【移动安全基础篇】——22、Android dvm 脱壳_第31张图片

【移动安全基础篇】——22、Android dvm 脱壳_第32张图片

【移动安全基础篇】——22、Android dvm 脱壳_第33张图片

获得目标函数内容

加载头文件出错,提示首先要进行编译

【移动安全基础篇】——22、Android dvm 脱壳_第34张图片

进行编译

【移动安全基础篇】——22、Android dvm 脱壳_第35张图片

导入所需的库文件

【移动安全基础篇】——22、Android dvm 脱壳_第36张图片

【移动安全基础篇】——22、Android dvm 脱壳_第37张图片

【移动安全基础篇】——22、Android dvm 脱壳_第38张图片

 

之后可以正常加载 header 文件了

【移动安全基础篇】——22、Android dvm 脱壳_第39张图片

修改函数中的相关名称

【移动安全基础篇】——22、Android dvm 脱壳_第40张图片

【移动安全基础篇】——22、Android dvm 脱壳_第41张图片

【移动安全基础篇】——22、Android dvm 脱壳_第42张图片

【移动安全基础篇】——22、Android dvm 脱壳_第43张图片

找到重要的判断函数,返回失败 or 返回 JNI_VERSION

【移动安全基础篇】——22、Android dvm 脱壳_第44张图片

【移动安全基础篇】——22、Android dvm 脱壳_第45张图片

跳转到可疑函数中并修改变量名

【移动安全基础篇】——22、Android dvm 脱壳_第46张图片

【移动安全基础篇】——22、Android dvm 脱壳_第47张图片

【移动安全基础篇】——22、Android dvm 脱壳_第48张图片

【移动安全基础篇】——22、Android dvm 脱壳_第49张图片

根据代码可以看出该函数很有可能跟 dex 函数释放有关联,首先读取内存中 maps 文件,从中寻找 dex 文件的相关地址

【移动安全基础篇】——22、Android dvm 脱壳_第50张图片

【移动安全基础篇】——22、Android dvm 脱壳_第51张图片

【移动安全基础篇】——22、Android dvm 脱壳_第52张图片

通过动态单步调试找到 Dex 文件的内存地址信息

【移动安全基础篇】——22、Android dvm 脱壳_第53张图片

【移动安全基础篇】——22、Android dvm 脱壳_第54张图片

使用脚本 dump 出 dex 文件

【移动安全基础篇】——22、Android dvm 脱壳_第55张图片

通过 while 循环部分来完成 dex 解码

【移动安全基础篇】——22、Android dvm 脱壳_第56张图片

脚本运行完之后得到原始 dex 数据

【移动安全基础篇】——22、Android dvm 脱壳_第57张图片

将 dump 出的 dex 文件反编译为 smali

【移动安全基础篇】——22、Android dvm 脱壳_第58张图片

最后完成 smali 文件替换,去掉 AndroidManifest.xml 中壳入口等相关信息

【移动安全基础篇】——22、Android dvm 脱壳_第59张图片

【移动安全基础篇】——22、Android dvm 脱壳_第60张图片

最后成功得到脱壳的程序

你可能感兴趣的:(【移动安全】,———移动安全基础篇)