美文网首页iOS风控专题
IOS之fishhook原理探究

IOS之fishhook原理探究

作者: Devil_Chen | 来源:发表于2019-01-02 17:43 被阅读0次

前言

  • fishhook可以替换系统C函数是因为有共享缓存库和PIC技术(位置代码独立)

  • MachO是由dyld加载

  • MachO中有懒加载表和非懒加载表


    image.png
  • 如果MachO内部需要调用系统的库函数

1、先在懒加载表中建立一个指针,指向外部函数
2、DYLD会动态的进行绑定,将MachO中的懒加载表段中的指针,指向外部函数(DYLD会告诉MachO要依赖的外部库的位置)
3、懒加载表段中建立的指针就是符号(symbols),它是帮你指向内部的函数调用,指向外部的函数地址。所以,fishhook的rebind_symbols(重新绑定符号)函数,它就是将你指向系统的函数的符号,给重新绑定为指向你内部的函数,这也是fishhook的原理。

  • PS:使用fishhook只能修改系统函数,不能修改自定义的函数。

实践

1、编写代码

image.png

2、打断点并编译运行

3、查看MachO文件

image.png
image.png
image.png
  • 使用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

题外话:通过符号找字符串

  • 首先看图


    image.png

1、通过懒加载表Lazy Symbol Pointers找到NSLog顺序

image.png

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

image.png

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

image.png

4、把Symbols表中NSLog的data值 + String Table中的第一条数据的pFile值(0xD0 + 0x7528 = 0x75F8)

  • _是函数的开始 .是分隔符


    image.png
    image.png
    image.png

相关文章

网友评论

    本文标题:IOS之fishhook原理探究

    本文链接:https://www.haomeiwen.com/subject/gwbzlqtx.html