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

前言:

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

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

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

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

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

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

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

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

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

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

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

981b942fb77bc73c7d4ce05563d2324f.png

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

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

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

d7e876855151338de778c39af4036ef5.png

这块 有个问题 就是 怎么把 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的 加载  如图

375a02c8ca3f6bd8d53524dba07ccb25.png

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

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

df9d44575d71492bca5ad24d197cef16.png

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

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

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

7f07cb591f88bdbb0ada03659797e89e.png

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

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

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

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

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

abcc19d177b09ae7e127bec4d8fe1f37.png

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

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

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

f58c2a7a7735c4ec45ea9cbf3b41bef2.png

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

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

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

(具体可参考 项目的 reademe)

adb0a2d5bf945f522ca3dce03e038eb7.png

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

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

35cd2bbab6c317d8e025fd7daaa6b081.png

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

内存 管理页面 点导出 内存

0c4c0a692e1cddea3a52ada3c9f4c2cf.png

结束地址 随便 输入

7ae983652861dc2e11ce49a727b34c23.png

保存即可

(GG修改器 是个 神器 ,可以 用来 dex脱壳  So 还原 ,Dll提取等 直接操作内存  感兴趣可以 学学  )

将路径 改为 绝对路径

5d8755d3710696dcb412ff1a31a73bbc.png

直接 dlopen打开

拿到 句柄 以后 直接进行 用dlsym 拿到 对应函数地址 用 InlineHook 进行 挂钩

还是以loadbuffer函数 为 目标 函数 dump lua文件

1a49a6f5d0f416c1e18e8b21a2c5d739.png

在 my_luaL_loadbuffer 进行保存

a3df72e45bf67c6122eef2d7d324fab8.png

保存成功

d8cd970782c80ba11c54ccd14f1693f6.png

上面的 只是一个 demo 一个Hook的 模板

Xposed 模块 可以用 这种方式 进行 so层的 Hook和 注入

具体代码 上传到

-------------------------------------------

2020年9月21日18:36:08

在之前版本里面是通过调用doLoad函数进行反射加载模块So文件8.0还可以

但是在9.0,10.0发现不可行。去源码里面搜索在Runtime.java里面已经没有这个方法

找到了一个替换方法nativeLoad 参数类型也一样

c75e704cbb50c93a86fc836a509cec3e.png

兼容了一下在Android 10里面也可以支持这种

在获取模块So文件路径的时候在高版本里面

/data/app下面会有一个随机字符串,每次安装都会变所以写死路径不可以//data/app/com.lyh.nkddemo-YuNFiNvInJyE3ahHYBXAQw==/base.apk

大概长这样

17eaaef7d5532daa1b65b4ddb1a04313.png

我在模块里面获取安装的app路径,然后将后面的base.apk换成/lib/arm/模块so

即可解决

增加了开源库 dlfc 寻找So指定格式,只需要传入一个需要的 包名|So名字

a1b91abaff6c25818638231ab051066f.png

在安卓10 data/app下面的包名都是这种加密的。

想要定位很难,在遍历Map文件的时候字符串分割,两个都满足就认为是匹配项

3e194702abb1da605a35b3c24359a822.png

代码也很简单。在兼容原来逻辑 加个判断。

这块有个很坑的地方 就是fgets函数 读取文件每一行的时候会加个回车

直接打开是打不开的 。

当时对比发现都一样卡了很久,直到打印字符串长度的时候才发现多一位字符串

代码上传了有需求可以down 下来看看 ,根据自己需求改改。有啥问题也可以帖子下面留言。

最后于 2020-9-22 11:54

被珍惜Any编辑

,原因: 兼容Android 10

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Virtual Cam是一款基于Xposed框架的应用程序。Xposed框架是一种Android平台的开源软件,它允许在不修改系统的情况下对应用程序和系统进行定制和修改。Android Virtual Cam利用Xposed框架的强大功能,使用户能够在Android设备上添加虚拟摄像头。 使用Android Virtual Cam,用户可以模拟多个虚拟摄像头,并将它们用于各种视频应用程序。通过虚拟摄像头,用户可以同时在多个视频应用程序中使用设备的摄像头。这对于需要同时进行多个视频通话或者使用多个视频应用程序的用户来说非常方便。 Android Virtual Cam不仅通过虚拟摄像头功能,还提供了其他实用的功能。例如,用户可以自定义虚拟摄像头的属性和特征,如分辨率、帧率和图像效果等。这样,用户可以根据需要调整虚拟摄像头的设置,以获得最佳的拍摄效果。 此外,Android Virtual Cam还支持将其他设备的摄像头映射到Android设备上。这样,用户可以在Android设备上使用其他设备的摄像头,而无需将它们物理连接到Android设备上。这对于需要使用其他设备的摄像头进行拍摄和录制的用户来说非常方便。 总的来说,Android Virtual Cam借助Xposed框架的强大功能,为用户提供了一种便捷的方式来管理和使用虚拟摄像头。它不仅可以模拟多个虚拟摄像头,还支持自定义设置和映射其他设备的摄像头。这使得用户可以更加方便地进行多种视频应用程序的操作和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值