美文网首页
static 和被裁的符号表

static 和被裁的符号表

作者: 无沣 | 来源:发表于2017-05-06 15:15 被阅读36次

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

    本文就介绍一个防御技巧——利用 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_createBtn() 方法呢,我们已经无法看到它任何直观的有价值信息了。

    局限

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

    打破局限

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

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

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

    相关文章

      网友评论

          本文标题:static 和被裁的符号表

          本文链接:https://www.haomeiwen.com/subject/pqaetxtx.html