这篇博客就记一下自己脱360加固2,3代的过程吧。毕竟作为一个android逆向入门小菜完全靠自己脱壳是不大现实,事实上也是借鉴了不少大佬们的博客,当然碰到了可遇而不可求的一代壳的话那是当然要垂死挣扎,好好搞明白,总要由简入深,在此基础当初当然是ida的动态调试了,详细请参看上篇博客脱壳练习(0)-动态调试1代脱壳
因为是参照网上资料做出来的,所以就简单写下心得吧
360二代脱壳
在此就主要借鉴了 Apk脱壳圣战之---脱掉“360加固”的壳
也按照此教程顺利脱壳,感谢大大。也简单说下自己的思路吧
1.360-2代壳子最重要的就是mmap函数,通过mmap函数读取反调试文件,以及映射dex到内存,但是此文中一开始就在mmap下断点,会在刚开始多次断在该函数下,不如在目标so-libjiagu加载后,也就是一开始断在linker后再下断点,可节省时间。
2.在进程正常运行过程中,一般在内存中为文件分配地址后不会轻易改变,这也是在经过mmap函数分配地址后要时刻紧跟目标地址达到脱壳的原因。
3.在查找反调试时,应该密切注意BL CMP指令的组合,当然这也是日常逆向应该格外关注的。
4.在刚开始按照次方法进行脱壳时,在检测Tracerid的地方下了断点,也因此不正常退出,这是因为多次检测Tracerid的位置并不是一成不变的,按照前两次检测Tracerid的地方下好断点,但是进入下一轮之后虽然流程几乎不变,但是地址稍微变了变,提前下好断点导致恢复时产生崩溃(这是本菜的理解,有不正确的地方请斧正
360三代脱壳
3代壳子也是最近才开始尝试进行脱壳的,也是才刚刚可以拿到dex,看到native onCreate 望而却步,有时间慢慢看吧(大概是有点不自量力吧),但是已经开始为自己能做到这一步有点沾沾自喜,也来简单总结一下这其中的过程。
在此主要借鉴了
1.第一处当然是过反调试了,文章中说的很明白了,主要是在case 29 blx lr下断点。
2.当我们顺利过了反调试,就是进入第二个so,真正dex进行解密的地方。在case 33处调用了解压函数
uncompress,第一个参数是地址,第二个参数是存放长度的地址,dump下来就是我们的解密so了。添加一下elf文件的魔术字,就可以借用ThomasKing大神的so修复工具进行section的修复了。
3.拿到了目标so然后ida就可以正常打开,去分析解密的过程,自然脱壳就不成问题,但是看着都花眼的指令实在是有心无力,看来还是对指令集不够熟悉,是时候去强化一波,学习嘛,一次不够就两次,多多益善。既然如此我们只好先尝试第一种dump dex的方式。但是。。。我的样本并不是在最后一个debug段中找到目标dex的,也很合理,版本不同,所执行的实际位置不同,内存里又怎么如此相同呢,不过肯定在的,在附近debug段找了找,终于顺利找到想要的dex。