返回首页 iOS 安全攻防

static 和被裁的符号表

为了不让攻击者理清自己程序的敏感业务逻辑,于是我们想方设法提高逆向门槛。

本文就介绍一个防御技巧——利用 static 关键字裁掉函数符号。

原理

如果函数属性为 static ,那么编译时该函数符号就会被解析为 local 符号。

在发布 release 程序时(用 Xcode 打包编译二进制)默认会 strip 裁掉这些函数符号,无疑给逆向者加大了工作难度。

验证

写个 demo 验证一下上述理论,以一段创建 Button 的代码为例,对应补充一个 static 版本。

id createBtn()  
{  
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
    [btn setFrame:CGRectMake(200, 100, 100, 100)];  
    [btn setBackgroundColor:[UIColor redColor]];  
    btn.layer.cornerRadius = 7.0f;  
    btn.layer.masksToBounds = YES;  
    return btn;  
}  

static id static_createBtn()  
{  
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
    [btn setFrame:CGRectMake(50, 100, 100, 100)];  
    [btn setBackgroundColor:[UIColor blueColor]];  
    btn.layer.cornerRadius = 7.0f;  
    btn.layer.masksToBounds = YES;  
    return btn;  
}  

再来看一下反编的结果,对于 createBtn() 方法,我们可以得到它的伪代码:

static

函数名虽然面目全非,但是基本操作还是清晰的。

对于 static_createBtn() 方法呢,我们已经无法看到它任何直观的有价值信息了。

局限

当然这种方法也有局限性。正如你所知道的,static 函数,只在本文件可见。

打破局限

怎么让别的文件也能调到本文件的 static 方法呢?

在本文件建造一个结构体,结构体里包含函数指针。把 static 函数的函数指针都赋在这个结构体里,再把这个结构体抛出去。

这样做的好处是,既隐藏了函数代码也丰富了调用方式。