iOS逆向之fishHook原理探究

HOOK原理

1、MachO是被谁加载的?

DYLD动态加载

2、ASLR技术(地址空间布局随机化):MachO文件加载的时候是随机地址

3、PIC(位置代码独立)

  • 如果MachO内部需要调用 系统的库函数时
  • 先在_DATA段中建立一个指针,指向外部函数
  • DYLD会动态的进行绑定,将MachO中的DATA段中的指针,指向外部函数(DYLD会告诉MachO要依赖的外部库的位置)
  • _DATA段中建立的指针就是符号(symbols),它是帮你指向内部的函数调用,指向外部的函数地址
    所以,fishhook的rebind_symbols(重新绑定符号)函数,它就是将你指向系统的NSLog的符号,给重新进行绑定,变为指向你内部的函数,这样子就达到修改的目的了;这也是fishhook的底层原理。这也就是为什么使用fishhook时我们内部的函数修改不了,自定义的函数修改不了的原因,只能修改MachO外部的函数。
1、在rebind_symbols处打上断点,提前加上一行代码
NSLog(@"123");

image.png

运行后,如果在rebind_symbols断点没有显示汇编代码,可以通过Debug->Debug Workflow->Always Show Disassembly设置
image.png

image.png

2、在rebind_symbol函数执行之前,NSLog的懒加载符号表的地址是多少

找到可执行文件
image.png
用MachOView打开
image.png

  • Non-Lazy Symbol pointers:MachO只要被加载进来就被绑定了
  • Lazy Symbol pointers:第一次调用的时候才会去绑定

前面为什么加上NSLog(@"123");,是为了调用一次NSLog,这样才能在懒加载表中看到NSLog。
image.png

3、怎么查看符号表

Offset偏移量 00003018(在MachO中偏移了3018)
表的位置=MachO相对于内存的偏移地址+表相对于MachO的偏移地址Offset(3018)

MachO相对于内存的偏移地址,通过image list查看
image.png

0x0000000108339000 就是MachO在内存中的真实地址

表的位置=MachO相对于内存的偏移地址(0x0000000108339000)+表相对于MachO的偏移地址Offset(0x3018)
查看内存所指向的地址
x 0x0000000108339000+0x3018
(x 相当于memory read)
image.png

反汇编:
dis -s 0x0108690a52
image.png

这就通过符号表找到了方法

2、过掉rebind_symbol后,会改变0x0000000108339000+0x3018地址的值,查看地址

image.png

查看内存所指向的地址
x 0x0000000108339000+0x3018
image.png
反汇编:
dis -s 0x0108339e00
image.png

可以看到rebind_symbol后,对应的地址的方法已经发生了改变

那么,在上一篇iOS逆向之fishhookDemo的Demo2中,因为符号表里根本没有func方法,所以Hook不成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值