参考:https://bbs.pediy.com/thread-223699.htm
http://blog.csdn.net/luoshengyang/article/details/8923483
前几日看到大神写的
https://bbs.pediy.com/thread-223699.htm这篇博客感觉受益匪浅,但是其中有一些自己的理解想跟大家一起分享,算不上原创,希望各位大侠不要嘲笑。共同学习。
一:思路分析:
一个经过360加固的APK的运行过程应该为图中左边所示,在以上这种so劫持的思路为:第一步通过hook loadlibrary方法先加载自己的so,即:libhook.so
第二步在libhook.so中再加载libjiagu.so,并执行其中的JNI_Onload方法,完成最后的解释。
这样做有个最大的好处是:就是在libhook.so中通过hook 注册函数dvmUseJNIBridge()得到oncreate函数的地址,更好的进一步分析360的虚拟解释函数。因为360壳比较复杂,前面有一堆的解密等操作,这样做可以直接切入要害。
二、此思路能否过反调试?
1.原作者这种巧妙的运用sleep(9),不以调试模式启动,等在sleep(9)的时候直接附加,这个时候360在JNI_Onload中的反调试已经运行完了,所以不会触发反调试。
2.以下这种是在以调试模式启动的时候过反调试的基本操作:
首先看Dalvik虚拟机JNI方法的注册过程分析,通过老罗的分析博客,(老罗的分析真的很到位,此处盗用老罗的图)可以大致知道运行图如下:
因此来说在整个so劫持的关于JNI方法注册大致是如下:
从中我们可以看出要想在调试运行过程中在new_dvmUseJNIBridge()函数处下