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

通过找LoadCommand
获取几张表的偏移量,计算得到最终的起始地址。
1.分别是符号表地址Symbol Table
(以下标存着每个方法):

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

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

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


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

获取indirectSymbols

通过data
算出索引值

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

去string table
寻找字符串

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