一个看似用 MSVC 编译的 IA-32 程序如何通过 EAX 发送它的唯一参数?

逆向工程 C++ 登记 调用约定 微信
2021-06-16 16:17:56

我正在查看的 C++ 程序似乎是用 MSVC 编译的。它链接到 MSVCR100.dll,包含 MSVC 的安全 cookie 代码并使用 Microsoft 重整方案。但是,我使用的其中一个函数在 EAX 寄存器中发送了它唯一的参数,该参数立即作为参数传递给LoadLibraryW(在 BP 帧初始化之后)。

看代码,有其他函数引用的序列和字符串(内联的证据),所以我认为这不是直接的汇编代码工作。

据我所知,根据我的消息来源,MSVC 没有通过 EAX 发送参数的调用约定。Watcom 和 Delphi 有选项,但没有 MSVC。编译器是否有可能将函数优化为寄存器调用?还是在 MSVC 中还有另一个未记录的调用约定?

1个回答

这个列表我们可以看出IA-32的Delphi/Free Pascal调用约定是寄存器调用约定。我的猜测是您正在处理一个二进制文件,它是以下内容的结果:How to call a function using Delphi's register call Conventions from Visual C++?

部分引用最高投票的答案:

Delphi 的寄存器调用约定,也称为 Borland fastcall,在 x86上按顺序使用 EAX、EDX 和 ECX 寄存器

一些额外的阅读可能有助于更清晰地了解您正在查看的内容: