Android PLT hook 与 Inline hook

Android Native 函数 Hook 技术详解

版权归作者所有,如有转发,请注明文章出处: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 → 自动下载并安装。

word/media/image1.png

也可以用命令行工具安装:

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

word/media/image2.png

word/media/image3.png

再次运行,提示如下错误

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

word/media/image4.png

编译运行成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值