因为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
本文介绍如何在iOS环境中利用C语言的弱符号特性,实现对系统函数malloc的Hook,以达到内存分配行为的监控和修改。通过具体代码示例,展示了Hook的实现过程,并验证了Hook的成功。
6602

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



