安卓逆向:老司机带你回顾ARM和C/C++基本结构
引言:这还是一篇比较枯燥的和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汇编代码及解释
更多精彩,关注我的公众号,一起学习,一起成长。