iOS inline

╰+哭是因爲堅強的太久メ 2022-08-21 01:17 223阅读 0赞

转:http://www.blogfshare.com/ioss-static-inline.html

一般的函数调用都会通过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

现在没有符号表了。

发表评论

表情:
评论列表 (有 0 条评论,223人围观)

还没有评论,来说两句吧...

相关阅读

    相关 inline

    内联函数类似于宏函数,会在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度 与宏函数不同,内联函数具有函数特性,在运行时可调试

    相关 inline函数

          先给出一到判断题:inline函数表示编译器一定会将函数体直接插入到调用此函数的地方,这样可以加快程序的运行速度,上面说法是否正确.答案是false。为什么呢?下面

    相关 inline关键字

    写在前面 > c++ inline关键字 主要内容 Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数. 定义: 当函数被声明为内联函数之后, 编