在内存 C++ 中创建一个进程
Posted
技术标签:
【中文标题】在内存 C++ 中创建一个进程【英文标题】:Creating a process in memory C++ 【发布时间】:2013-03-20 19:38:37 【问题描述】:我已经在这段代码上工作了好几个小时,这让我发疯了!
完整的来源在这里 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 到底是什么?网上几乎没有任何信息。
【问题讨论】:
很可能一种是调用约定,一种是导出规范。 你能详细说明一下吗?你有点含糊。 您似乎正试图在用户模式程序中使用内核模式 API(用于驱动程序)中的函数。他们不一起去。如果您想了解有关内核模式 API 的信息,请获取 WDK(Windows 驱动程序工具包)。 msdn.microsoft.com/en-us/library/windows/hardware/… 说 包含在 Ntoskrnl.lib 中,所以我不确定您关心的是什么。它还说标头是 Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h),但您没有将其包含在示例代码中。如果你没有这个文件,你可能应该得到 WDK/DDK 或任何包含它的东西。 @ta.speot.是肯定的。 Nt* 变体按惯例是首选,但 Zw* 调用无论如何都会映射到用户模式下的 Nt* 调用。它们仅在内核上有所不同。 【参考方案1】:这看起来像用户模式代码,因此您可能不想链接到 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 恶意软件使用的一种技术。祝你好运!
【讨论】:
“如果我没记错的话。”大声笑认真吗?你只是从头顶上知道这些事情?!这就是为什么我喜欢 SO,有这么多伟大的程序员。我爸爸在 VB.NET 中编程,所以他永远无法帮助我使用 C++ DX Np 伙计,很高兴我能帮上忙。并小心那些驻留在内存中的代码。 ;)以上是关于在内存 C++ 中创建一个进程的主要内容,如果未能解决你的问题,请参考以下文章