Android arm64 内核 Hook 实验项目,来自KernelPatch,包含:
- 内核模块
hook_module.ko - 自定义 text/data patch 后端
- inline hook / inline wrap
- function pointer hook / function pointer wrap
- 设备端 Rust loader,用于解析 ELF、补未定义符号并调用
init_module
lkm.c模块主入口、自测逻辑、vfs_opendemo hookhook_chain.cinline hook / inline wrap 主实现fp_hook.cfunction pointer hook / wrap 主实现hotpatch.ctext/data patch 后端hmem.chook 内存池与生命周期管理loader/Rust 编写的模块加载器
默认使用仓库内的 build_module.sh:
bash build_module.sh输出:
hook_module.ko
主机侧检查:
cd loader
cargo check构建 Android arm64 版本:
cd loader
cargo build --target aarch64-linux-android --release当前仓库默认使用的 NDK 路径写在:
cd loader
cargo run -- --adb-run \
--device-loader target/aarch64-linux-android/release/hook-loader \
--name hook_module \
../hook_module.ko \
enable_selftests=0 enable_vfs_demo=1 \
enable_inline_selftests=0 enable_fp_selftests=0 enable_syscall_selftests=0说明:
- 主机只负责
adb push和远程执行 - 设备端
hook-loader负责:- 读取
.ko - 解析 ELF
- 从
/proc/kallsyms补未定义符号 - 调用
init_module - 失败时抓相关
dmesg
- 读取
adb push loader/target/aarch64-linux-android/release/hook-loader /data/local/tmp/hook_loader/hook-loader
adb push hook_module.ko /data/local/tmp/hook_loader/hook_module.ko
adb shell "su -c 'chmod 755 /data/local/tmp/hook_loader/hook-loader && \
/data/local/tmp/hook_loader/hook-loader \
--name hook_module \
/data/local/tmp/hook_loader/hook_module.ko \
enable_selftests=0 enable_vfs_demo=1 \
enable_inline_selftests=0 enable_fp_selftests=0 enable_syscall_selftests=0'"lkm.c 目前支持以下参数:
enable_selftests加载时运行本地自测,当前默认0enable_inline_selftests是否运行 inline hook / inline wrap 自测,当前默认0enable_fp_selftests是否运行 fp hook / fp wrap 自测,当前默认0enable_syscall_selftests是否运行sys_openat/sys_openat2的 syscall table fp hook / fp wrap 自测,当前默认0enable_vfs_demo是否安装vfs_opendemo hook,当前默认1
KCFI bypass 目前在模块初始化时直接执行 bypass_kcfi(),不是模块参数开关。
在当前测试设备上已验证通过:
- 设备端 Rust loader 可正常加载模块
- 参数传递正常
- 默认功能测试仅启用真实
vfs_opendemo hook fp_hookfp_hook_wrapinline hookinline wrapenable_vfs_demo=1时真实vfs_openhookrmmod hook_module可正常卸载,卸载后未触发force restore兜底hotpatch已从全量flush_icache_all()改为按 patch 范围做 I-cache 同步
enable_selftests=1 enable_inline_selftests=0 enable_fp_selftests=1 enable_syscall_selftests=0 enable_vfs_demo=0
enable_selftests=1 enable_inline_selftests=0 enable_fp_selftests=0 enable_syscall_selftests=1 enable_vfs_demo=0
enable_selftests=1 enable_inline_selftests=1 enable_fp_selftests=1 enable_syscall_selftests=1 enable_vfs_demo=0
enable_selftests=0 enable_inline_selftests=0 enable_fp_selftests=0 enable_syscall_selftests=0 enable_vfs_demo=1
- 当前模块仍依赖设备端 loader 的“补符号后
init_module”方式加载 - 还没有收敛到“标准
insmod无补符号直接加载”的状态 - 构建输出中仍有不少 modpost unresolved symbol 警告,需要后续继续处理