它是一个打印你好世界的程序 我是汇编的新手,我正在为初学者阅读逆向工程(代码属于那里) 我很困惑
是什么
var_10 = dword ptr -10h
为什么和esp和0fff ....?
和.... :))) 如果有人更详细地解释它,我将非常感激
thnx
main proc near
var_10 = dword ptr -10h
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 10h
mov eax, offset aHelloWorld ; "hello, world"
mov [esp+10h+var_10], eax
call _printf
mov eax, 0
leave
retn
main endp
另一个问题,我已经看过很多这样的事情$SG3830 DB ’a=%d; b=%d; c=%d’, 00H
它在做什么?什么是00H?
答案 0 :(得分:3)
为了理解下面的文字,我们应该理解帧指针的概念,即在为子esp的变量腾出空间之前的esp,....
帧指针通常存储在ebp中,但通常在小函数中省略,如此代码中所示。此代码中的值为esp + 10h,因为从esp中减去0x10h以为局部变量腾出空间。
参数具有相对于帧指针的正偏移,局部变量相对于帧指针的负偏移。
计算局部变量相对于帧指针的偏移量。它对代码不使用帧指针的概述没有帮助。
esp和0xFFF0在16字节边界上对齐堆栈,这是当今许多运行时的要求(由于SSE2)。请注意,一条指令后面的减去值再次减去0x10,这可能是局部变量的空间,四舍五入到16的倍数(0x10)以保持对齐。
如果所有函数都保持对齐,则不应严格要求在每个函数中检查它,因此该函数是防御性编程的。 (也许是因为它被导出或用作回调?)
访问本地变量进行读取(值为eax),var10是相对于该framepointer的偏移量