安卓逆向:老司机带你回顾ARM和C/C++基本结构

2021-01-21 22:13:27 浏览数 (1)

引言:这还是一篇比较枯燥的和ARM打交道的文章。不过这也是为了后续能更好进行做so逆向而做铺垫。

Arm C/C 基本结构逆向结构图

掌握ARM汇编中基本结构前需要回顾和并熟记以下的条件指令

在熟悉下另外一个重要的ARM汇编指令:CMP

CMP指令:在汇编中就是将两个寄存器中的值做一个相减,再判断值是否大于0(它会设置对应状态寄存器),它的主要跳转方式与下一条指令相关联的。

进入主题

if...else结构

(注意:if在arm中的展示和源代码的实现是取反的操作)

C/C 代码结构

If...else结构

if(....)

{

.....

}

else if(....)

{

....

}

else

{

...

}

C/C 对应arm汇编结构提炼

判断指令cmp后面的跳转执行指令指向的地址都是往后跳的。

cmp r0,xx(这个xx可以是寄存器,可以是具体数据)

BNE loc_xxx(地址是往下指向)

cmp r0, xx(这个xx可以是寄存器,可以是具体数据)

BNE loc_xxx(地址是往下指向)

C/C 源代码

IDA中if..else结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

If...elseif....else 源代码

IDA中if...elseif...else结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

for结构

C/C 基本结构

for(int i = 0; i <j; i )

{

.....

.....

}

for结构对应arm汇编结构提炼

for默认情况下都是从0开始,会先进行判断是否要跳出循环体,接着在执行循环体内容,并且在循环体的尾部 1的向上跳。

mov xx,xx

cmp xx,xx

BLT 地址(跳出整个结束循环体)

loc_xxx

mov xx,xx

add xx,1

BNE loc_xxx(向上跳到前面loc_xxx地址,继续执行循环的内容)

C/C 源代码:

IDA中for结构体的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

C/C 源代码2

IDA中for结构的流程图2

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释2

while结构

(注意地址往上跳的情况)

C/C 基本结构

while(xxxx)

{

xxxxx

xxxxx

}

while对应arm汇编结构提炼

在arm汇编中for和while结构是一样的,两种没有差别

mov xx,xx

cmp xx,xx

BLT 地址(跳出整个结束循环体)

loc_xxx

mov xx,xx

add xx,1

BNE loc_xxx(向上跳到前面loc_xxx地址,继续执行循环内容)

C/C 源代码

IDA中while的结构流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM的汇编代码及解释

do..while结构

C/C 基本结构

do{

xxxxx

xxxxx

xxxxx

}while(xxx);

do...while对应arm汇编结构提炼

mov xx,xx

loc_xxx(循环体开始地址)

mov xx,xx

cmp xx,xx

BLT loc_xxx(向上跳到前面循环体,继续执行循环体内容)

C/C 源代码

IDA中do...while结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

Switch结构

C/C 基本结构

switch(xxx)

{

case xx:

xxxxx

xxxxx

break;

case xx:

xxxxx

xxxxx

break;

case xx:

xxxxxx

xxxxx

break;

....

...

default:

xxxx

xxx

break;

}

switch对应arm汇编结构提炼

switch最明显的特征就是存在TBB 后面跟上的是跳转表。

mov xx,xx

cmp xx,xx

BHI loc_xxx(往下跳的地址)

TBB {PC,xx} (TBB关键字)

DCB xxx (跳转表)

DCB xxx

...

....

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

loc_xxx

xxxx

xxxx

B loc_xxx(结束的地址)

C/C 源代码

IDA中switch结构的流程图

绿色箭头指向表示 : 跳转条件满足时候的走向。

红色箭头指向表示:跳转条件不满足时候的走向。

ARM汇编代码及解释

0 人点赞