IOS之fishhook原理探究
2019-01-02 本文已影响0人
Devil_Chen
前言
-
fishhook可以替换系统C函数是因为有共享缓存库和PIC技术(位置代码独立)
-
MachO是由dyld加载
-
MachO中有懒加载表和非懒加载表
image.png
-
如果MachO内部需要调用系统的库函数时
1、先在懒加载表中建立一个指针,指向外部函数
2、DYLD会动态的进行绑定,将MachO中的懒加载表段中的指针,指向外部函数(DYLD会告诉MachO要依赖的外部库的位置)
3、懒加载表段中建立的指针就是符号(symbols),它是帮你指向内部的函数调用,指向外部的函数地址。所以,fishhook的rebind_symbols(重新绑定符号)函数,它就是将你指向系统的函数的符号,给重新绑定为指向你内部的函数,这也是fishhook的原理。
- PS:使用fishhook只能修改系统函数,不能修改自定义的函数。
实践
1、编写代码

2、打断点并编译运行
3、查看MachO文件



-
使用MachOView打开文件
image.png
4、找出NSLog原本地址
-
lldb中使用命令 image list查看MachO在内存中的地址
image.png
-
使用MachO在内存中的地址 + NSLog的偏移地址(0x0000000105933000+0x4020)
PS:地址相加时不能有空格,否则会报错
image.png
image.png
-
反汇编得出方法(指针是8个字节,然后从右向左读去掉0)
image.png
5、进行符号重绑定(rebind_symbols)

-
可以看出指针地址已经改变了,再次反汇编得出方法,成功改变成自定义函数
image.png
题外话:通过符号找字符串
-
首先看图
image.png
1、通过懒加载表Lazy Symbol Pointers找到NSLog顺序

2、在Indirect Symbols按上面的顺序找到NSLog

3、把Indirect Symbols表中NSLog的data值转为10进制,0xC8 = 200。然后在Symbols Table -> Symbols中查找

4、把Symbols表中NSLog的data值 + String Table中的第一条数据的pFile值(0xD0 + 0x7528 = 0x75F8)
-
_是函数的开始 .是分隔符
image.png
image.png
image.png