mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: fishhook 底层原理
This commit is contained in:
40
Chapter1 - iOS/1.88.md
Normal file
40
Chapter1 - iOS/1.88.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# fishhook 原理
|
||||
|
||||
1. image: 代码编译后的可执行文件,被加载到内存中,就叫做镜像文件。
|
||||
|
||||
2. MachO 结构:
|
||||
|
||||
3. iOS 代码在编译时没有办法确定方法的实现地址。**动态库共享缓存**,里面有动态库。NSLog 属于 Foundation 框架,每个手机内部中的地址不一定。
|
||||
|
||||

|
||||
|
||||
4. DYLD 动态链接器,负责将可执行文件加载到内存中。App 启动后,DYLD 将 Foundation、UIKit 等加载进动态库共享缓存中,但是加载到的位置不确定。
|
||||
|
||||
5. 可执行文件头有 **Load Commands**:加载命令。告诉 DYLD 依赖了什么。
|
||||
|
||||
6. 从 NSLog 找到代码实现,经历过2种方式。早期:重定向。现在:PIC 技术(位置代码独立)。
|
||||
|
||||
7. 可执行文件:
|
||||
|
||||
- 代码段:可读可执行
|
||||
- 数据段:可读可写
|
||||
|
||||
8. 写的业务代码里面假如某一行调用了 `NSLog`,那么在编译阶段,使用 NSLog 只是 IDE 提供了功能,让你可以看到声明而已。编译后的可执行文件,还是不知道 NSLog 的具体函数地址,它指向了一个表(类似一个应用程序的外部函数名,函数真正实现地址),去这个表里面找地址,这个表叫做**符号表**。
|
||||
|
||||
当 DYLD 加载当前可执行文件的时候,才将这个表每个编号对应的函数地址去填上去,这个动作叫做**符号绑定**。
|
||||
|
||||
当真正去调用 NSLog 函数的时候才去这个符号表中去寻找函数地址,去调用实现。
|
||||
|
||||
| 编号(符号) | 地址 | |
|
||||
| ------------ | -------- | ---- |
|
||||
| NSLog | 0xaabbcc | |
|
||||
| ... | ... | |
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
9. fishhook 做的事情就是将系统的符号表,将符号表中的特定符号对应的地址,修改为自定义的函数地址。起到了 hook 作用。也就是说外部的 c 函数,在 iOS 中的调用属于**动态调用**。
|
||||
|
||||
https://www.bilibili.com/video/BV1UZ4y1u7Ba?from=search&seid=14997461811427810898
|
||||
|
||||
Reference in New Issue
Block a user