首页
社区
课程
招聘
[原创]二.Android ELF系列:实现一个so文件加载器
发表于: 2019-2-22 19:28 6938

[原创]二.Android ELF系列:实现一个so文件加载器

2019-2-22 19:28
6938

项目我已经上传到附件里面,先下载对照着看比较好理解.
对于gradle由于不同版本可能在不同的sdk中会存在不同,可能会导致编译失败.解决方法就是

新建一个NDK项目.复制所有cpp目录下的源文件放到新项目下的cpp文件夹.
复制libs下的所有文件.修改app目录下的build.gradle目录添加如下配置

即可.

这个加载器我是直接通过下载Android 4.4系统源码把里面的linker源码抽取出来放到一个新建的ndk项目里面的.

里面的代码没有作任何修改.只是简单的把一些不能跑起来的代码给注释掉了.和增加一些函数.

先上自己写的一个加载so文件的入口函数:

注意到其中有两个变量sostart和soend这两个变量.在linker用于记录已经加载的so文件.所以我们需要把它们给获取到.

还有在调用do_dlopen完成时会调用一个保护函数设置soinfo的内存区域为只读.由于我们加载so文件时对应的soinfo信息的引用(soinfo.ref_count)会加1,所以会涉及到写入的操作.

这个内存区域的信息是通过全局变量gSoInfoPools获取的,所以这个变量我们也需要把其获取到.

gSoInfoPools 的结构为

那么怎么获取那,通过结构可以知道next的下一个结构是soinfo数组.通过分析可以发现somain模块就是在soinfo数组的第0个元素.那么我们通过somain的soinfo信息地址-4就是soinfo_pool_t* next;而且该数组的最后一个元素又指向下一个soinfo_pool_t的soinfo数组的第0个元素.

到这里我们就可以正常调用自己的do_dlopen加载so文件了.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 5
支持
分享
最新回复 (2)
雪    币: 4392
活跃值: (881)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个运行在android4.4的模拟器上运行不起来
2019-6-6 09:31
0
雪    币: 217
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大神,0x100a8 这个是怎么来的
2020-4-10 14:29
0
游客
登录 | 注册 方可回帖
返回
//