KernelPatch Module (KPM)
约 1482 字大约 5 分钟
2025-12-23
FolkPatch 基于 APatch 二次开发,APatch 依赖于 KernelPatch,继承了其全部功能并进行了扩展。因此,FolkPatch 也支持使用 KernelPatch Modules (KPM)。下面是关于 KPM 的使用说明。
什么是 KPM?
KPM 是一种运行在内核空间内的模块,可以让代码直接运行在内核空间中,类似于 Loadable Kernel Modules (LKM),但通过 KernelPatch 的 SuperCall 机制加载。
KPM 为 ELF 格式文件,使用 aarch64-none-elf- 工具链构建,通过 sc_kpm_load() SuperCall 加载到内核中。每个 KPM 声明 KPM_NAME、KPM_VERSION 等元信息,并实现 KPM_INIT、KPM_CTL0、KPM_CTL1、KPM_EXIT 等生命周期回调。
KPM 可以使用 KernelPatch 提供的 inline hook(hook、hook_wrap)和 syscall hook(hook_syscalln、fp_hook_syscalln)能力,以及通过 kallsyms_lookup_name() 访问内核符号。
通过 KPM,你可以实现一些 APM 不能实现的功能,例如:
- 分区镜像保护(格机拦截)
- 内核级隐藏
- 系统调用监控和修改
- 内核函数 Hook
如何安装 KPM?
KPM 有三种安装方式:嵌入、加载和安装。
关于"安装"
目前,FolkPatch 并没有实现 KPM 的"安装"操作,因其上游 APatch 并没有实现。因此现阶段 FolkPatch 的 KPM 只能通过"嵌入"和"加载"两种方式使用。KernelPatch 和 APatch 的开发者正在努力实现相关功能,请耐心等待。
嵌入
嵌入是指将 KPM 直接嵌入至 kernel。此模式下安装的 KPM 会同 kernel 一起被合并进 boot.img 中,在 pre-kernel-init 阶段加载。
KPM 的嵌入可以在首次使用 FolkPatch 管理器修补 boot.img 时或者在完成 FolkPatch 安装后进行。你也可以使用 kptools 手动嵌入。
首次修补时嵌入
按照安装指南中的自动修补流程进行修补,在设置 SuperKey 之后不要立即执行下一步操作。
点击"嵌入模块"按钮,之后选择你要嵌入的 KPM 文件(后缀名为
.kpm)。确认要嵌入的 KPM 是你想要使用的 KPM。
完成剩余的"自动修补"流程即可。
安装 FolkPatch 后嵌入
在 FolkPatch 安装后,嵌入 KPM 的方式和安装 APM 的方式大致相同。你可以在"内核模块"界面点击右下角的按钮,选择"嵌入",之后的步骤可以参考首次修补时嵌入进行。
注意
嵌入的 KPM 在重新修补 boot.img 前不会更新。如果需要更新嵌入的 KPM,需要重新执行修补流程。
加载
加载是指将 KPM 立即交给内核进行加载。通过这种方式加载的 KPM 会立即生效,但会在下次重新启动后消失(非持久化)。
加载 KPM 的方式和安装 APM 的方式大致相同,唯一一点区别在于 KPM 在加载后无需重启。
安装
注意
目前 KernelPatch 和 FolkPatch 还未实现 KPM 的安装,以下的描述仅为对安装 KPM 的预期行为描述。
安装是指将 KPM 作为一个类似于 APM 的模块文件安装至 /data/adb/kpmodules 或类似目录。通过这种方式安装的 KPM 可以在特定的 event 进行加载。
自动加载
FolkPatch 提供了 KPM 自动加载功能,允许在系统启动时自动加载指定的 KPM 至内核中。
KPM 存储目录为 /data/adb/fp/kpms/,自动加载的 KPM 放置在 /data/adb/fp/kpms/autoload/ 目录下,配置文件为 /data/adb/fp/kpms/kpm_autoload_config.json。
/data/adb/fp/kpms# KPM 存储目录
autoload# 自动加载目录
example.kpm# KPM 模块文件
kpm_autoload_config.json# 自动加载配置文件
FolkPatch 提供两种配置方式:
- 可视化配置:通过界面添加 KPM 文件,编辑参数和加载阶段
- JSON 配置:直接编辑 JSON 配置文件
其余行为与加载保持一致。
加载阶段
每个 KPM 可以选择在以下两个阶段之一加载:
| 阶段 | 说明 |
|---|---|
service(默认) | 系统服务阶段加载,SELinux 策略已应用,模块挂载已完成 |
post-fs-data | 早期启动阶段加载,在 SELinux 策略注入和模块挂载之前执行 |
大部分场景使用默认的 service 阶段即可。仅在需要在早期启动阶段介入内核行为时选择 post-fs-data。
参数传递
每个 KPM 可配置启动时传递的参数字符串。参数通过内核 SuperCall 直接传递给 KPM 的初始化函数。
在可视化模式下,点击 KPM 条目的编辑按钮即可设置参数;在 JSON 模式下通过 args 字段填写。
安全模式
当设备进入安全模式时,自动加载功能会被自动禁用,所有已配置的 KPM 均不会加载。这可以防止因 KPM 异常导致的启动问题。
配置文件格式
{
"enabled": true,
"kpmEntries": [
{
"path": "/data/adb/fp/kpms/autoload/example.kpm",
"event": "service",
"args": ""
}
]
}enabledRequiredboolean
是否启用自动加载
pathRequiredstring
KPM 文件路径(必须在 /data/adb/fp/kpms/autoload/ 目录下)
eventOptionalstring
service
加载阶段:service 或 post-fs-data
argsOptionalstring
传递给 KPM 的参数字符串,默认为空
注意
最多支持配置 64 个 KPM 自动加载条目。KPM 文件必须位于 /data/adb/fp/kpms/autoload/ 目录下,否则加载会被拒绝。
版权所有
版权归属:APatch Document
本文转载自:https://apatch.dev/zh_CN/kpm-usage-guide.html(在新窗口打开)
许可证:Attribution-ShareAlike 4.0 International
