facebook 的 fishhook ,可在运行时,动态修改外部 c 函数
用 C 写的
本文分析下,用 swift 写的 fishhook
本文主要参考 woshiccm/FishHook, swift 写的
功能上,跟 Facebook 的 FishHook, 差距大,
可用于理解 Facebook 的 FishHook
原理:
C 语言是静态语言,编译时决定了函数的地址
因为 iOS 系统做了一些 Mach-O 加载上的优化,即动态链接特性,
利用动态链接的特性,fishhook 在运行时,动态修改外部 c 函数
简单理解,动态链接 dynamic loader
C 语言是静态语言,编译时决定了内部的 C 语言函数的地址
外部的 C 语言函数,编译时没有决定啦,可修改其符号地址
外部的 C 语言函数,在共享缓存库里面
编译的时候,函数的实现,指向一个符号,符号对应的地址不能确定
动态链接的时候,系统会修改符号对应的地址,为其实际地址
运行时,fishhook 动态修改外部 c 函数,也就是修改符号对应的地址
MachOView,学习 fishhook 的好帮手
MachOView 可在 Mac 上,查看 Mach-O 文件的格式信息
简单理解 Mach-O 文件的内部布局
Mach-O 文件,主要分为两种段 segment
放程序的, text 段
放数据的, data 段
fishhook 动态修改,当然只能修改 data 段
使用 fishhook 常见的有两个表,加载表和懒加载表
- 加载表,Non-Lazy Symbol Pointers,
加载表的符号,一跑程序,系统把实际的函数地址,都处理好了
- 懒加载表, La, Lazy Symbol Pointers,
懒加载表的符号,当用到那个函数的时候,系统才去找实际的函数地址
实现:
该 swift 写的,算初步 hook 住了
特色:
- swift 语言, 去 hook ,调用惯例不好写
函数的 convention,比 C 的 fishhook 稍麻烦些
- swift 版,大量用到指针
因为 swift 是安全的语言,指针处理比 C 的fishhook 稍麻烦些
C 的 fishhook,转化方便