首页
社区
课程
招聘
[原创]Apatch KPM内核模块从编译入门到环境对抗跑路
发表于: 2天前 831

[原创]Apatch KPM内核模块从编译入门到环境对抗跑路

2天前
831

编译你的第一个KPM

> 重要提示,在做真机KPM模块开发测试之前请先备份你的boot.img用于救砖。

环境准备

  • ubuntu24.02

  • 下载编译工具

  • 然后是在这下载GNU tools ,建议使用aarch64-none-elf,我之前使用linux自带的aarch64-linux-gnu编译出来无法正常使用。994K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2S2M7X3#2Q4x3X3g2U0L8$3#2Q4x3V1k6V1L8%4N6F1L8r3!0S2k6s2y4Q4x3V1k6Q4x3X3c8Q4x3V1k6S2M7X3#2Q4x3X3c8Y4L8Y4g2Q4x3X3c8@1L8$3!0D9j5$3S2S2K9h3&6Q4x3X3c8V1L8%4N6F1L8r3!0S2k6s2y4Q4x3V1j5I4x3g2)9J5k6o6u0Q4x3X3b7J5x3o6t1J5i4K6u0V1x3o6t1`.

  • 实测这个地址下载的非常慢,建议直接复制链接用迅雷

# 1. 下载工具链
wget wget e6eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2S2M7X3#2Q4x3X3g2U0L8$3#2Q4x3V1k6Q4x3X3c8Q4x3V1k6E0k6h3c8A6j5g2)9J5c8V1k6A6L8r3g2K6i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8K6i4K6u0r3k6$3&6#2i4K6u0r3x3e0q4Q4x3X3f1J5i4K6u0V1x3U0l9J5x3W2)9J5k6e0l9J5i4K6u0r3j5X3W2F1M7X3g2D9i4K6u0r3k6$3y4U0i4K6u0V1j5i4u0E0i4K6u0V1x3e0q4Q4x3X3f1J5i4K6u0V1x3U0l9J5x3W2)9J5k6e0l9J5i4K6u0V1P5o6R3$3i4K6g2X3y4U0c8Q4x3X3c8S2j5i4u0U0K9o6j5@1i4K6u0V1L8X3!0F1k6g2)9J5k6r3g2D9k6W2)9J5k6i4c8S2M7W2)9J5k6i4S2*7

# 2. 解压(直接解压 .tar.xz 文件)
tar -xvf gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf.tar.xz

# 3. 移动到常用目录(可选,建议移动到 /usr/local/ 或 /opt/)
sudo mv gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf /opt/

# 4. 将 bin 目录添加到 PATH(临时生效)
export PATH=$PATH:/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf/bin

# 5. 验证是否安装成功
aarch64-none-elf-gcc --version

下载示例编译

下载工程,切换到示例hello工程

