首页 > 代码库 > 360加固保动态脱壳

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)

360加固保动态脱壳