内核驱动模式——不注入目标进程也能读写内存
一句话说清
普通模式下 Frida 把 JS 引擎注入到目标应用进程内。内核驱动模式下不注入目标进程——而是克隆一个独立的观察者进程跑脚本,通过 JsHook 激活时部署的 .ko 内核驱动模块直接读写字节码内存。
工作原理对比
普通 fridamod 模式:
┌──────────────────────────────┐
│ 目标应用进程 │
│ ├─ App 原始代码 │
│ └─ Frida JS 引擎 ← 你的脚本 │ ← 在目标进程内
└──────────────────────────────┘
内核驱动模式:
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ 目标应用进程 │ │ 观察者进程(JsHook 克隆) │
│ └─ App 原始代码 │ │ └─ Frida JS 引擎 ← 你的脚本 │
└──────────────────────────────┘ └──────────────┬───────────────┘
↑ 读写内存 ↑ │
│ │ │
┌───────┴──────────────────────┴─────────────────────┴───────────────┐
│ JsHook 内核驱动 .ko 模块 │
│ 提供 getModuleBase / readDword / writeDword 等 API │
└───────────────────────────────────────────────────────────────────┘
优势
| 方面 | 说明 |
|---|---|
| 更难被反作弊检测 | 目标进程内没有注入痕迹 |
| 不影响目标应用稳定性 | 观察者进程崩溃不影响目标应用 |
| 读写任意内存 | 内核驱动可以读写目标进程的任意地址 |
启用前提
- JsHook 已激活(激活时自动匹配并加载内核版本对应的
.ko驱动模块) - 目标应用的框架选 fridamod(内核模式是 fridamod 专属)
- 在目标应用的 Hook 配置里打开 内核模式 开关
- 目标应用正在运行
启用步骤
- 打开 JsHook
- 进 应用 → 选目标应用
- 选框架为 fridamod
- 勾选脚本
- 打开内核模式开关
- 开 Hook 服务
- 重启目标应用
脚本里判断运行环境
脚本可能在普通模式和内核模式下跑同一套逻辑,用 runtime.isKernel 判断:
if (runtime.isKernel) {
// 内核模式:用 kernel API
var base = kernel.getModuleBase('libil2cpp.so');
} else {
// 普通模式:用 Frida API
var base = Module.findBaseAddress('libil2cpp.so');
}
局限性
内核模式下观察者进程和目标进程物理隔离,以下功能不可用:
- Java 层 Hook(
Java.use()、Java.perform()) - 函数拦截(
Interceptor.attach()、Interceptor.replace()) view.*视图操作app.*应用上下文相关- 部分
http.*、toast()等依赖守护进程 Binder 的接口
可用/不可用 API 完整清单见 内核模式可用/不可用 API。