# 下载KernelPatch源码
git clone ba7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8h3q4^5x3e0t1I4i4K6u0r3d9$3g2J5L8X3g2D9f1r3q4@1j5$3R3`.
cd KernelPatch/kpms/demo-hello

# 设置临时环境变量
export PATH=/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-elf/bin:$PATH
export TARGET_COMPILE=aarch64-none-elf-
  • make 进行编译 输出文件 hello.kpm 和 hello.o

安装hello.kpm

  • 将文件推送到手机

adb push hello.kpm /storage/emulated/0/Download

  • 打开管理器选择文件安装


  • adb 验证模块加载成功信息


# 查看内核日志
adb shell
su
dmesg | grep -i kp

理解KPM模块的基本信息

hello模块作为最简单的KPM示例,其中包含了KPM模块的基本框架内容。

hello.c

  • 演示kpm模块的整个运行周期,并写下日志。

1.KPM标识部分

该内容会显示在安装界面上

/* KPM 元信息 —— 用于标识模块身份 */
KPM_NAME("kpm-hello-demo");       /* 模块名称,必须唯一 */
KPM_VERSION("1.0.0");             /* 模块版本 */
KPM_LICENSE("GPL v2");            /* 许可证 */
KPM_AUTHOR("bmax121");            /* 作者 */
KPM_DESCRIPTION("KernelPatch Module Example"); /* 模块描述 */

2.生命周期函数

  • init 加载触发


  • exit 卸载触发


  • control0 在界面上输入参数时候触发






获取了输入参数,并且调用compat_copy_to_user显示到用户

  • control1 用户态通过 kpctl 发送原始数据时调用触发。在界面上我没触发出来,应该是嵌入模块预设参数的时候触发(不太关注这个)

3.注册函数生效

/* 注册 KPM 生命周期回调函数 */

KPM_INIT(hello_init);      /* 注册初始化函数 */
KPM_CTL0(hello_control0);  /* 注册控制命令 0 */
KPM_CTL1(hello_control1);  /* 注册控制命令 1 */
KPM_EXIT(hello_exit);      /* 注册退出函数 */

makeflie文件

  • 模块的编译配置
  • 编译工程依赖于 KernelPatch 项目,必须指定KernelPatch目录。

基于kpm的inlineHook和SyscallHook

关于这两部分,原文档说的特别清楚。我直接放给AI总结一下

bc4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8h3q4^5x3e0t1I4i4K6u0r3d9$3g2J5L8X3g2D9f1r3q4@1j5$3S2Q4x3V1k6T1L8r3!0T1i4K6u0r3L8h3q4A6L8W2)9J5c8X3c8G2j5#2)9J5c8Y4A6Z5i4K6u0V1b7@1&6Q4x3V1k6A6L8X3I4A6L8X3g2Q4x3X3c8Z5L8$3!0C8i4K6u0W2L8h3b7`.
26bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8h3q4^5x3e0t1I4i4K6u0r3d9$3g2J5L8X3g2D9f1r3q4@1j5$3S2Q4x3V1k6T1L8r3!0T1i4K6u0r3L8h3q4A6L8W2)9J5c8X3c8G2j5#2)9J5c8Y4A6Z5i4K6u0V1b7@1&6Q4x3V1k6K6P5i4y4U0j5h3I4D9i4K6u0V1K9r3!0G2K9#2)9J5k6h3#2V1

核心概念对比

特性Syscall HookInline Hook
目标拦截系统调用(如 openatread拦截任意内核函数
底层实现基于 Inline Hook 框架,并自动处理内核差异(如有无 syscall wrapper)直接修改 ARM64 内核函数入口代码,实现跳转
主要APIhook_syscalln()(自动选择策略)  
inline_hook_syscalln()  
fp_hook_syscalln()
hook_wrapN()(推荐,支持链)  
hook()(简单替换)
参数访问必须使用专用宏:syscall_argn(args, n)直接通过 hook_fargsN_t 结构体的 argN 成员访问
回调类型基于统一的 hook_fargsN_t根据参数个数使用 hook_fargsN_t
跳过原函数设置 args->skip_origin = 1 并提供返回值设置 args->skip_origin = 1 并提供返回值
传递私有数据通过 udata 参数(用户数据指针)通过 udata 参数 或 fargs->local (在 before/after 间共享)



  • inlineHook可在运行时拦截并修改任意内核函数的行为。只能hook内核层无法针对App函数进行hook。
  • SyscallHook是基于inlineHook的针对系统调用的封装处理,底层依然是inlineHook。

实战你的第一个kpm模块

在反调试检测和环境伪装这一块,kpm能做到更底层的对抗。

抛砖引玉,我这里实战对抗一下libmsaoaidsec.so这个模块的frida检测。不用frida脚本的反检测代码而是通过kpm模块隐藏frida信息。


代码整理中,先发试试能不能通过检测

参考文档

APatch部署及KPM实现InlineHook及SyscallHook技术
APatch部署及KPM实现InlineHook及SyscallHook技术-先知社区

官方教程
KernelPatch Modules(KPM) 使用指南 | APatch Docs
KernelPatch/doc/zh-CN at main · bmax121/KernelPatch



传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2天前 被小黄鸭爱学习编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (1)
雪    币: 104
活跃值: (8407)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
tql
18小时前
0
游客
登录 | 注册 方可回帖
返回