[esp+2Ch]指向什么?

逆向工程 视窗 部件 聚乙烯 特别是
2021-06-27 03:42:24

我正在分析一个 Windows 可执行文件(PE 格式),可能是用 Borland Delphi 编写的。该程序以以下说明开始:

    pusha                      (1)
    pushf                      (2)
    xor ebp, ebp
    jmp add_eh

add_eh:
    mov eax, ss:off_4025E5[ebp]
    mov dword ptr ss:(loc_402159+1)[ebp], eax
    push offset loc_40215f                (3)
    push dword ptr fs:0
    mov fs:0, esp                        (4)
    mov eax, [esp+2Ch]                    (5)
    cmp [eax+IMAGE_DOS_HEADER.e_magic], 'ZM'
    jnz short loc_40206C

我在纸上复制了堆栈,直到用(5)标记的指令,似乎在(5)处 esp+2Ch 指向(1)推送的第一个寄存器(AX)上方。

esp+2Ch 指向哪里,它的价值是什么?

谢谢!

1个回答

基于指令在所有推送之前 获取双字的更正序列

pusha pushes 8 general purpose register  = 0x20   = 0x20
pushf pushes 1 flag register             = 0x04   = 0x24

ebp 是 0
mov eax,是/可以/可能是垃圾无论如何都不会改变堆栈
下一个指令也不会改变堆栈

the next 2 pushes alter the stack        = 0x08   = 0x2c

下一条指令设置 seh 处理程序

所以它在 pusha 之前从堆栈中获取 DWORD

如果这是调用的开始,则此 DWORD 可能是调用的返回地址,它可以来自较早的 push 指令或在 pusha 之前移至堆栈

只是为了澄清我在 ollydbg 的某个地方组装了指令并通过它进行了跟踪,请参阅下面的输出

main    ntdll.76E96F51  NOP
main    ntdll.76E96F52  NOP
main    ntdll.76E96F53  NOP
main    ntdll.76E96F54  NOP
main    ntdll.76E96F55  PUSH    0BA0000 [0020F99C]=00000000 ESP=0020F99C
main    ntdll.76E96F5A  PUSHAD      ESP=0020F97C
main    ntdll.76E96F5B  PUSHFD  [0020F978]=76E212AD ESP=0020F978
main    ntdll.76E96F5C  XOR     EBP, EBP
main    ntdll.76E96F5E  MOV     EAX, DWORD PTR SS:[EBP+calc.0BA25E5]    [00BA25E5]=0F087E3B EAX=0F087E3B
main    ntdll.76E96F64  MOV     DWORD PTR SS:[EBP+calc.ULongAdd], EAX   [00BA215A]=0F087E3B
main    ntdll.76E96F6A  PUSH    0BA215F [0020F974]=0020F9F4 ESP=0020F974
main    ntdll.76E96F6F  PUSH    DWORD PTR FS:[0]    [7FFDF000]=0020F9A0 ESP=0020F970
main    ntdll.76E96F76  MOV     DWORD PTR FS:[0], ESP   [7FFDF000]=0020F9A0
main    ntdll.76E96F7D  MOV     EAX, DWORD PTR SS:[ESP+2C]  [0020F99C]=00BA0000 EAX=00BA0000