版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
前言
Android Native 函数 Hook 技术是一种在应用运行时拦截或替换系统或自身函数行为的手段,常见实现包括 PLT Hook、Inline Hook。
PLT Hook 和 Inline Hook 是两种不同层次和机制的函数 Hook 技术,常用于逆向工程、安全分析、壳保护或热修复等场景。
PLT hook 和 Inline hook 有什么区别?
| 特性 | PLT Hook(符号级) | Inline Hook(指令级) |
|---|---|---|
| Hook 层级 | 链接层(.plt 或 GOT) | 指令层(函数入口指令) |
| Hook 对象 | 动态库导出的函数 | 任意函数(不一定导出) |
| 修改内容 | 修改函数地址指针 | 修改指令流(如跳转指令) |
| Hook 粒度 | 通常是库间调用 | 可以精确到任意函数、库内调用 |
| 稳定性 | 较高 | 稍差(依赖指令结构、架构) |
| 跨平台兼容性 | 更好 | 架构相关(ARM32/ARM64) |
PLT Hook 原理(也叫 GOT Hook)
ELF 中动态链接时使用 PLT(Procedure Linkage Table) 和 GOT(Global Offset Table);
程序调用外部函数(如 malloc、fopen)时,实际上是跳到 GOT 表中的地址;
可以通过修改 GOT 表,将目标函数地址替换为你自己的函数。
✅优点:
-
修改一次,全局生效(所有调用者都被 hook)
-
不需要写复杂汇编指令
❌ 缺点:
-
只能 Hook 动态链接函数(如 libc.so 中的函数)
-
无法 Hook 静态链接或内部函数调用
Inline Hook 原理
直接修改目标函数的前几条机器指令(通常是函数入口),替换成跳转指令(如 b <new_func> 或 ldr pc, [addr]);
原函数内容被破坏,因此会备份原始指令并在新函数中支持“回调原函数”(trampoline)。
✅ 优点:
-
可以 Hook 几乎任意函数(导出或非导出、静态或动态)
-
精细控制,适合保护/加壳/代码注入等底层用途
❌ 缺点:
-
对 CPU 架构高度依赖(ARM64、ARMv7)
-
对汇编、内存保护、缓存等有要求(必须关闭写保护)
-
稳定性较低,不当使用可能 crash
举个例子
假设目标函数是 malloc(),我们希望 Hook 它:
PLT Hook 方式:
-
找到 .got 中 malloc 的地址
-
改成我们自己的函数地址
void* my_malloc(size_t size) {
printf("Intercepted malloc(%zu)\n", size);
return real_malloc(size); // 调用原函数
}
Inline Hook 方式:
-
找到 malloc 函数地址,直接改入口 4~8 字节为跳转指令
-
替换后的入口可能变成:
b my_malloc ; ARM
App 中函数 Hook 是否会影响其他应用?
是否互相影响,取决于 Hook 的层级 和 Hook 方式,以下是详细分析:
关键点:Android 的进程隔离机制
在 Android 中,每个 App 通常运行在自己独立的进程(除非使用 android:sharedUserId 和特定签名),所以:
-
Java 层 Hook(如 Xposed):是 per-process(每个进程生效),不同 App 之间互不影响
-
Native 层 Hook(如 inline/PLT):也通常在当前进程生效
-
系统全局 Hook(如内核级 syscall hook):才可能影响所有进程,包括其他 App
示例分析
情况 1:两个 App 分别使用 inline hook hook 自己的 libc.so 的 open()
✅ 各自 Hook 的是自己进程中的 open
❌ 不会互相影响
情况 2:你 Hook 了 system_server 的某个系统服务(如 ActivityManager)
✅ 如果你有权限(如 Riru、Zygisk 模块),就能影响整个系统服务,其他 App 可能间接受影响
情况 3:你在内核或 system-wide 层 hook 了 syscall(比如使用 LKM hook read())
❗ 会影响整个系统,包括所有 App
🧨 风险大,容易被检测或引发稳定性问题
ShadowHook
ShadowHook 是一个 Android inline hook 库,它支持 thumb、arm32 和 arm64。
ShadowHook 现在被用于 TikTok,抖音,今日头条,西瓜视频,飞书中。
开源地址:https://github.com/bytedance/android-inline-hook
文档:https://github.com/bytedance/android-inline-hook/blob/main/README.zh-CN.md
ShadowHook 手册:https://github.com/bytedance/android-inline-hook/blob/main/doc/manual.zh-CN.md
运行 ShadowHook
首先把 ShadowHook 源码 clone 到本地并导入到 Android Studio。
点击运行,提示找不到 CMake ‘3.30.5’
[CXX1300] CMake '3.30.5' was not found in SDK, PATH, or by cmake.dir property.
Affected Modules: app, shadowhook, systest
打开 Android SDK 配置
-
点击右下角 Show Package Details。
-
找到并勾选 CMake 3.30.5。
-
点击 Apply → 自动下载并安装。

也可以用命令行工具安装:
cd D:\App\android\sdk\cmdline-tools\latest\bin
./sdkmanager "cmake;3.30.5"
Warning: Observed package id 'system-images;android-34;lineage;arm64-v8a' in inconsistent location 'D:\App\android\sdk\system-images\android-34\google_apis_playstore\arm64-v8a' (Expected 'D:\App\android\sdk\system-images\android-34\lineage\arm64-v8a')
Warning: Observed package id 'system-images;android-34;lineage;x86_64' in inconsistent location 'D:\App\android\sdk\system-images\android-34\google_apis_playstore\x86_64' (Expected 'D:\App\android\sdk\system-images\android-34\lineage\x86_64')
Warning: Observed package id 'system-images;android-34;lineage;arm64-v8a' in inconsistent location 'D:\App\android\sdk\system-images\android-34\google_apis_playstore\arm64-v8a' (Expected 'D:\App\android\sdk\system-images\android-34\lineage\arm64-v8a')
Warning: Observed package id 'system-images;android-34;lineage;x86_64' in inconsistent location 'D:\App\android\sdk\system-images\android-34\google_apis_playstore\x86_64' (Expected 'D:\App\android\sdk\system-images\android-34\lineage\x86_64')
[=======================================] 100% Unzipping... share/vim/vimfiles/s
需要下载对应版本的 ndk


再次运行,提示如下错误
Execution failed for task ':shadowhook:compileDebugJavaWithJavac'.
> Java compiler version 21 has removed support for compiling with source/target version 7.
Try one of the following options:
1. [Recommended] Use Java toolchain with a lower language version
2. Set a higher source/target version
3. Use a lower version of the JDK running the build (if you're not using Java toolchain)
For more details on how to configure these settings, see https://developer.android.com/build/jdks.
Set Java Toolchain to 11
Change Java language level and jvmTarget to 11 in all modules if using a lower level.
Pick a different compatibility level...
Pick a different JDK to run Gradle...
More information...
这个错误的意思是你使用的是 JDK 21,而你的项目设置了 sourceCompatibility = 1.7(也就是 Java 7),但 JDK 21 已经移除了对 Java 7 的编译支持。
设置 Java Toolchain 为 Java 11

编译运行成功!

最低0.47元/天 解锁文章
1878

被折叠的 条评论
为什么被折叠?



