汇编代码说明

时间:2014-08-07 08:37:53

标签: assembly x86 reverse-engineering

它是一个打印你好世界的程序 我是汇编的新手,我正在为初学者阅读逆向工程(代码属于那里) 我很困惑

是什么

  1. var_10 = dword ptr -10h

  2. 为什么和esp和0fff ....?

  3. mov [esp + 10h + var_10]中发生了什么,eax?
  4. 和.... :)))  如果有人更详细地解释它,我将非常感激

    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?

1 个答案:

答案 0 :(得分:3)

为了理解下面的文字,我们应该理解帧指针的概念,即在为子esp的变量腾出空间之前的esp,....

帧指针通常存储在ebp中,但通常在小函数中省略,如此代码中所示。此代码中的值为esp + 10h,因为从esp中减去0x10h以为局部变量腾出空间。

参数具有相对于帧指针的正偏移,局部变量相对于帧指针的负偏移。

  1. 计算局部变量相对于帧指针的偏移量。它对代码不使用帧指针的概述没有帮助。

  2. esp和0xFFF0在16字节边界上对齐堆栈,这是当今许多运行时的要求(由于SSE2)。请注意,一条指令后面的减去值再次减去0x10,这可能是局部变量的空间,四舍五入到16的倍数(0x10)以保持对齐。

    如果所有函数都保持对齐,则不应严格要求在每个函数中检查它,因此该函数是防御性编程的。 (也许是因为它被导出或用作回调?)

  3. 访问本地变量进行读取(值为eax),var10是相对于该framepointer的偏移量