函数序言,添加 esp 指令

逆向工程 dll x64dbg 德尔福
2021-06-15 17:37:12

我需要查看 DLL 是如何编写的,并且我正在使用 x32dbg 在运行时完成它。我是这个逆向东西的新手,所以我对这段代码感到困惑:

push    ebp                          ; DllMain entry point
mov     ebp, esp
add     esp, FFFFFFBC
xor     eax, eax
mov     dword ptr ss:[ebp-44], eax
mov     eax, module.8BC3980
call    module.8BB8D54
xor     eax, eax

维基百科对函数序言的说明如下:

如果体系结构具有基指针(也称为帧指针)和堆栈指针,则函数序言通常会执行以下操作:

将当前基指针压入堆栈,以便稍后恢复。

将堆栈指针(指向保存的基指针)的值分配给基指针,以便在旧堆栈帧的顶部创建新堆栈帧。

根据堆栈是向下还是向上增长,通过减少或增加其值来进一步移动堆栈指针。在 x86 上,堆栈指针会减少,以便为函数的局部变量腾出空间。

[...]

例如,这里是 GCC 生成的典型 x86 汇编语言函数序言

push   ebp
mov    ebp, esp
sub    esp, N

但是我遇到了一个add esp, N指令,它增加了一个巨大的esp注册数字这里似乎有问题,我应该从代码中准确理解什么?

第二个问题是关于mov dword ptr ss:[ebp-44], eax指令的。为什么从ebp地址中减去 44 (11 个整数!),ss这里项目是什么

PS 我怀疑 DLL 是用 Delphi 编写的,但不是 100% 确定。

2个回答

添加到 ESP 的大整数是负数,用于将堆栈指针移动到允许当前函数堆栈上 0x44 字节的地址。

此时ESP=EBP-0x44。所以,EBP-0x44 本质上是,[ESP]。它相当于PUSH EAX, 作为下一个的参数CALL

ss:是选择器,其指示所提到的地址的“碱”是在堆栈中。在线性记忆系统中它没有实际意义。

你通常应该拿铅笔和纸来尝试解决它

在这里使用 python

>>> ebp = 0x1000
>>> esp = ebp
>>> esp = ( esp + 0xffffffbc )& 0xffffffff
>>> print(hex(esp),hex(ebp-0x44))
0xfbc 0xfbc
>>>

如果 ebp 以 0x1000 开头,它将向地址 0xfbc 写入 0