节点插件无法快照 (CreateToolhelp32Snapshot) 模块
Node addon unable to snapshot (CreateToolhelp32Snapshot) modules
我正在尝试学习 C++,但不太明白为什么当我尝试通过 Node 附加组件对模块进行快照时,当我通过桌面上的 VS 运行 程序时会返回不同的结果.
使用来自 MSDN 的 this 源代码,我可以列出进程中的所有模块:
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));
}
这会按预期工作并将 find/print 模块信息(省略错误检查)- 但是,当我尝试将此功能移植到 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
KERNEL32.DLL
KERNELBASE.dll
apphelp.dll
ADVAPI32.dll
msvcrt.dll
sechost.dll
RPCRT4.dll
SspiCli.dll
CRYPTBASE.dll...
还有很多模块,但你可以看到这是第二个代码块应该打印的内容。
我不知道为什么 运行通过自定义 Node 附加组件编译代码会影响结果,除非我遗漏或不了解有关 Node 附加组件的内容。
我可以使用 CreateToolhelp32Snapshot
和 Node 插件正确打开和收集有关所有进程的信息,但我似乎无法收集有关进程内模块的信息。
在 x64 进程中使用 TH32CS_SNAPMODULE
(Node.exe)在 x86 进程中将只提供 64 位模块,使用 TH32CS_SNAPMODULE32
获取 32 位模块 - TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
所有模块。
我正在尝试学习 C++,但不太明白为什么当我尝试通过 Node 附加组件对模块进行快照时,当我通过桌面上的 VS 运行 程序时会返回不同的结果.
使用来自 MSDN 的 this 源代码,我可以列出进程中的所有模块:
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));
}
这会按预期工作并将 find/print 模块信息(省略错误检查)- 但是,当我尝试将此功能移植到 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
KERNEL32.DLL
KERNELBASE.dll
apphelp.dll
ADVAPI32.dll
msvcrt.dll
sechost.dll
RPCRT4.dll
SspiCli.dll
CRYPTBASE.dll...
还有很多模块,但你可以看到这是第二个代码块应该打印的内容。
我不知道为什么 运行通过自定义 Node 附加组件编译代码会影响结果,除非我遗漏或不了解有关 Node 附加组件的内容。
我可以使用 CreateToolhelp32Snapshot
和 Node 插件正确打开和收集有关所有进程的信息,但我似乎无法收集有关进程内模块的信息。
在 x64 进程中使用 TH32CS_SNAPMODULE
(Node.exe)在 x86 进程中将只提供 64 位模块,使用 TH32CS_SNAPMODULE32
获取 32 位模块 - TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
所有模块。