首页
社区
课程
招聘
[原创]Art 模式实现XposedNativeHook兼容Android10
发表于: 2019-5-5 10:31 18473

[原创]Art 模式实现XposedNativeHook兼容Android10

2019-5-5 10:31
18473

前言:

现在 市面上的 Hook 框架有很多 ,Xposed,Frida,YAHAK 等 

Frida 是目前最火的 ,跨平台注入 框架 ,支持 java和 Naive 层

安卓 目前 沙盒注入 方式 应该 就 两种Ptrace 和 Zygote

各有各的优点和短板  曾经Hook之王 Xposed 在 Native层显得比较无力

也就导致 市场上很多 模块都 不能 进行Native层的 Hook 

一直在想着 能不能 试着 完善一下。

如何利用xposed Hook Native层 函数 - 简书

在之前这篇帖子里  简单实现了 Xposed 在 4.4的 版本的 NativeHook 

主要 原理就是 在加载 被Hook So的 时候 利用Xposed拦截 

在 java层 调用System.load函数 把Xposed 模块里面的so进行 加载注入  

在so里面 直接调用 dlopen拿到 被Hook So地址 即可

在高版本里面 是不允许直接 System.load 的 认为是 不安全的 




大概意思就是说 直接 System.load 容易被串改 在高版本会失效 应该使用 System.loadLib

这个函数是加载 app内部 Lib下So的函数   但最终 都会调用 doLoad函数 (具体 可以参考对应源码 )我们就从 这个函数入手

Xposed 先挂钩 作为 So名字 作为 条件过滤依据 



这块 有个问题 就是 怎么把 Xposed模块里面的 So注入到 目标 进程中  

在 4.4 版本的时候 可以 直接 System.load 打开即可 然后进行 装载和链接

这个 问题 我想了很长时间 有两种 可行方案 


第一种方案 :可以吧 模块里的 so 利用shell权限 进行 copy 直接 拷贝到 被 Hook的 lib下面 

然后 System.loadLib 去加载即可 因为 因为shell需要 root 会导致 被 Hook 进程 申请 Root权限才可以 

(比如 Hook A app 因为 Xposed 走的是 A所在的进程  所以如果 在 代码里申请 Root 最终 会提示A app 申请 Root)

进行操作 不方便 和 不实用 

第二种方案:直接利用反射 调用 doLoad  函数 进行 So的 加载  如图







第一个 参数 是 So的 路径 第二个参数 Classloader 其实他是一个 PathClassloader

如果 发现 加载的 So 是被Hook的 So 便进行 注入 把第二个 参数 传入 进去 反射备用



这块的 Path是 绝对路径  有人会问 为什么要这么写    

我在Hook 这个 函数的时候  把参数 1 打印了一下 可以看到 加载的 是 So的绝对路径

(这块 楼主 也有一件事 不太懂 为什么 路径 要加个 -1 很奇怪 算了 照葫芦画瓢  先这么写 )


这里科普一下 /data/data/ 下面 都是 App的数据 而/data/App/下面放的是 app 包 

然后吧 路径 改成自己Xposed模块里的 So 进行  注入 成功!

这块有个调用时机 问题 一定要在 目标 So加载完毕 以后 在进行 注入 

因为后期需要 实现 突破 7.0  dlopen 限制  需要遍历 内存对应的Map文件 

下来 开始 在 Xposed模块的 so得 JNI_OnLoad 进行  挂钩 Hook 楼主用的是 InlineHook



在 4.4 版本 以前 可以 直接 dlopen直接打开 任意目录的 So 进制 装载和链接 

在 4.4的 时候 直接打开 被Hook的 so即可 

在高版本 因为 权限问题 不能 直接打开 


楼上图片参考 地址 https://www.cnblogs.com/eniac1946/p/7515557.html


突破 dlopen 限制 楼主 用的是  感谢大佬提供的 轮子 


GitHub - lizhangqu/dlfcn_compat: 兼容Android 7.0 dlfcn(dlopen、dlsym、dlclose、dlerror)


主要是遍历 Map文件 拿到so的 地址 和 dlopen的 Hook

(具体可参考 项目的 reademe)



下面 我们看看 内存里的 文件对应内容 楼主用的是 7.1的 安卓  系统 

利用GG修改器 导出内存  看看 对应 文件的 地址的映射 和 路径 



有人 会问 这个 怎么导出的? 

内存 管理页面 点导出 内存 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-22 11:54 被珍惜Any编辑 ,原因: 兼容Android 10
收藏
免费 4
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2019/05/07 感谢分享~
最新回复 (25)
雪    币: 19
活跃值: (331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排顶帖
2019-5-5 10:46
0
雪    币: 1014
活跃值: (582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
牛逼
2019-5-5 10:49
0
雪    币: 233
活跃值: (370)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
牛逼
2019-5-5 12:13
0
雪    币: 184
活跃值: (300)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
牛逼  牛逼
2019-5-5 12:42
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
nb
2019-5-5 13:31
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在高版本里面 是不允许直接 System.load ?安卓哪个版本开始的?记得安卓8.0是可以用的。(art安卓5.0是绝对可以用的)
最后于 2019-5-5 14:53 被tDasm编辑 ,原因:
2019-5-5 14:50
0
雪    币: 2719
活跃值: (1595)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
好文章了   
2019-5-5 14:53
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
9
tDasm 在高版本里面 是不允许直接 System.load ?安卓哪个版本开始的?记得安卓8.0是可以用的。(art安卓5.0是绝对可以用的)
这个我没详细研究过 具体得看 谷歌官方的 api了  可以用但是 我在 4.4 是还好用的 7.1 就  失效 了 没有走 on_load了
2019-5-5 15:23
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
牛逼
2019-5-5 16:21
0
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
珍惜Any 这个我没详细研究过 具体得看 谷歌官方的 api了 可以用但是 我在 4.4 是还好用的 7.1 就 失效 了 没有走 on_load了
7.0 7.1不行 其他可以
2019-5-5 18:49
0
雪    币: 1
活跃值: (137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢楼主dlfcn_compat我一直搞不明白高版本dlopen失败原因。xposed我是hook attach进行注入,然后调用System.load("/data/data/packagename/lib/xxx.so")就不用那么麻烦的去找app安装路径了。
2019-5-6 00:58
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
-1 -2 是第几次安装app
2019-5-6 06:09
0
雪    币: 2359
活跃值: (288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
前排学习
2019-5-6 09:20
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
15
无边 -1 -2 是第几次安装app
学习了
2019-5-6 15:01
0
雪    币: 729
活跃值: (1306)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
16
牛逼
2019-5-6 16:24
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
支持
2019-5-7 00:07
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
无边 -1 -2 是第几次安装app
好像封顶就是 2 
2019-5-7 00:10
0
雪    币: 263
活跃值: (444)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
学习
2019-5-7 15:57
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
20
顶一下
2019-5-10 09:34
0
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
注入没必要这么复杂
2019-5-11 09:44
0
雪    币: 12
活跃值: (1075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
这个所谓的限制应该是 Android O 的 Treble 里面引入的  linker namespace 吧,如果你只是想加载任意目录的 so,直接用 linker 的内部方法就可以了,没必要这么搞。
2019-5-11 11:42
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢感谢!!
2019-12-27 17:42
0
雪    币: 3368
活跃值: (14038)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
24
兼容Android 10
2020-9-22 11:55
0
雪    币: 348
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
25
android10貌似不行
2020-10-19 16:53
0
游客
登录 | 注册 方可回帖
返回
//