gpt4 book ai didi

c++ - Node 插件无法快照 (CreateToolhelp32Snapshot) 模块

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

我正在尝试学习 C++,但不太明白为什么当我尝试通过 Node 附加组件拍摄模块快照时,当我通过桌面上的 VS 运行程序时会返回不同的结果。

使用 this来自 MSDN 我可以列出进程中的所有模块:

void fm(LPSTR name) {
HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
MODULEENTRY32 mEntry;

// check invalid handle value...
// check module32first...

mEntry.dwSize = sizeof(mEntry);

do {
if (!strcmp(mEntry.szModule, name)) {
CloseHandle(hModuleSnapshot);
cout << mEntry.szModule << endl;
}
} while (Module32Next(hModuleSnapshot, &mEntry));
}

这会按预期工作并将查找/打印模块信息(省略错误检查)——但是,当我尝试将此功能移植到 Node 附加组件时,它不会列出与上面的代码相同的模块(代码几乎相同,我不知道为什么尝试在自定义 Node 插件中实现该功能会影响结果):

void fm() { 
HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
MODULEENTRY32 mEntry;

// check invalid handle value...
// check module32first...

mEntry.dwSize = sizeof(mEntry);

do {
cout << mEntry.szModule << endl;
} while (Module32Next(hModuleSnapshot, &mEntry));

CloseHandle(hModuleSnapshot);
}

使用 node-gyp 编译插件后我可以成功调用它(在 require 之后,它只是运行一个调用 fm 的函数)。

如果我尝试使用 PID 5844(VS Code)对进程进行快照,它会打印出:

代码.exe
ntdll.dll
wow64.dll
wow64win.dll
wow64cpu.dll

如果我使用 PID 6540 (Chrome) 尝试该过程,它会打印出:

chrome.exe
ntdll.dll
wow64.dll
wow64win.dll
wow64cpu.dll

这显然是不正确的,即使 PID(硬编码)不同,它也打印出相同的模块。

如果我使用第一个代码块并使用 VS 运行它,我得到:

chrome.exe
ntdll.dll
内核32.DLL
内核库.dll
应用帮助.dll
ADVAPI32.dll
msvcrt.dll
sechost.dll
RPCRT4.dll
SspiCli.dll
密码库.dll...
还有很多模块,但您可以看到这是第二个代码块应该打印的内容。

我不知道为什么通过自定义 Node 插件运行代码会影响结果,除非我遗漏或不了解有关 Node 插件的内容。

我可以使用带有 Node 附加组件的 CreateToolhelp32Snapshot 正确打开和收集有关所有进程的信息,但我似乎无法收集有关进程内模块的信息。

最佳答案

在 x86 进程上的 x64 进程 (Node.exe) 中使用 TH32CS_SNAPMODULE 将只提供 64 位模块,使用 TH32CS_SNAPMODULE32 获取 32 位模块 - TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32 所有模块。

关于c++ - Node 插件无法快照 (CreateToolhelp32Snapshot) 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34050468/

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