什么是KernelPatch Module (KPM)
KPM是一个ELF文件,可以通过KernelPatch在内核空间中加载和运行
官方文档与代码案例
官方提供了3个案例:
1.hello world
2.inline-hook
3.syscallhook
Hello
inline hook
定义一个测试函数:__noinline add
__noinline 避免被内联优化, 方便hook
执行hook
syscall hook
初始化
如果参数是function_pointer_hook, 使用fp_hook_syscalln来hook系统函数, hook了openat
如果是inline_hook, 则使用inline_hook_syscalln来hook系统函数
通过syscall_argn来获取参数值
实际案例分析
模块作用:redirect /system/etc/hosts to /data/adb/hosts
这个模块主要是hook VFS层do_sys_open, do_sys_open是open/openat的一个实现. VFS层是比syscal 更底层的实现

具体代码分析
声明do_filp_open函数指针
inline_hook_control0函数是设置文件编号, 假设是2
char hosts_target[] = "/data/adb/hosts/0";
变成:
char hosts_target[] = "/data/adb/hosts/2";
查找并保存几个重要的内核函数地址
hook do_filp_open
do_filp_open_before的实现
获取参数filename指针, 再获取pathname , 判断绝对路径和相对路径
绝对路径判断相等, 则执行重定向和设置selinux allow = true, hook完成后会改回去false
相对路径则获取工作目录拼接成绝对路径, 再执行相同的逻辑
do_filp_open_after的实现
编译(Ubuntu)
官方编译指南: https://github.com/bmax121/KernelPatch/blob/main/doc/en/build.md
先下载交叉编译
下载 AArch64 bare-metal target (aarch64-none-elf)解压
设置环境变量
编译
完成!
KPM模块安装
- 作者:拓森Leo
- 链接:https://www.uzilol.cn/article/12dbf20f-1d11-802a-8cad-cf296b4a0950
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



