先清楚fishhook的最终目的是替换函数实现,也就是下面这个地方
image.png
通过找LoadCommand
获取几张表的偏移量,计算得到最终的起始地址。
1.分别是符号表地址Symbol Table
(以下标存着每个方法):
2.字符串表String Table
(存放着所有字符串)
3.动态符号表地址indirect Symbols
(将来要进行符号绑定)
找到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
通过data
算出索引值
通过uint32_t strtab_offset = symtab[symtab_index].n_un.n_strx; 拿到偏移值
image.png去string table
寻找字符串
判断最开始传进来的字符串是否相等匹配,如果匹配替换方法地址。如果想要保留之前的实现而传进来一个匿名方法,假如有,会把原方法赋给匿名方法方便开发者调用。
所以fishhook是扫全表遍历你想替换的方法。
网友评论