iOS Hacker Xcode玩转arm64汇编基础
已經熟悉了x86匯編,所以其他的理論就不多記了,主要是記錄以下這些。
iphon5s以上都是arm64的設備
armv6 設備:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 設備:iPhone3GS, iPhone4, iPhone4S
? ? ? ? ? ?iPad, iPad2, iPad3(The New iPad), iPad mini
? ? ? ? ? ?iPod Touch 3G, iPod Touch4
armv7s設備:iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 設備:iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
最常用匯編指令
str 將數據從寄存器中讀取存放到內存
ldr 將內存中的數據讀取放到寄存器
bl ?跳轉
32位寄存器
R0-R3 ? //函數的前4個參數放在R0-R3中,其他的參數放到棧中,返回值在R0 ??
R7 ?
R9
R13 ? ?//SP寄存器
R14 ? ?//LR寄存器,保存函數返回地址
R15 ? ?//PC寄存器
32位的寄存器容量是8位,64位寄存器的容量16位的,數量也更多一些,x1,x2,x3...
---------------------------------------------------------------------
以下是64位的arm匯編的一個實例,理解arm匯編的函數調用的過程。
打開Xcode,新建ios工程,在main.m下寫如下代碼
在Xcode菜單欄選擇Product=>Perform Action => Assemble main.m, 注意選擇在真機編譯才能生成arm匯編,在模擬器是x86的。
顯示代碼有很多.loc開頭的鬼東西,為了看著方便可以刪掉。
_funcAdd: ; @funcAdd Lfunc_begin0:.loc 1 13 0 ; /Users/exchen/Desktop/armasm/armasm/main.m:13:0.cfi_startproc ; BB#0:sub sp, sp, #32 ; =32 Ltmp1:.cfi_def_cfa_offset 32str w0, [sp, #28] ;將w0寄存器的值放入sp+28,第1個參數astr w1, [sp, #24] ;將w1寄存器的值放入sp+24,第2個參數bstr w2, [sp, #20] ;將w2寄存器的值放入sp+20,第3個參數cstr w3, [sp, #16] ;將w3寄存器的值放入sp+16,第4個參數dstr w4, [sp, #12] ;將w4寄存器的值放入sp+12,第5個參數estr w5, [sp, #8] ;將w5寄存器的值放入sp+8, 第6個參數f.loc 1 14 11 prologue_end ; /Users/boot/Desktop/armasm/armasm/main.m:14:11 Ltmp2:ldr w0, [sp, #28] ;將第1個參數a放入w0寄存器ldr w1, [sp, #24] ;將第2個參數b放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #20] ;將第3個參數e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #16] ;將第4個參數d放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #12] ;將第5個參數e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #8] ;將最后一個參數f放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器str w0, [sp, #4] ldr w0, [sp, #4]add sp, sp, #32 ; =32ret Ltmp3: Lfunc_end0:
這是在真機運行的匯編代碼和上面是一樣的。
armasm`funcAdd:0x1000389f0 <+0>: sub sp, sp, #320x1000389f4 <+4>: str w0, [sp, #28]0x1000389f8 <+8>: str w1, [sp, #24]0x1000389fc <+12>: str w2, [sp, #20]0x100038a00 <+16>: str w3, [sp, #16]0x100038a04 <+20>: str w4, [sp, #12]0x100038a08 <+24>: str w5, [sp, #8] -> 0x100038a0c <+28>: ldr w0, [sp, #28]0x100038a10 <+32>: ldr w1, [sp, #24]0x100038a14 <+36>: add w0, w0, w10x100038a18 <+40>: ldr w1, [sp, #20]0x100038a1c <+44>: add w0, w0, w10x100038a20 <+48>: ldr w1, [sp, #16]0x100038a24 <+52>: add w0, w0, w10x100038a28 <+56>: ldr w1, [sp, #12]0x100038a2c <+60>: add w0, w0, w10x100038a30 <+64>: ldr w1, [sp, #8]0x100038a34 <+68>: add w0, w0, w10x100038a38 <+72>: str w0, [sp, #4]0x100038a3c <+76>: ldr w0, [sp, #4]0x100038a40 <+80>: add sp, sp, #320x100038a44 <+84>: ret
main函數里調用funcAdd的過程
.globl _main.align 2 _main: ; @main Lfunc_begin1:.loc 1 17 0 is_stmt 1 ; /Users/exchen/Desktop/armasm/armasm/main.m:17:0.cfi_startproc ; BB#0:stp x29, x30, [sp, #-16]!mov x29, spsub sp, sp, #64 ; =64 Ltmp4:.cfi_def_cfa w29, 16 Ltmp5:.cfi_offset w30, -8 Ltmp6:.cfi_offset w29, -16orr w8, wzr, #0x1 ;和mov w8,#0x1是一樣的orr w9, wzr, #0x2 ;同上orr w2, wzr, #0x3orr w3, wzr, #0x4movz w4, #0x5orr w5, wzr, #0x6stur wzr, [x29, #-4]stur w0, [x29, #-8]stur x1, [x29, #-16] mov x0, x8mov x1, x9 ;到這我們發現,函數參數1-6依次存放到w0-w5,或者說是x1-x5,這和32位是有很大區別的。bl 0x1000d09f0 ;調用funcAddmain函數真機運行的匯編代碼
armasm`main:0x1000d0a48 <+0>: stp x29, x30, [sp, #-16]!0x1000d0a4c <+4>: mov x29, sp0x1000d0a50 <+8>: sub sp, sp, #640x1000d0a54 <+12>: orr w8, wzr, #0x1 0x1000d0a58 <+16>: orr w9, wzr, #0x20x1000d0a5c <+20>: orr w2, wzr, #0x30x1000d0a60 <+24>: orr w3, wzr, #0x40x1000d0a64 <+28>: movz w4, #0x50x1000d0a68 <+32>: orr w5, wzr, #0x60x1000d0a6c <+36>: stur wzr, [x29, #-4]0x1000d0a70 <+40>: stur w0, [x29, #-8]0x1000d0a74 <+44>: stur x1, [x29, #-16] -> 0x1000d0a78 <+48>: mov x0, x80x1000d0a7c <+52>: mov x1, x90x1000d0a80 <+56>: bl 0x1000d09f0 ; funcAdd at main.m:13
總結
以上是生活随笔為你收集整理的iOS Hacker Xcode玩转arm64汇编基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS Hacker Keychain相
- 下一篇: iOS Hacker Xcode使用和内