admin管理员组

文章数量:1635316

最近很多人问关于360脱壳的东西,打算着手研究一发,那就从最简单的一代开始,标题也很清楚,一代加固脱壳,因此大神觉得没什么价值,绕道,勿喷;本帖抱着学习的态度,没有什么恶意,后面二代、三代有余力的情况下会研究也会分享。

首先我觉得脱壳是逆向水平的一个综合考察,不仅要对Android中系统源码和加载流程有熟悉的认识,还要对在脱壳中的反调试又敏锐的察觉,当然锲而不舍的精神也是很关键的,很多同学上来就脱最新的壳,或者找脱壳机,脱壳机也是那些高手在分析清了每个厂家的加固原理后自己写出来的,手动脱半天脱不下来,被各种卡,各种反调试折腾,就放弃了,那何不从一代开始慢慢研究,找出里面的原理方法,这样一来认识里面的原理结构,同时又能建立自信。。。。

方法1: 手动脱,在mmap处下断点,同时过以检测/proc/pid/status中的Tracerpid为主:
有一个问题:为什么要在mmap下断点?
曰:我们知道像爱加密一代的时候都是在dvmDexFileOpenPartial这个关键函数处下端进行脱壳的,至于为什么是这个关键函数,这个就要看系统源码,这个关键函数的参数代表着一个解密的dex,然而360加固底层不是采用dvmDexFileOpenPartial这个系统函数来解析dex,自己可以去试一下,然后加载到内存中的,而是自己实现了一个函数,所以给这个函数下断点,然后获取参数值来dump内存中的dex数据是行不通的,但是有一个思路就是不管他用哪个函数去解析dex加载到内存,最终都得使用mmap这个系统函数来操作,所以还得给这个函数下断点,所以这里在调试的时候需要时刻注意的是当断点到达了mmap函数处的时候。
&&
我在脱的时候发现360一代壳略有微小的差别,差别主要是在对反调试的检测次数上,大致的东西原理是不变的,可能有时候反调试会检测4次,有时候会检测7次,当然原理都一样,别的也就没啥。


方法2:借助于xposed插件形式和cydia substrator的专用脱壳机


方法3 如果我不知道在mmap函数处下断点,那怎么办?
曰:在JNI_Onload处下断点,一般反调试或者反root的都会写在此处,继续往下调试去分析,这里把反调试全部过了后不知道为毛一加载一个so就卡,到不了解密的dex处。不知道是机器还是什么问题。对于不知道怎么在JNI_Onload下断点的,可以参考点击打开链接这里面的方法三。

方法4: 在JNI_Onload处下断点,同时呢在open函数处也下断点,根据观察LR寄存器的值,加载到libjiagu.so处,寻找反调试,并过掉他
问题来了,为毛要在open函数处下断点?
曰:因为我们知道既然到了JNI_Onload处,那么肯定要走反调试,通过前面分析我们知道,要检测Tracepid那么肯定要打开/proc/pid/status文件,那么肯定要调用open或者fopen,那么只有一一试一下,这里open是可以的。


方法5: dex2oat,修改源码做,做脱壳机

参考:http://bbs.pediy/thread-210275.htm


样本:点击打开链接





本文标签: 脱壳方法