Fish Hook
17 Fishhook
众所周知,Objective-C
的首选 hook
方案为 Method Swizzle
,于是大家纷纷表示核心内容应该用 C 写。
接下来进阶说说 iOS
下 C 函数的 hook
方案,先介绍第一种方案— fishhook .
什么是 fishhook
fishhook
是 facebook 提供的一个动态修改链接 Mach-O
符号表的开源工具。
什么是 Mach-O
Mach-O
为 Mach Object 文件格式的缩写,也是用于 iOS
可执行文件,目标代码,动态库,内核转储的文件格式。
Mach-O
有自己的 dylib
规范。
fishhook 的原理
详见官方的 How it works,这里我作个简要说明。
dyld
链接 2 种符号,lazy
和 non-lazy
,fishhook 可以重新链接/替换本地符号。
如图所示,__DATA
区有两个 section 和动态符号链接相关:__nl_symbol_ptr
、__la_symbol_ptr
。__nl_symbol_ptr
为一个指针数组,直接对应 non-lazy
绑定数据。__la_symbol_ptr
也是一个指针数组,通过dyld_stub_binder
辅助链接。<mach-o/loader.h>
的 section 头提供符号表的偏移量。
图示中,1061 是间接符号表的偏移量,*(偏移量+间接符号地址)=16343,即符号表偏移量。符号表中每一个结构都是一个 nlist
结构体,其中包含字符表偏移量。通过字符表偏移量最终确定函数指针。
fishhook 就是对间接符号表的偏移量动的手脚,提供一个假的 nlist
结构体,从而达到 hook 的目的。
fishhook 替换符号函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
关键函数是 _dyld_register_func_for_add_image
,这个函数是用来注册回调,当 dyld 链接符号时,调用此回调函数。 rebind_symbols_for_image
做了具体的替换和填充。
fishhook 替换 Core Foundation
函数的例子
以下是官方提供的替换 Core Foundation
中 open 和 close 函数的实例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
1 2 3 4 5 |
|
传入 rebind_symbols 的第一个参数是一个结构体数组,大括号中为对应数组内容。
不得不说,facebook 忒 NB 。