iOS逆向工程(十):ARM64汇编

2020-04-15  本文已影响0人  冰风v落叶

前言

我们使用Hopper Disassembler等反编译工具查看Mach-O可执行文件时,看到的都是汇编代码,所以只有我们学会了汇编后,才能更好的去调试,去分析App的逻辑
学会了汇编之后,甚至可以直接修改汇编代码,导出可执行文件,再经过签名安装使用了,都不用通过之前的tweak方式hook了,当然,这需要对汇编掌握的及其深入,并且经过调试分析清楚了App整体逻辑之后了。
一、汇编
二、寄存器
寄存器就是CPU内部临时存储数据的地方,分为有很多种,如下图所示,我们下面依次讲解:
寄存器
三、指令
0x100432624 <+88>:  cmp    x1, #0x1                 ; =0x1 
0x100432628 <+92>:  b.le   0x100432630               ; 
<1>. cmp:  将寄存器 x1 的值与立即数 0x1 相减,并根据结果设置 CPSR 的标志位
<2>. b.le 0x100432630:表示如果x1 <= 0x1那么就执行0x100432630
三、叶子函数的堆栈
C代码:

void test(){
    int a = 2;
    int b = 3;
}

test的函数汇编代码如下:

sub sp, sp, #16             ; =16          ;sp = sp - 16,开辟16个字节的栈空间

orr w8, wzr, #0x2                          ;设置w8寄存器为2
str w8, [sp, #12]                          ;在sp地址偏移12个字节的地方开始存储4个字节的数据,也就是w8寄存器的值,也就是存储了2
orr w8, wzr, #0x3                          ;设置w8寄存器为3
str w8, [sp, #8]                           ;在sp指针+8的地址开始,存储4个字节的数据,也就是将w8的值存储到sp偏移8字节的位置

add sp, sp, #16             ; =16          ;sp = sp + 16,回收16个字节的空间,保持堆栈平衡
ret
四、非叶子函数的堆栈
C代码如下,我们在good函数里,调用了test函数
void test(){
    int a = 2;
    int b = 3;
}

void good(){
    int a = 7;
    int b = 8;
    test();
}

good函数的汇编代码如下:

sub sp, sp, #32             ; =32                     ;sp = sp-32,开辟函数栈空间,也就是将sp指针往低字节移动32字节
stp x29, x30, [sp, #16]     ; 16-byte Folded Spill    ; 在sp+16的地方,往高字节的方向,依次存放x29、x30的数据,x29的数据占8个字节,x30的数据也占8个字节
add x29, sp, #16            ; =16                     ;x29 = sp + 16,x29也就是fp栈底指针

orr w8, wzr, #0x7                                     ;将w8置为7
stur w8, [x29, #-4]                                   ;将w8的值存放到x29-4的位置
orr w8, wzr, #0x8                                     ;将w8置为8
str w8, [sp, #8]                                      ;将w8的值存放到sp+8的位置
bl  _test                                             ;调用test函数,执行test函数的汇编代码

ldp x29, x30, [sp, #16]     ; 16-byte Folded Reload   ;调用完test,会返回到这里,继续执行,从sp+16的地址,加载8个字节到x29,然后再加载8个字节的数据到x30
add sp, sp, #32             ; =32                     ;sp = sp + 32,回收函数的栈空间,将sp指针复原
ret                                                   ;good函数调用完毕,将x30的值给了pc寄存器,CPU会执行pc寄存器中存放的地址所对应的指令的

上一篇 下一篇

猜你喜欢

热点阅读