在内存C ++中创建一个进程

时间:2013-03-30 03:06:20

标签: c++ windows linker linker-errors ntdll

我已经在这个代码上工作了几个小时,这让我发疯了!

整个来源都在这里http://pastebin.com/Urxh68W4,但我很确定我知道这个问题。

extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);

当我运行它时,我收到以下错误:

Error 1 error LNK2019: unresolved external symbol __imp__ZwUnmapViewOfSection@8 referenced in function _wWinMain@16

我猜我应该包含一些dll或库,所以我将Ntoskrnl.lib添加到我的项目中,因为它包含ZwUnmapViewOfSection函数。

我完全不知道该怎么做。我应该使用Ntdll.dll吗?如果是这样,我怎么连链接?我以为你只能使用Visual Studio 2010中的库。

另外,NTSYSAPI和NTAPI究竟是什么?网上几乎没有任何信息。

1 个答案:

答案 0 :(得分:5)

这看起来像用户模式代码,因此您可能不希望链接到ntoskrnl.lib。你宁愿链接到ntdll。

我可能会这样做的方法是使用动态链接并调用GetProcAddress传递HANDLE到ntdll.dll和ZwUnmapViewOfSection

示例代码:

typedef LONG (NTAPI *pfnZwUnmapViewOfSection)(HANDLE, PVOID);
HMODULE hMod = GetModuleHandle("ntdll.dll");
pfnZwUnmapViewOfSection pZwUnmapViewOfSection= (pfnZwUnmapViewOfSection)GetProcAddress(hMod, "ZwUnmapViewOfSection");

我没有编译过这个,但它应该看起来像那样(可能会添加一些错误检查等)。

关于您的其他问题:NTAPI是一个定义调用约定的宏,在本例中为__stdcallcalling convention与如何传递函数的参数以及谁将清理这些参数有关。

例如,__stdcall要求以相反的顺序将参数压入堆栈,并且被调用者将清理堆栈。

同样,如果我没记错的话,NTSYSAPI是一个只能解析为__declspec(dllimport)的宏。

另外,我应该指出,在用户模式下调用NtDll导出的函数通常是不受欢迎的。而且,您编写的代码在此过程中也会遇到其他问题(即使它看起来有效)。

如果您正在寻找另一个代码示例,该代码执行与您正在编写的代码非常相似的任务,您可以检查here。这是Duqu恶意软件使用的一种技术。祝你好运!