我需要查看 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% 确定。