
简介
fishhook 是一个非常简单的库,它支持在模拟器和设备上运行的 iOS/MacOS Mach-O 二进制文件中动态重新绑定符号。这提供的功能类似于在 OS X 上使用 DYLD_INTERPOSE。可以挂接 libSystem 中的调用以进行调试/跟踪。
用法
fishhook 的使用也非常简单,以下面代码为例:
#include <stdio.h>
#include <stdlib.h>
#include "fishhook.h"
static void *(*origin_malloc)(size_t sz) = NULL;
void *my_malloc(size_t sz)
{
printf("first call my_malloc(), then call system malloc()");
return origin_malloc(sz);
}
int main()
{
rebind_symbols((struct rebinding[1]){{"malloc", (void *)my_malloc, (void **)&origin_malloc}}, 1);
int* p = (int *)malloc(sizeof(int));
free(p);
return 0;
}
这里核心函数是 rebind_symbols,该函数是 fishhook 中用于符号地址重绑定的入口函数,它需要传入 2 个参数:
- 重绑定信息数组的首地址 struct rebinding rebindings[]
- 重绑定信息数组的长度 size_t rebindings_nel
重绑定信息定义如下:
/*
* A structure representing a particular intended rebinding from a symbol
* name to its replacement
*/
struct rebinding {
const char *name;
void *replacement;
void **replaced;
};
name:重绑定符号的名称。replacement:指向符号替换实现的函数指针。replaced:保存符号原始实现的函数指针(二级指针)。
以上面代码为例,使用 fishhook 基本流程如下:
- 首先定义
origin_malloc函数指针,函数签名和系统malloc函数相同,用于保存符号原始实现的函数指针。 - 自定义需要 hook 的系统函数,函数签名也和系统
malloc相同。在自定义函数中,调用origin_malloc,相当于调用了原始的malloc函数。 main函数中调用rebind_symbols,并传入rebinding结构体作为参数,含义如上。- 调用
malloc函数。

从结果中可以看出,main 函数中调用的 malloc 函数,实际上调用到了自定义的 my_malloc 函数,说明完成了对 malloc 的 hook。
关注公众号:C++学习与探索,有惊喜哦~
7824

被折叠的 条评论
为什么被折叠?



