fishhook执行逻辑

2020-06-06  本文已影响0人  重案组之虎曹达华_

先清楚fishhook的最终目的是替换函数实现,也就是下面这个地方


image.png

通过找LoadCommand

获取几张表的偏移量,计算得到最终的起始地址。

1.分别是符号表地址Symbol Table(以下标存着每个方法):

image.png

2.字符串表String Table(存放着所有字符串)

image.png

3.动态符号表地址indirect Symbols(将来要进行符号绑定)

image.png

找到LoadCommand里的Data段,遍历里面的section片段,找到 _got和 _la_symbol_ptr,因为这两张表分别对应了懒加载和非懒加载的符号表

image.png image.png

通过uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1(reserved1意为offset or index,该偏移后的地址由懒加载表和间接符号表一一对应) (间接符号表起始基址 + 偏移)

(loadcommand当中有指明,reserved1偏移是间接符号表)


image.png

获取indirectSymbols

image.png

通过data算出索引值

image.png

通过uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx; 拿到偏移值

image.png

string table寻找字符串

image.png

判断最开始传进来的字符串是否相等匹配,如果匹配替换方法地址。如果想要保留之前的实现而传进来一个匿名方法,假如有,会把原方法赋给匿名方法方便开发者调用。
所以fishhook是扫全表遍历你想替换的方法。

上一篇下一篇

猜你喜欢

热点阅读