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_第1张图片

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

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

局限

static函数,只在本文件中可见。

打破局限

怎么让别的文件也能调到本文件的static方法呢?
在本文件建造一个结构体,结构体里包含函数指针。把static函数的函数指针都赋在这个结构体里,再把这个结构体抛出去。这样做的好处是,既隐藏了函数代码,也丰富了调用方式。

你可能感兴趣的:(static)