因为ios中的系统C函数符号是利用懒加载的方式进行绑定,所以可以利用C语言弱符号__attribute__ ((weak))进行hook。自己试验过程中发现通过这种方式的hook和fishhook的效果一样。
1、弱符号是什么?
若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号
2、通过弱符号hook malloc
hook代码很简单,如下所示
#define likely_if(x) if(__builtin_expect(x,1))
#define unlikely_if(x) if(__builtin_expect(x,0))
typedef void* (*malloc_type)(size_t);
extern "C"
{
void *malloc(size_t __size) __attribute__ ((weak));
void *malloc(size_t __size)
{
static malloc_type orig_malloc = NULL;
unlikely_if(orig_malloc == NULL)
{
orig_malloc = (malloc_type) dlsym(RTLD_NEXT, "malloc");
}
void *ptr = orig_malloc(__size);
return ptr ;
}
}
在测试demo和hook代码里分别打上断点,如果两个指针是指向同一个地址,表示hook成功。如下所示:
运行代码,跳到我们的hook代码里面,如下图所示:
可以看到ptr地址是0x2806677f0
继续运行代码,代码进入到我们的测试代码,如下图所示
返回的指针也是0x2806677f0
,表示malloc hook成功。
参考文章
1、https://cloud.tencent.com/developer/article/1156898