图文精华

分享

无数次失败后的回归本源(浅析)仅仅只是开始

由于时间水平局限,此处仅仅为了方便大家交流,打个样,欢迎大家指正补充。
当然老师能够来个精华,就更开心了。
==========================================================================================================
工具环境: windwos10、IDA 三星 S8+
本文由来:由于水平有限,分析某手游tp反挂无果后,回归本源,从头来过。app应用 网上随便找的一个带so层的,然后开始分析,本文之后说到java层到native层的init_array。等后续本人完全分析理解后才知道怎么表达。==========================================================================================================        正文开始首先我通过之前的失败教训,总结出来了一些肤浅的原理,本文也主要就是讲这些原理,方便以后分析少走弯路。
Android的源码大家可以到http://androidxref.com/这里去下载。
我这里采用的是2016-12-22 - New Index: Nougat - 7.1.1_r6的源码
apk中要加载so我们一般都是用
System.loadLibrary("libname");  
System.load("lib_path");           
这两种的区别:
(1). System.load参数必须为so文件的绝对路径;
(2). System.loadLibrary参数为so文件名,不包含so文件的扩展名,必须是在JVM属性Java.library.path所指向的路径中,路径可以通过System.getProperty('java.library.path')来获得。
通过android的源码搜索找到loadLibrary的定义方法




我们就发现loadLibrary的加载顺序为:

再继续就通过native方法nativeLoad到native层了,后面就原来越好玩了



JVM_NativeLoad方法在jvm.h中申明的,找了半天才找到才找到在哪里实现的,后来发现有个小技巧一起分享了

通过这个搜索,选择全部项目,然后把方法名字输入Full Search里面,一搜索就出来了,我去,浪费我1个小时。
回来接着说实现在/art/runtime/openjdkjvm/的OpenjdkJvm.cc下

下面是JavaVMExt的LoadNativeLibrary方法,画重点了
这个方法比较长,我直接复制关键点出来,就不截图了。。。。发现还是截图方便点

通过dlopen函数来加载init_array,等等还没完,我们前面不是学过so加载的两种方式吗?别急接着代码往下看

sym = library->FindSymbol("JNI_OnLoad", nullptr);
在要加载so库中查找JNI_OnLoad方法,如果没有JNI_OnLoad就是是静态注册,返回true,代表so库加载成功,如果找到JNI_OnLoad就会调用JNI_OnLoad方法,JNI_OnLoad方法中一般存放的是方法注册的函数,所以如果采用动态注册就必须要实现JNI_OnLoad方法,否则调用java中申明的native方法时会抛出异常。
我们来看dlopen 加载init_array的流程。
又是一段漫长的搜索,还好知道怎么搜了。终于找到了
不想打字,直接看图

感觉越来越有感觉了。
接着来

终于找到了

最后总结个图,这个图是网上找的

就这样吧,看得懂就看,看不懂自己看android源码来回来看。说得不对的请大家指正。
这里就不在写JNI_OnLoad的实现和静态的了,下次再说,太累了。
最后这个能不能申请精华,能当然最好,不能就拉倒。
最后最后想吐槽下,这个图片不能改大小,而且也不能点击放大。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

已有(7)人评论

跳转到指定楼层
迁羽 发表于 2021-6-10 00:15:54
写的不错 ,进度可以啊,都学习到这里了
<
回复

使用道具 举报

睡梦中的仙人 发表于 2021-6-10 09:21:56
迁羽 发表于 2021-6-10 00:15
写的不错 ,进度可以啊,都学习到这里了

能搞个精华么,赚点学分
<
回复

使用道具 举报

听雨安卓逆向 发表于 2021-6-13 09:17:13
牛皮,这都不加精 没有天理了
<
回复

使用道具 举报

诗和远方丶 发表于 2021-6-18 14:10:43
厉害啊老哥
<
回复

使用道具 举报

杨阿杨阿阳 发表于 2021-6-20 18:04:52
整体流程很nice,不过提几个小建议。

点评

1、编辑器确实很难用,这个咱们也控制不了。  详情 回复 发表于 2021-6-20 18:05
<
回复

使用道具 举报

杨阿杨阿阳 发表于 2021-6-20 18:05:27
杨阿杨阿阳 发表于 2021-6-20 18:04
整体流程很nice,不过提几个小建议。

1、编辑器确实很难用,这个咱们也控制不了。

点评

2、标题不够吸引人, 我看完文章之后才明白这个文章是干嘛的。。。 java层加载so的两种方式,追溯源码的实现流程和关键函数。 这个很nice。 3、写的确实不错,直接戳人痛点,简单明了。  详情 回复 发表于 2021-6-20 18:06
<
回复

使用道具 举报

杨阿杨阿阳 发表于 2021-6-20 18:06:48
杨阿杨阿阳 发表于 2021-6-20 18:05
1、编辑器确实很难用,这个咱们也控制不了。

2、标题不够吸引人,  我看完文章之后才明白这个文章是干嘛的。。。     java层加载so的两种方式,追溯源码的实现流程和关键函数。    这个很nice。

3、写的确实不错,直接戳人痛点,简单明了。   
<
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则