360二代加固脱壳方法总结
二代加固的难度有所增加,最明显的地方就是qihoo下面增加了一个Configuration.smali文件。由以前的一个增加为两个。
脱壳时有几个关键的so:
1.libc.so(主要是提供一些系统函数,比如open、fopen、fget等等);
2.libdvm.so/libart.so(主要是Android中的系统so,也是重要的Android虚拟机中的重要的so,由于Android有java层面要跟本地层进行交互时,因此这里面的很多系统函数很重要,比如libdvm.so中的dvmdexfileopen()函数或者libart.so中的java中的javavmextloadnative()函数,都是脱壳时候的重要把握的函数);
3.libjiagu.so(我们简称为壳so,这里主要是指的是360壳的so,就是反调试什么的都在这里面,反调试函数肯定是要用到很多libc.so提供的系统函数,因此可以看到在调试反调试的时候,总是libjiagu.so跟libc.so在进行不断的交互);
4.libXX.so就是目标的so文件,也就是我们应用级别的so;
其实脱壳就是这几个so文件,从头走到尾的过程,只有走到应用级别的so,那么就很容易dump处想要的so。
因此一个过程就是:
libc.so--->libart.so/libdvm.so--->libjiagu.so--->libXX.so
对于过反调试有很多的方法:
1.我们对于cmp R0,0;运行到这个地方进行一个个的修改;
2.对于反调试的子函数我们进行NOP或者加一些mov r0,#0 ret,也就是00 00 A0 E3、 0E F0 A0 E1这样的说明;
3.或者对于某些反调试,比如不断的检测Tracepid,这时候就不能手动过掉,修改系统内核对于内核中比如检测Tracepid的地方进行修改,那么加固中的反调试是不是就起不到作用了。
参考:http://mp.weixin.qq.com/s/v_3o8XJ0u5F-euCv9lY2TQ
方法一:IDA手动脱壳:(在mmap函数处下端)
此时注意APK附加上以后,重新勾选三项,因为此处的反调试放的更早了,等你直接运行到mmap函数的时候已经迟了,所以从linker处进行下端点然后进行加载分析。
方法二:IDA手动脱壳:(Dalvik模式下在memcmp处进行下端)
手动脱壳:
静动态进行结合:
先静态观察然后结合动态去观察寻找反调试点
第一步:就是在JNI_Onload处dump处so并修复。可以看到一个调用函数关系图,特别是反调试中所用到的关键的函数的一个关系图。
第二步:就是由于反调试一般在JNI_Onload处,所以这时候,可能会调用open或者fopen进行打开,在open处进行下端点,F9执行;
第三步:(最关键的一步)ctrl+F7与F9交替进行出现在反调试最上层的调用处,然后过掉;
第四步:继续F9,ctrl+F7,F9进行交替走到反调试的函数处,这时候采用以上反调试的第二点弄点反调试函数;
第五步:在memcmp函数进行下断点,一直F9,去掉断点,然后F9;
第六步:运行到memcmp处,然后F9,观察R0 HEX窗口;
第七步:dump出来进行分析;
方法三:IDA手动脱壳:(ART模式下)
此处略过;
方法四:drizzleDump,自动脱壳机
原理:一款基于内存特征搜索的dex文件dump脱壳工具,drizzleDumper工作的原理是root环境下,通过ptrace附加需要脱壳的apk进程,然后在脱壳的apk进程的内存中进行dex文件的特征搜索,当搜索到dex文件时,进行dex文件的内存dump。