ARM 中的逆向工程类

逆向工程 手臂 班级重建
2021-06-11 04:35:15

我在丹尼斯·尤里切夫 (Denis Yurichev) 的《初学者逆向工程》一书中遇到了这一部分它写了 C++ 中的逆向工程类,但它没有提供 ARM 中的任何示例。

第 546 页

_this$ = -4
; size = 4
??0c@@QAE@XZ PROC ; c::c, COMDAT
; _this$ = ecx
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _this$[ebp], ecx
mov eax, DWORD PTR _this$[ebp]
mov DWORD PTR [eax], 667
mov ecx, DWORD PTR _this$[ebp]
mov DWORD PTR [ecx+4], 999
mov eax, DWORD PTR _this$[ebp]
mov esp, ebp
pop ebp
ret 0
??0c@@QAE@XZ ENDP ; c::c
_this$ = -4 ; size = 4
_a$ = 8
; size = 4
_b$ = 12
; size = 4
??0c@@QAE@HH@Z PROC ; c::c, COMDAT
; _this$ = ecx
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _this$[ebp], ecx
mov eax, DWORD PTR _this$[ebp]
mov ecx, DWORD PTR _a$[ebp]
mov DWORD PTR [eax], ecx
mov edx, DWORD PTR _this$[ebp]
mov eax, DWORD PTR _b$[ebp]
mov DWORD PTR [edx+4], eax
mov eax, DWORD PTR _this$[ebp]
mov esp, ebp
pop ebp
ret 8
??0c@@QAE@HH@Z ENDP ; c::c

如您所见,ECX用于保存 this 的指针以访问类的成员。这是如何在 ARM 汇编中完成的?

1个回答

因为它是特定于编译器的,所以不需要在内部始终相同。似乎 CLANG 和 GCC 使用R0来存储它。

C++

class MyClass {
  int field_;
 public:
  void set_field() { this->field_ = 42; }
};

void test() {
  MyClass x;
  x.set_field();
}

手臂:

test():
        push    {r11, lr}
        mov     r11, sp
        sub     sp, sp, #8
        add     r0, sp, #4
        bl      MyClass::set_field()
        mov     sp, r11
        pop     {r11, lr}
        bx      lr
MyClass::set_field():
        sub     sp, sp, #4
        str     r0, [sp]
        ldr     r1, [sp]
        mov     r0, #42
        str     r0, [r1]
        add     sp, sp, #4
        bx      lr

英特尔:

MyClass::set_field():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     rax, QWORD PTR [rbp-8]
        mov     DWORD PTR [rax], 42
        nop
        pop     rbp
        ret
test():
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        lea     rax, [rbp-4]
        mov     rdi, rax
        call    MyClass::set_field()
        nop
        leave
        ret