Objective-C 反汇编 - 我不明白这段代码

逆向工程 操作系统 纳姆
2021-07-08 17:56:30

我组装了一个简单的objective-c 文件,将hello 打印到屏幕上。这是代码:

#import <Foundation/Foundation.h>
int main() {
    NSString* a = [NSString stringWithUTF8String: "hi"];
    NSLog(a);
    return 0;
}

当我组装它并将其转换为 Nasm 语法时,这是输出:

section .text
default rel
extern _OBJC_CLASS_$_NSString
extern _NSLog
extern _objc_msgSend   
global _main 
_main:   
    push rbp 
    mov rbp, rsp 
    sub rsp, 16 
    lea rdx, [ L_.str] 
    mov dword [rbp - 4], 0
    mov rax, qword [ L_OBJC_CLASSLIST_REFERENCES_$_] 
    mov rsi, qword [ L_OBJC_SELECTOR_REFERENCES_]
    mov rdi, rax 
    call    _objc_msgSend 
    mov qword [rbp - 16], rax 
    mov rax, qword [rbp - 16] 
    mov rdi, rax ; rdi has rax
    mov al, 0 
    call    _NSLog 
    xor eax, eax 
    add rsp, 16 
    pop rbp 
    ret 

segment __DATA,__objc_classrefs
L_OBJC_CLASSLIST_REFERENCES_$_: dq  _OBJC_CLASS_$_NSString

    segment __TEXT,__cstring
L_.str: db  "hi"

    segment .__TEXT,.__objc_methname
L_OBJC_METH_VAR_NAME_:   db "stringWithUTF8String:"

    segment __DATA,__objc_selrefs
L_OBJC_SELECTOR_REFERENCES_: dq L_OBJC_METH_VAR_NAME_

    segment __DATA,__objc_imageinfo
L_OBJC_IMAGE_INFO:
    dd  0
    dd  64

据我所知大部分组成,包括不同objc段,但我不明白的事情一样mov rax, qword [rbp - 16],甚至mov al, 0这是 64 位汇编代码,为什么要al引用寄存器为什么[rbp-16]存储到rax

1个回答

说明

mov qword [rbp - 16], rax 
mov rax, qword [rbp - 16] 

由编译器创建,它使用基于堆栈的内存分配来存储 NSString objc 调用的结果。如果使用优化进行编译,编译器应该完全不需要将值存储在堆栈中。

mov al, 0

因此需要一种方法来确定有多少变量存储在矢量寄存器(被设置为输入到NSLog的函数,它是一个可变参数函数xmm/ ymm)与通用的人(例如rdirsi等)处理输入参数时。由于向量寄存器的数量远远少于256个,所以只需要使用8位,只会看al这在代码利用方面节省了一点空间,因为该mov al, xx操作只需要 2 个字节。