发布于: 2024-10-28最后更新: 2025-2-12字数 2765阅读时长≈ 7 分钟

什么是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 更底层的实现
notion image

具体代码分析

声明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模块安装


Loading...
公告
 
花有重开日, 人无再少年~