软件测试之SDK开发(ios)——一种在iOS上利用C语言弱符号__attribute__ ((weak))进行hook的方法

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

因为ios中的系统C函数符号是利用懒加载的方式进行绑定,所以可以利用C语言弱符号__attribute__ ((weak))进行hook。自己试验过程中发现通过这种方式的hook和fishhook的效果一样

1、弱符号是什么?

参考文章弱符号__attribute__((weak))

若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为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

在C语言中,可以利用`__attribute__`特性的不同属性来初始化8个变量。下面分别介绍几种常见的`__attribute__`特性用于初始化变量的方法。 ### 使用`aligned`属性初始化8个变量 `__attribute__((aligned(n)))`用于指定变量的对齐方式,这里的`n`是一个正整数,表示所需的字节对齐边界。以下是初始化8个整型变量并指定对齐方式的示例: ```c #include <stdio.h> // 初始化8个整型变量并指定对齐方式为16字节 int var1 __attribute__((aligned(16))) = 1; int var2 __attribute__((aligned(16))) = 2; int var3 __attribute__((aligned(16))) = 3; int var4 __attribute__((aligned(16))) = 4; int var5 __attribute__((aligned(16))) = 5; int var6 __attribute__((aligned(16))) = 6; int var7 __attribute__((aligned(16))) = 7; int var8 __attribute__((aligned(16))) = 8; int main() { printf("var1: %d\n", var1); printf("var2: %d\n", var2); printf("var3: %d\n", var3); printf("var4: %d\n", var4); printf("var5: %d\n", var5); printf("var6: %d\n", var6); printf("var7: %d\n", var7); printf("var8: %d\n", var8); return 0; } ``` ### 使用`section`属性初始化8个变量 `__attribute__((section("section_name")))`用于将变量放置到指定的段中。以下是初始化8个整型变量并将它们放置到自定义段的示例: ```c #include <stdio.h> // 初始化8个整型变量并将它们放置到自定义段 ".my_section" 中 int var1 __attribute__((section(".my_section"))) = 1; int var2 __attribute__((section(".my_section"))) = 2; int var3 __attribute__((section(".my_section"))) = 3; int var4 __attribute__((section(".my_section"))) = 4; int var5 __attribute__((section(".my_section"))) = 5; int var6 __attribute__((section(".my_section"))) = 6; int var7 __attribute__((section(".my_section"))) = 7; int var8 __attribute__((section(".my_section"))) = 8; int main() { printf("var1: %d\n", var1); printf("var2: %d\n", var2); printf("var3: %d\n", var3); printf("var4: %d\n", var4); printf("var5: %d\n", var5); printf("var6: %d\n", var6); printf("var7: %d\n", var7); printf("var8: %d\n", var8); return 0; } ``` ### 使用`packed`属性初始化8个变量 `__attribute__((packed))`用于取消结构体或变量的对齐,使它们紧密排列。以下是初始化8个字符变量并使用`packed`属性的示例: ```c #include <stdio.h> // 定义一个包含8个字符变量的结构体,并使用 packed 属性 struct packed_vars { char var1; char var2; char var3; char var4; char var5; char var6; char var7; char var8; } __attribute__((packed)) = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; int main() { struct packed_vars vars; printf("var1: %c\n", vars.var1); printf("var2: %c\n", vars.var2); printf("var3: %c\n", vars.var3); printf("var4: %c\n", vars.var4); printf("var5: %c\n", vars.var5); printf("var6: %c\n", vars.var6); printf("var7: %c\n", vars.var7); printf("var8: %c\n", vars.var8); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值