360加固保动态脱壳
测试环境:
调试器: IDA6.5
手机及系统版本:
.SO层脱壳
一:.如何到达壳入口点?
1.我是通过对dvmLoadNativeCode函数下断,分析它执行流程最后到达壳入口(如果您有更好的办法还请告知,感谢中...),函数dvmLoadNativeCode是执行加载so文件的操作。(2.3系统是这个名字),2.3以上系统被名称粉碎了,不过在2.3以上系统中可以在libdvm.so中搜索函数名也是可以找到的,(我当前系统函数名为:_Z17dvmLoadNativeCodePKcP6ObjectPPc)如下图所示:
2.对dvmLoadNativeCode函数进行下断有些小技巧,前后下断点,等壳执行完成后反回就断在这里,如下图所示:
3.跟进这libdvm.so:4087B900 BLX unk_4083F694 函数后,分析其流程就可以发现有so的加载基址为0x5B97C000,如下图:
4.得到so在内存中基址后就可以用ReadELF -a xx.so来查看so文件的INIT_ARRAY文件偏移,如下图执行 ReadELF -a libprotectClass.so 命令后
5.我们用IDA静态反编译libprotectClass.so文件,然后去0xfd98地址去看看,是一个函数地址,如下图
该函数为:
6.得到了libprotectClass.so在内存中基址与INIT_ARRAY文件偏移,将它们相加即可得到so壳入口了0x5B97EF5C,去内存中看看,如下图:
是不是与__gnu_armfini_26函数很像呢?然后我们在该函下个断点,F9执行以这儿就可以接着分析so壳代码了。
二:so如何脱壳?
1.到达壳入口后我们单步跟踪看看,到修改代码属性这里
R0为要修改的开始地址
2.准备解密代码,跟进该函数。
在该函数里做解密代码操作,首先是拷贝0xA长度的密钥,如下图,然后初始化密钥
3.从初始化密钥函数来看,应该使用的是RC4算法,接着就是解密了。
R0为要解密的Buffer, R1为Buffer的大小, R3为初始化后的密钥。
4.算法 密钥 都知道了,我们可以写个程序来解密so了,如下图解密前后JNI_OnLoad对比。
解密前为:
解密后为:(代码己正常)
到此可以静态分析了,其它的小伙伴们自己去玩吧(^_^), 解密算法RC4_so己放在附件中。
DEX 内存dump
1.接着上面so代码解密完成后,反回到这里, libdvm.so:4087B904 MOV R1, R6
这时可以在JNI_OnLoad函数下断点了,如下图:
F9来到JNI_OnLoad函数,接着就是慢长的分析了。
详细的分析流程我就不细说了,想了解的现在可以自己动态与静态结合分析了,我们这次的目的是内存中dump完整的DEX。
到JNI_OnLoad函数后,到下面libprotectClass.so:5B88A22C BLX R4下好断点。如下图
3.F9到这里后,F7跟进,然后在 mmap函数下断点, F9执行,当LR的地址为程序领空时反回下好断点(一定要是程序领空才有效,因为mmap会被多次调用),F9执行。
接下来R0将会存放解密后的Dex,然后F8走,直到该函数执行完成后,开始解密DEX开头0x70个字,解密完成后就可dump出来了,如下图:
到此完整的DEX己经出来了,下面我们Dump出来,打包反编译。
开始地址为0x5BC35000, 大小为0x005EDBA4, 结束地址为0x5C222BA4
4.将dump出来的dex重新打包并能成功反编,如下图:
5.到此整个过程就完成了,下面该做些什么小伙伴们自己发辉吧,我就不知道了。(^_^)。(样本就是上传了,想玩玩的去XX加固保官网下载去吧)
资料下载
http://yunpan.cn/cAFzDYcB6weWY (提取码:6e74)