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`.
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-
安装hello.kpm
adb push hello.kpm /storage/emulated/0/Download
# 查看内核日志 adb shell su dmesg | grep -i kp
理解KPM模块的基本信息
hello模块作为最简单的KPM示例,其中包含了KPM模块的基本框架内容。
该内容会显示在安装界面上
/* KPM 元信息 —— 用于标识模块身份 */ KPM_NAME("kpm-hello-demo"); /* 模块名称,必须唯一 */ KPM_VERSION("1.0.0"); /* 模块版本 */ KPM_LICENSE("GPL v2"); /* 许可证 */ KPM_AUTHOR("bmax121"); /* 作者 */ KPM_DESCRIPTION("KernelPatch Module Example"); /* 模块描述 */
init 加载触发
exit 卸载触发
control0 在界面上输入参数时候触发
获取了输入参数,并且调用compat_copy_to_user显示到用户
compat_copy_to_user
/* 注册 KPM 生命周期回调函数 */ KPM_INIT(hello_init); /* 注册初始化函数 */ KPM_CTL0(hello_control0); /* 注册控制命令 0 */ KPM_CTL1(hello_control1); /* 注册控制命令 1 */ KPM_EXIT(hello_exit); /* 注册退出函数 */
KernelPatch
关于这两部分,原文档说的特别清楚。我直接放给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
openat
read
hook_syscalln()
inline_hook_syscalln()
fp_hook_syscalln()
hook_wrapN()
hook()
syscall_argn(args, n)
hook_fargsN_t
argN
args->skip_origin = 1
udata
fargs->local
在反调试检测和环境伪装这一块,kpm能做到更底层的对抗。
抛砖引玉,我这里实战对抗一下libmsaoaidsec.so这个模块的frida检测。不用frida脚本的反检测代码而是通过kpm模块隐藏frida信息。代码整理中,先发试试能不能通过检测
抛砖引玉,我这里实战对抗一下libmsaoaidsec.so这个模块的frida检测。不用frida脚本的反检测代码而是通过kpm模块隐藏frida信息。
libmsaoaidsec.so
代码整理中,先发试试能不能通过检测
APatch部署及KPM实现InlineHook及SyscallHook技术APatch部署及KPM实现InlineHook及SyscallHook技术-先知社区
官方教程KernelPatch Modules(KPM) 使用指南 | APatch DocsKernelPatch/doc/zh-CN at main · bmax121/KernelPatch
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!