iOS逆向之旅(基礎篇) — 彙編(二) — 彙編下的 IF語句

洪呵呵發表於2018-10-25

我們先根據一段簡單的C語言去了解arm64彙編

原C程式碼如下:

void __if__(){
    int value = 5;
    if(value == 3){
        printf("333");
    } else if (value == 4) {
        printf("444");
    } else {
        printf("else");
    }
}
複製程式碼

XCode除錯的反彙編程式碼:


01-彙編-IF-SWITCH`__if__:
    0x104b2a898 <+0>:   sub    sp, sp, #0x20             ; =0x20 
    0x104b2a89c <+4>:   stp    x29, x30, [sp, #0x10]
    0x104b2a8a0 <+8>:   add    x29, sp, #0x10            ; =0x10 
    0x104b2a8a4 <+12>:  mov    w8, #0x5                  // w8 = 5
->  0x104b2a8a8 <+16>:  stur   w8, [x29, #-0x4]
    0x104b2a8ac <+20>:  ldur   w8, [x29, #-0x4]
    0x104b2a8b0 <+24>:  cmp    w8, #0x3                  ; w8與3進行比較
    0x104b2a8b4 <+28>:  b.ne   0x104b2a8cc               ; 如果 w8 != 3,則跳轉到0x104b2a8cc 
    0x104b2a8b8 <+32>:  adrp   x0, 1
    0x104b2a8bc <+36>:  add    x0, x0, #0xf24            ; x0 -> "333"
    0x104b2a8c0 <+40>:  bl     0x104b2ac0c               ; printf("333");
    0x104b2a8c4 <+44>:  str    w0, [sp, #0x8]
    0x104b2a8c8 <+48>:  b      0x104b2a900               ; <+104> at main.m:22
    0x104b2a8cc <+52>:  ldur   w8, [x29, #-0x4]
    0x104b2a8d0 <+56>:  cmp    w8, #0x4                  ; w8與4進行比較
    0x104b2a8d4 <+60>:  b.ne   0x104b2a8ec               ; 如果 w8 != 4,則跳轉到 0x104b2a8ec
    0x104b2a8d8 <+64>:  adrp   x0, 1
    0x104b2a8dc <+68>:  add    x0, x0, #0xf28            ; x0 -> "444"
    0x104b2a8e0 <+72>:  bl     0x104b2ac0c               ; printf("444");
    0x104b2a8e4 <+76>:  str    w0, [sp, #0x4]
    0x104b2a8e8 <+80>:  b      0x104b2a8fc               ; <+100> at main.m
    0x104b2a8ec <+84>:  adrp   x0, 1
    0x104b2a8f0 <+88>:  add    x0, x0, #0xf2c            ; x0 -> "else"
    0x104b2a8f4 <+92>:  bl     0x104b2ac0c               ; printf("else");
    0x104b2a8f8 <+96>:  str    w0, [sp]
    0x104b2a8fc <+100>: b      0x104b2a900               ; <+104> at main.m:22
    0x104b2a900 <+104>: ldp    x29, x30, [sp, #0x10]
    0x104b2a904 <+108>: add    sp, sp, #0x20             ; =0x20 
    0x104b2a908 <+112>: ret  
複製程式碼

用一段簡單的if-else if-else程式碼來介紹,彙編下的if語句的實現流程。

1.png
我在每句核心的彙編上加了註釋,參照著C語言程式碼,很容易就能看出整段彙編的流程。【裡面的adrp指令,你們可能會懵逼,你們暫時只需要知道x0->指向的是什麼就好了(程式碼我已經標明瞭),後面我會具體解釋】

Xcode下如何檢視反彙編

2.png

大夥記得真機除錯哦,不然不是arm64組合語言

資原始碼

相關文章