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

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 中壳入口等相关信息

最后成功得到脱壳的程序

首先,查壳,使用PEID或者是FI,为UPX v1.08 接下来用OD载入,提示为“压缩代码是否继续分析”,我们选择否 我在这里介绍几种方法,请看我的操作。 方法1:单步跟踪(最常见的方法) 0040E8C0 N> 60 pushad //停在这里了,我们F8单步 0040E8C1 BE 15B04000 mov esi,NOTEPAD.0040B015 0040E8C6 8DBE EB5FFFFF lea edi,dword ptr ds:[esi+FFFF> 0040E8CC 57 push edi 0040E8CD 83CD FF or ebp,FFFFFFFF 0040E8D0 EB 10 jmp short NOTEPAD.0040E8E2 //跳 。。。。。。。。。。 0040E8E2 8B1E mov ebx,dword ptr ds:[esi] //跳到这里,继续单步 0040E8E4 83EE FC sub esi,-4 0040E8E7 11DB adc ebx,ebx 0040E8E9 ^ 72 ED jb short NOTEPAD.0040E8D8 //这里要往回跳了 0040E8EB B8 01000000 mov eax,1 //F4,然后继续F8 0040E8F0 01DB add ebx,ebx 0040E8F2 75 07 jnz short NOTEPAD.0040E8FB //跳 。。。。。。。。。。。 0040E8FB 11C0 adc eax,eax //来到这里,F8继续 0040E8FD 01DB add ebx,ebx 0040E8FD 01DB add ebx,ebx 0040E8FF ^ 73 EF jnb short NOTEPAD.0040E8F0 0040E901 75 09 jnz short NOTEPAD.0040E90C //跳 。。。。。。。。。。。 0040E90C 31C9 xor ecx,ecx //跳到这里,继续F8 0040E90E 83E8 03 sub eax,3 0040E90E 83E8 03 sub eax,3 0040E911 72 0D jb short NOTEPAD.0040E920 //跳 。。。。。。。。。。。 0040E920 01DB add ebx,ebx //跳到这里,继续F8 0040E922 75 07 jnz short NOTEPAD.0040E92B //跳 。。。。。。。。。。。 0040E92B 11C9 adc ecx,ecx //跳到了这里,继续F8 0040E92D 01DB add ebx,ebx 0040E92F 75 07 jnz short NOTEPAD.0040E938 //跳 。。。。。。。。。。。 0040E938 11C9 adc ecx,ecx //跳到这里,继续F8 0040E93A 75 20 jnz short NOTEPAD.0040E95C //跳 。。。。。。。。。。。 0040E95C 81FD 00F3FFFF cmp ebp,-0D00 //来到这,继续F8 0040E962 83D1 01 adc ecx,1 0040E965 8D142F lea edx,dword ptr ds:[edi+ebp] 0040E968 83FD FC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值