我已经在这个代码上工作了几个小时,这让我发疯了!
整个来源在这里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吗?如果是这样,我怎么甚至链接一个dll?我以为您只能使用Visual Studio 2010中的库。
另外,NTSYSAPI和NTAPI到底是什么?网上几乎没有任何信息。
最佳答案
这看起来像用户模式代码,因此您可能不想链接到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
是定义调用约定的宏,在本例中为__stdcall
。 calling convention与如何传递函数的参数以及谁将清除这些参数有关。例如,
__stdcall
要求将参数以相反的顺序插入堆栈,而被调用方将清理堆栈。同样,
NTSYSAPI
是一个宏,如果我没记错的话,它只能解析为__declspec(dllimport)
。另外,我应该指出,通常不赞成在用户模式下由NtDll导出的调用函数。而且,您正在编写的代码在使用过程中也会遇到其他问题(即使看起来很正常)。
如果您正在寻找另一个代码示例,该示例执行与所编写的代码非常相似的任务,则可以检查here。这是Duqu恶意软件使用的一种技术。祝你好运!
关于c++ - 在内存C++中创建进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15714492/