查看原文
其他

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

游戏安全攻防 小道安全 2022-11-13

引言:这还是一篇比较枯燥的和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汇编代码及解释

 

更多精彩,关注我的公众号,一起学习,一起成长。

 



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存