看了网上很多关于 arm64 无痕 hook 的方法,然后自己理解下加上 ai 帮忙
整理并开源了一个自己在用的 Linux / Android arm64 跨进程 hook 框架:sukinject
### 它是什么
sukinject 做的是跨进程、内核辅助的 hook,不是同进程 inline hook。
公开语义很简单:
```text
target -> replacement -> origin
```
- target:目标进程里的函数地址
- replacement:也在目标进程地址空间里的代码(内核生成的 ABI wrapper / 已有 VA / agent 装进去的代码)
- origin:目标进程里可回调原函数的 trampoline(ghost 页入口)
调用方进程里的普通 C 函数指针,不能直接当 replacement——地址空间隔离决定了这一点。
和 Dobby 那类同进程 inline hook 是不同模型,不追求 Dobby 兼容。需要同进程改字节插跳的,继续用 Dobby 即可。
### 技术路线(简要)
依赖 root + 匹配内核的 kmod(/proc/sukinject)。
大致思路:
1. 目标代码页通过 PTE 翻转 UXN,执行会 instruction fault
2. kprobe 挂在 fault 路径上,把 PC 重定向到 ghost / 重编译页
3. 原始页字节尽量不改;执行走 shadow,读路径仍可对准原页(隐蔽性谱系更接近 wxshadow / 整页 DBI 那条线,而不是改 .text 插 B)
能力边界也说清楚:
- 主线 AArch64;compat32 会 fail closed
- 需要自己能加载 suk_step4.ko(内核版本/树要对上)
- 不是完整动态链接器,也不是「任意 C++ / TLS / 完整 so 语义」运行时
- agent 路径支持受限 ELF / package 装进目标再绑入口,不是 ptrace+dlopen 主线
### 2. 四条 hook 路径
┌───┬────────────────────────────┬───────────┬──────────────────────────────────────────────────────┬────────────────────────────────┐
│ # │ 路径 │ kmod 命令 │ 核心做法 │ 代价/限制 │
├───┼────────────────────────────┼───────────┼──────────────────────────────────────────────────────┼────────────────────────────────┤
│ 1 │ DBI 整页重编译(默认主线) │ dbi-hook │ UXN + fault 改 PC → ghost 重编译页;原页字节尽量不动 │ 复杂页/热页可能踩坑;有 origin │
├───┼────────────────────────────┼───────────┼──────────────────────────────────────────────────────┼────────────────────────────────┤
│ 2 │ 指针换槽 │ ptr-hook │ 只改 8B 槽,不改 .text │ 只覆盖「过指针」调用 │
├───┼────────────────────────────┼───────────┼──────────────────────────────────────────────────────┼────────────────────────────────┤
│ 3 │ HW-BP persistent │ bp-hook │ 硬件执行断点,命中改 pc;可 origin island │ 每 hit 进内核;槽位少 │
├───┼────────────────────────────┼───────────┼──────────────────────────────────────────────────────┼────────────────────────────────┤
│ 4 │ PFN-swap │ pfn-hook │ 页帧/执行视图交换(实验) │ 非默认;隐蔽模型与 DBI 不同 │
└───┴────────────────────────────┴───────────┴──────────────────────────────────────────────────────┴────────────────────────────────┘
安装窗口还有 break-arm(oneshot 断点汇合)、task-hold、fork-watch 等,用来卡安装时机,本身不是第 3 条长期 hook。
主路径:业务上优先 DBI +(可选)agent 装载;能指针化的用 ptr;低频零改字节再考虑 bp-hook;pfn 当实验后端。
### 你能直接用的东西
[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!
最后于 1天前
被PPKun编辑
,原因: