流程
- 建立程式快照(
TH32CS_SNAPPROCESS),比對程式名稱取得 PID。
- 以 PID 建立模組快照(
TH32CS_SNAPMODULE)。
- 遍歷
MODULEENTRY32 列印 DLL 名稱與路徑。
程式碼
/* main.cpp
* Created on: 2014.06.08
* Author: Spike
*/
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>
using namespace std;
bool traverseProcesses(map<string, int>& nameID) {
PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) return false;
BOOL bRet = Process32First(hSnap, &pe32);
while (bRet) {
nameID.insert({pe32.szExeFile, pe32.th32ProcessID});
bRet = Process32Next(hSnap, &pe32);
}
CloseHandle(hSnap);
return true;
}
bool traverseModules(const string& procName) {
map<string, int> nameID;
if (!traverseProcesses(nameID)) return false;
auto it = nameID.find(procName);
if (it == nameID.end()) return false;
MODULEENTRY32 me32; me32.dwSize = sizeof(me32);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, it->second);
if (hSnap == INVALID_HANDLE_VALUE) return false;
BOOL bRet = Module32First(hSnap, &me32);
while (bRet) {
cout << me32.szModule << " : " << me32.szExePath << endl;
bRet = Module32Next(hSnap, &me32);
}
CloseHandle(hSnap);
return true;
}
int main() {
traverseModules("Image.exe");
return 0;
}
輸出範例
Image.exe : D:\Test\Image.exe
ntdll.dll : C:\Windows\System32\ntdll.dll
kernel32.dll : C:\Windows\System32\kernel32.dll
...