gpt4 book ai didi

ntdll.dll 中导出方法的调用约定

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:49 24 4
gpt4 key购买 nike

我在调用 Ntdll.dll 的导出方法时遇到了一些问题

在 VS2012 的 Debug模式下,我得到:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention

这是我用过的代码(x86平台,Windows 7)。

#include "stdafx.h"
#include <Windows.h>

typedef NTSTATUS (* NTAPI ZwClose)(HANDLE handle);

int _tmain(int argc, _TCHAR* argv[])
{
ZwClose close = (ZwClose) ::GetProcAddress(GetModuleHandle(L"ntdll.dll"), "ZwClose");
close(INVALID_HANDLE_VALUE); // Error happens here
return -1;
}

根据我的阅读,它应该可以工作。我也尝试过 __cdecl 和 __fastcall 作为备用调用约定,但没有任何效果。

最佳答案

你选错了,应该是:

typedef NTSTATUS (NTAPI* ZwClose)(HANDLE handle);

您的声明使指向函数的指针符合 C 约定。C 调用约定与 STDCALL 相同,只是堆栈由调用者更正。

;C
push arg1
call fun
add esp, 4
...

; STDCALL

push arg1
call func

在反汇编中 你可以看到在调用 ZwClose 之后,正在检查 Esp 的值。由于您对 ZwClose 的调用是在 C 约定中,因此调用者更正了 esp 值并且由函数本身导致的错误 ofc。

000F14C4  mov         esi,esp  
000F14C6 push 0FFFFFFFFh
000F14C8 call dword ptr [close]
000F14CB add esp,4
000F14CE cmp esi,esp
000F14D0 call @ILT+380(__RTC_CheckEsp) (0F1181h) ; Run-Time Check Failure #0

关于ntdll.dll 中导出方法的调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15175083/

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