在阅读了大量博客文章、论坛和观看教程后,我想我将开始学习以旧时尚的方式逆向软件。创建简单的 C 文件并查看它们的反汇编。在我寻求真正理解逆向的过程中,我认为比较优化和未优化的代码也是有益的。在查看时,我发现了几行似乎什么也没做的代码。
如果有人可以解释未优化代码中的“mov”[es] 正在做什么,我会很高兴。所有这些都是使用 Hopper v4 拆卸的。
代码:
#include <stdio.h>
int main(int arg, char** arg) {
printf("Hello World!\n");
return 0;
}
未优化的代码 (gcc -m32):
; Variables:
; arg_4: 12
; arg_0: 8
; var_4: -4
; var_8: -8
; var_C: -12
; var_10: -16
; var_18: -24
push ebp
mov ebp, esp
sub esp, 0x18
call _main+11
pop eax ; CODE XREF=_main+6
-- What purpose do these moves serve? --
mov ecx, dword [ebp+arg_4]
mov edx, dword [ebp+arg_0]
-- --
lea eax, dword [eax-0x1f5b+0x1fa6] ; "Hello World!\\n"
-- And what do these moves also serve? --
mov dword [ebp+var_4], 0x0
mov dword [ebp+var_8], edx
mov dword [ebp+var_C], ecx
-- --
mov dword [esp+0x18+var_18], eax ; method imp___symbol_stub__printf
call imp___symbol_stub__printf
xor ecx, ecx
mov dword [ebp+var_10], eax
mov eax, ecx
add esp, 0x18
pop ebp
ret
优化代码 (gcc -m32 -O3):
push ebp
mov ebp, esp
sub esp, 0x8
call _main+11
pop eax ; CODE XREF=_main+6
lea eax, dword [eax-0x1f6b+0x1f9e] ; "Hello World!"
mov dword [esp+0x8+var_8], eax ; "%s" for imp___symbol_stub__puts
call imp___symbol_stub__puts
xor eax, eax
add esp, 0x8
pop eep
ret