static和被裁的符号表

来源:互联网 发布:阿里云centos图形界面 编辑:程序博客网 时间:2024/05/18 03:58

为了不让攻击者理清自己程序的敏感业务逻辑,于是我们想方设法提高逆向门槛。
本文就介绍一个防御技巧————利用static关键字裁掉函数符号。


原理


如果函数属性为 static ,那么编译时该函数符号就会被解析为local符号。
在发布release程序时(用Xcode打包编译二进制)默认会strip裁掉这些函数符号,无疑给逆向者加大了工作难度。



验证


写个demo验证一下上述理论,以一段创建Button的代码为例,对应补充一个static版本。
[objc] view plain copy 在CODE上查看代码片派生到我的代码片
  1. id createBtn()  
  2. {  
  3.     UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
  4.     [btn setFrame:CGRectMake(200100100100)];  
  5.     [btn setBackgroundColor:[UIColor redColor]];  
  6.     btn.layer.cornerRadius = 7.0f;  
  7.     btn.layer.masksToBounds = YES;  
  8.     return btn;  
  9. }  
  10.   
  11. static id static_createBtn()  
  12. {  
  13.     UIButton *btn = [[UIButton alloc]initWithFrame:CGRectZero];  
  14.     [btn setFrame:CGRectMake(50100100100)];  
  15.     [btn setBackgroundColor:[UIColor blueColor]];  
  16.     btn.layer.cornerRadius = 7.0f;  
  17.     btn.layer.masksToBounds = YES;  
  18.     return btn;  
  19. }  


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





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

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




局限


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




打破局限


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





版权声明:本文为博主原创文章,未经博主允许不得转载。
0 0
原创粉丝点击