运行时加载 KPM — 立即生效、重启消失
加载 vs 嵌入
KPM 有两种常用的加载方式:
| 方式 | 持久性 | 适用场景 |
|---|---|---|
| 嵌入 | 永久(和 boot.img 绑定) | 确定要长期使用的 KPM |
| 加载 | 临时(重启后消失) | 测试 KPM、临时需要、不想重新修补 boot |
加载模式的核心特点就是"立即生效、重启消失"——管理器里点一下加载,KPM 立刻被内核加载并运行,当前会话(本次开机)期间有效,重启后就没了。
加载操作步骤
- 打开 APatch 管理器
- 进入"内核模块"页面
- 点击右下角浮动按钮
- 选择"加载"(不是"嵌入")
- 在文件选择器里找到
.kpm文件 - 确认加载
管理器会把 KPM 文件交给内核(通过 SuperCall),KernelPatch 内核框架完成符号解析和重定位,然后执行 KPM 的 init 函数。
加载后会发生什么
- KPM 的 init 函数在内核空间执行(Ring 0)
- 里面注册的 hook 立刻生效(inline-hook、syscall-hook)
- KPM 的任何副作用(修改内核数据结构、注册新的进程)都会立即可见
- 直到设备重启,KPM 才会被 KernelPatch 卸载
适合什么场景
- 临时测试新写的 KPM:写完一个 KPM,用加载模式快速验证逻辑对不对,不用重新修补 boot.img
- 短期需要某个 KPM 但不想永久嵌入:比如跑一个内核级反检测 KPM,用完就卸
- 排查 bootloop 问题:怀疑某个嵌入式 KPM 有问题,可以先试试加载模式能不能复现
加载失败怎么办
加载时报错可能的原因:
- 符号不匹配:KPM 引用了当前内核不存在的符号(比如内核版本太老或太新)
- KPM 本身有 bug:init 函数里写错了,直接触发内核 panic
- KernelPatch 版本太低:需要更新 KernelPatch 框架再加载
关于"安装"模式
KernelPatch 和 APatch 还规划了第三种 KPM 安装方式叫"安装"——把 KPM 持久化存储到 /data/adb/kpmodules/,但目前尚未完全实现。现阶段 KPM 只有嵌入和加载两种可用方式。