iOS 逆向開發(fā)07:OC方法匯編

iOS 逆向開發(fā) 文章匯總

目錄


一、查看OC方法匯編

準(zhǔn)備如下代碼:

//  Person.h
@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

+ (instancetype)person;

@end

//  Person.m
@implementation Person

+ (instancetype)person {
    return [[Person alloc] init];
}

@end
//  main.m
int main(int argc, char * argv[]) {
    Person *p = [Person person];
    return 0;
}

匯編如下:

OC-Method`main:
    0x1021f1ed0 <+0>:   sub    sp, sp, #0x30             ; =0x30 
    0x1021f1ed4 <+4>:   stp    x29, x30, [sp, #0x20]
    0x1021f1ed8 <+8>:   add    x29, sp, #0x20            ; =0x20 
    0x1021f1edc <+12>:  stur   wzr, [x29, #-0x4]
    0x1021f1ee0 <+16>:  stur   w0, [x29, #-0x8]
    0x1021f1ee4 <+20>:  str    x1, [sp, #0x10]
    0x1021f1ee8 <+24>:  adrp   x8, 8
    0x1021f1eec <+28>:  add    x8, x8, #0x3d0            ; =0x3d0 
    0x1021f1ef0 <+32>:  ldr    x0, [x8]
    0x1021f1ef4 <+36>:  adrp   x8, 8
    0x1021f1ef8 <+40>:  add    x8, x8, #0x3c0            ; =0x3c0 
    0x1021f1efc <+44>:  ldr    x1, [x8]
    0x1021f1f00 <+48>:  bl     0x1021f2250               ; symbol stub for: objc_msgSend
    這里objc_msgSend方法有兩個(gè)參數(shù):id、SEL、匯編中通過(guò)x0和x1寄存器傳遞參數(shù)

    0x1021f1f04 <+52>:  mov    x29, x29
    0x1021f1f08 <+56>:  bl     0x1021f2274               ; symbol stub for: objc_retainAutoreleasedReturnValue
    0x1021f1f0c <+60>:  add    x8, sp, #0x8              ; =0x8 
    0x1021f1f10 <+64>:  str    x0, [sp, #0x8]
->  0x1021f1f14 <+68>:  stur   wzr, [x29, #-0x4]
    0x1021f1f18 <+72>:  mov    x0, x8
    0x1021f1f1c <+76>:  mov    x8, #0x0
    0x1021f1f20 <+80>:  mov    x1, x8
    0x1021f1f24 <+84>:  bl     0x1021f228c               ; symbol stub for: objc_storeStrong
    第一個(gè)參數(shù)為p(實(shí)例對(duì)象)的地址,第二參數(shù)為0x0(nil)
    調(diào)用objc_storeStrong相當(dāng)于將p(實(shí)例對(duì)象)釋放了
    
    0x1021f1f28 <+88>:  ldur   w0, [x29, #-0x4]
    0x1021f1f2c <+92>:  ldp    x29, x30, [sp, #0x20]
    0x1021f1f30 <+96>:  add    sp, sp, #0x30             ; =0x30 
    0x1021f1f34 <+100>: ret    

查看x0和x1寄存器中的值:

objc_storeStrong:

void
objc_storeStrong(id *location, id obj)
{
    id prev = *location;
    if (obj == prev) {
        return;
    }
    objc_retain(obj);
    *location = obj;
    objc_release(prev);
}

二、使用反匯編工具分析匯編

修改main中的代碼:

int main(int argc, char * argv[]) {
    Person *p = [Person person];
    p.name = @"differ";
    p.age  = 18;
    
    return 0;
}

編譯-->將編譯后的可執(zhí)行文件拖到Hopper中:

三、Block反匯編

int main(int argc, char * argv[]) {
    void (^block)(void) = ^() {
        NSLog(@"block");
    };
    
    block();

    return 0;
}

由于block中的實(shí)現(xiàn)代碼保存到invoke中的,所以分析block匯編代碼主要找到invoke

struct Block_ layout {
    void *isa; // 8字節(jié)
    volatile int32_t flags; // contains ref count  4字節(jié)
    int32_t reserved; // 4字節(jié)
    BlockInvokeFunction invoke; // 因此invoke變量地址就是block地址+16字節(jié)
    struct Block_descriptor_1 *descriptor;
    // imported variables
};

block地址為0x0000000104d0c028,因此invoke的保存在0x104d0c038指向的變量中(0x104d09ed4)

Hopper中查看Block的invoke:

Hopper中還能查看流程圖、偽代碼
Hopper的偽代碼可讀性很差,一般使用IDA。IDA還能動(dòng)態(tài)調(diào)試。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容