iOS安全–使用static inline方式编译函数,防止静态分析

我们知道一般的函数调用都会通过call的方式来调用,这样让攻击很容易对一个函数做手脚,如果是以inline的方式编译的会,会把该函数的code拷贝到每次调用该函数的地方。而static会让生成的二进制文件中没有清晰的符号表,让逆向的人很难弄清楚逻辑。

下面我们来看看一个普通函数及其反汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int isValidate ( int id ) {
     if (id  >  5 )
         return  1 ;
     else
         return  0 ;
}

int main ( int argc ,  const  char  * argv [ ] )  {
     int id  =  3 ;
     int a = 1 ,b = 2 ,c = 3 ;
    
     if ( !isValidate (id ) )
         return  0 ;
    a  = b  + c ;
     if ( !isValidate (id ) )
         return  0 ;
    c  = a / 2  * b ;
     if ( !isValidate (id ) )
         return  0 ;
    b  = c  / a * 2 ;
     return  1 ;
}

编译,反汇编结果如下:

Snip20150118_6

这样可以很明显的看到isValidate的调用,而且很容易使用断点+commands的方法让其始终返回1.

下面使用inline的方式来编译:

1
int isValidate ( int id ) __attribute__  ( (always_inline ) ) ;

编译,反汇编结果如下:

Snip20150118_7

在每次调用的时候都会把代码拷贝一次。

再来看看static inline的方式来编译的反汇编代码:

1
static  int isValidate ( int id ) __attribute__  ( (always_inline ) ) ;

Snip20150118_8

 

现在没有符号表了。

 

本文链接:http://www.blogfshare.com/ioss-static-inline.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值