gpt4 book ai didi

c++ - 奇怪的函数调用约定

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:59 26 4
gpt4 key购买 nike

我正在 windbg 中调试一个 x86 DLL,特别是一个据称具有以下签名的函数:

bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)

函数未导出。 AFAIK __cdecl 应该接收堆栈上的所有参数,caller 应该清除堆栈。

但事实并非如此。 Windbg 说调用约定是 __cdecl 但前两个参数在 ecxedx 上传递,就像 __fastcall 功能。此外,函数本身正在清除堆栈,(我认为)不应该由 __cdecl 函数完成。

我试图 Hook 该函数但没有成功。我尝试将绕行函数设置为 __cdecl__fastcall 并且都导致崩溃。

有什么建议吗?

最佳答案

如果函数在可执行文件(而非库)中或仅从同一 DLL 中调用,则编译器可以根据需要优化调用约定。

如果编译器知道两端(调用者和被调用者),并且知道函数不会被导出到另一个单元(就像库一样),那么它可以以任何方式进行优化。

那么:函数是已完成的可执行文件的一部分吗?你有优化吗?

我建议关闭优化,然后重试。

关于c++ - 奇怪的函数调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38257812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com