在上次我们基本了解JNI以后,对基本的工具也有了使用。这次从代码底层追踪下是如何实现的
system.loadlibary后,我们应该要找到一个相似的地方,应该是知道加载过程。下面这位大佬转载了两篇文章,两位大佬都写的非常全面。一个是从底层详细分析loadLibrary的加载过程,一个是从实践做一个简单的demo去使用动态加载链中的函数。虽然AOSP源码版本可能不同,但是大概是相同的
System.loadLibrary()
Runtime.loadLibrary()
Runtime.doLoad()
Runtime_nativeLoad()
LoadNativeLibrary()
dlopen()
dlsym()
JNI_OnLoad()
这两篇文章仔细研读并且跟踪代码还是相当费时间的。但是跟踪过以后,慢慢能力就培养出来了,以后也容易跟踪其他链过程,比如跟踪JAVA那几个链。
Android so 加载原理分析_android shared library already opened-CSDN博客
篇文章我们简单了解到了静态注册。没错,简单理解就是不重写jni_onload的都是静态注册,重写jni_onload的都是动态注册。
之前对JNI不熟悉或者有什么遗漏的地方可以详细的看看这份文章系列,总共5份。虽然比较难懂,但是多看几遍,认真学习,还是能有非常大的收获。
Android JNI(一)——NDK与JNI基础 - 简书
又找到一个新的资源:
这几个写着是看似简单,实际我也被这个折磨了不少时间。
安装idea,这个只需要是安装idea的社区版就行了,不需要安装商业版
下载idea的版本使用communiyt就可以,这个也有个玄学的事情。idea不能版本过低,会出现点问题。直接说我用的吧是
unidbg 启动
这个直接运行会提示JDK的问题,在Oracle官方里面可以下载JDK17,在idea里面直接配置就好了,这样就不用在kali里面配置了。
直接运行以后,结果如下所示。