之前说了通过stub_helper绑定真实函数地址,在调用stub_helper的时候传入了一个参数,如下图。调用之前向w16寄存器压入了32位的参数,这个参数就在下面,它是0x00000330
。这个参数看起来像是偏移,那是在哪的偏移呢?下面的仅仅是猜想了,要验证估计要去看源码。如果有知道的大佬请纠正下我。
找到MachOView的下面位置
Lazy Binding Info
然后用开始的偏移0x61430
加上我们刚刚的偏移0x00000330
,结果是0x61760
。找到这个偏移位置,刚好值就是“ r..@_NSLog..."。这里的r..
我猜是起始符号...
是结束符号。然后stub_helper就根据这个符号去找对应函数的真实地址。
然后找到了函数的真实地址之后,怎么把它写回Lazy Symbol Pointers?这里继续是猜测哈,之前不是说过stub表也对应着Indirect Symbols,另外,通过Indirect Symbols是也是可以找到字符串的。那么只要遍历Indirect Symbols里面stub表所对应的项,就可以找到stub_helper所找到函数名字的一样的项,然后可以知道这一项的是第几项,假设是第X
项。此外留意一下,在Indirect Symbols里面,stub表和Lazy Symbol Pointers表对应的项排序都是一样的,举个例子:如果Lazy Symbol Pointers表对应的Indirect Symbols里面的第三项是_CFRetain,那么stub表对应的Indirect Symbols里面的第三项也是_CFRetain。另外一点,以前说过Lazy Symbol Pointers表和Indirect Symbols的项的顺序也是一一对应的。那么就可以在Lazy Symbol Pointers表找到第X
项,这个项就是需要将函数真实地址写回去的项。
再重复一下,这都是猜想哈。其实我也想是不是可以直接就拿Lazy Symbol Pointers表在Indirect Symbols的对应项去遍历就好。那stub表在Indirect Symbols的对应项拿来干嘛的就不得而知了。
网友评论