APatch kpm模块开发

转载至APatch kpm模块开发 | 拓森

什么是KernelPatch Module (KPM)

KPM是一个ELF文件,可以通过KernelPatch在内核空间中加载和运行

官方文档与代码案例

官方提供了3个案例:
1.hello world
2.inline-hook
3.syscallhook

Hello

JavaScript

inline hook

JavaScript

JavaScript
定义一个测试函数:__noinline add
__noinline 避免被内联优化, 方便hook
执行hook

JavaScript

syscall hook

JavaScript
初始化

JavaScript
如果参数是function_pointer_hook, 使用fp_hook_syscalln来hook系统函数, hook了openat
如果是inline_hook, 则使用inline_hook_syscalln来hook系统函数

JavaScript
通过syscall_argn来获取参数值

JavaScript

实际案例分析

模块作用:redirect /system/etc/hosts to /data/adb/hosts

JavaScript
这个模块主要是hook VFS层do_sys_open, do_sys_open是open/openat的一个实现. VFS层是比syscal 更底层的实现
notion image

具体代码分析

JavaScript

声明do_filp_open函数指针

JavaScript

inline_hook_control0函数是设置文件编号, 假设是2

char hosts_target[] = “/data/adb/hosts/0”;
变成:
char hosts_target[] = “/data/adb/hosts/2”;

JavaScript

查找并保存几个重要的内核函数地址

JavaScript

hook do_filp_open

JavaScript

do_filp_open_before的实现

获取参数filename指针, 再获取pathname , 判断绝对路径和相对路径
绝对路径判断相等, 则执行重定向和设置selinux allow = true, hook完成后会改回去false
相对路径则获取工作目录拼接成绝对路径, 再执行相同的逻辑

C

do_filp_open_after的实现

JavaScript

编译(Ubuntu)

官方编译指南: https://github.com/bmax121/KernelPatch/blob/main/doc/en/build.md

先下载交叉编译

下载 AArch64 bare-metal target (aarch64-none-elf)解压

设置环境变量

JavaScript

编译

JavaScript
完成!

KPM模块安装

此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注