首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

ToolHelp32快照枚舉系統進程實戰

     編輯:VC 教學

API選型對比

方法優點缺點
ToolHelp32 (CreateToolhelp32Snapshot)使用簡單、支持進程/模塊/線程/堆快照需載入tlhelp32.h、舊版Windows 9x/NT4需單獨分發DLL
PSAPI (EnumProcesses)系統自帶、無額外依賴僅獲取PID,需OpenProcess再查詢詳情
WMI (Win32_Process)支持遠程查詢、SQL-like過濾性能較差、依賴WMI服務
NtQuerySystemInformation內核級、獲取最完整信息未文檔化、版本兼容風險

標準枚舉流程

#include 
#include 
#include 
#include 

struct ProcessInfo {
    DWORD pid;
    DWORD ppid;
    std::wstring exeName;
    std::wstring exePath;
};

std::vector EnumProcesses() {
    std::vector result;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == INVALID_HANDLE_VALUE) return result;

    PROCESSENTRY32W pe32 = { sizeof(pe32) };
    if (Process32FirstW(hSnap, &pe32)) {
        do {
            ProcessInfo info;
            info.pid = pe32.th32ProcessID;
            info.ppid = pe32.th32ParentProcessID;
            info.exeName = pe32.szExeFile;
            
            // 獲取完整路徑(需OpenProcess權限)
            HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, info.pid);
            if (hProc) {
                WCHAR path[MAX_PATH];
                DWORD len = MAX_PATH;
                if (QueryFullProcessImageNameW(hProc, 0, path, &len))
                    info.exePath = path;
                CloseHandle(hProc);
            }
            result.push_back(info);
        } while (Process32NextW(hSnap, &pe32));
    }
    CloseHandle(hSnap);
    return result;
}

進階應用場景

1. 進程樹構建

利用th32ParentProcessID構建父子關係樹,適用於任務管理器式顯示。

2. 模塊枚舉檢測注入

// 切換快照標誌為TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
MODULEENTRY32W me32 = { sizeof(me32) };
if (Module32FirstW(hSnap, &me32)) {
    do {
        // 檢查me32.szModule、me32.modBaseAddr、me32.modBaseSize
        // 對比已知合法模塊列表發現異常DLL
    } while (Module32NextW(hSnap, &me32));
}

3. 線程級監控

TH32CS_SNAPTHREAD配合THREADENTRY32獲取線程入口地址、優先級、CPU時間。

常見問題排查

  • 權限不足:OpenProcess失敗返回ERROR_ACCESS_DENIED,需SeDebugPrivilege或以管理員運行
  • 64位進程枚舉:32位調試器下調用CreateToolhelp32Snapshot需包含TH32CS_SNAPALL或編譯為64位程序
  • 快照一致性:快照是瞬間副本,高併發場景下進程創建/退出可能導致漏報/重複
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved