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

VC++ 獲取進程模組資訊:ToolHelp32 快照遍歷完整實作

     編輯:VC++

核心原理:建立快照 → 遍歷進程 → 遍歷模組

  1. CreateToolhelp32Snapshot 建立系統快照
  2. Process32First/Next 遍歷進程,資訊於 PROCESSENTRY32
  3. CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid) 針對特定進程建立模組快照
  4. Module32First/Next 遍歷模組,資訊於 MODULEENTRY32

關鍵實作代碼

1. 開啟進程並讀取記憶體資訊

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
PROCESS_MEMORY_COUNTERS pmc;
pfGetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));

2. 獲取指定進程模組資訊

BOOL CEmuteFileDlg::GetProcessModule(DWORD dwPID, DWORD dwModuleID,
    LPMODULEENTRY32 lpMe32, DWORD cbMe32) {
    BOOL bRet = FALSE, bFound = FALSE;
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    if (hModuleSnap == INVALID_HANDLE_VALUE) return FALSE;

    MODULEENTRY32 me32 = {0}; me32.dwSize = sizeof(MODULEENTRY32);
    if (Module32First(hModuleSnap, &me32)) {
        do {
            if (me32.th32ModuleID == dwModuleID) {
                CopyMemory(lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        } while (!bFound && Module32Next(hModuleSnap, &me32));
        bRet = bFound;
    }
    CloseHandle(hModuleSnap);
    return bRet;
}

提升權限:啟用 SeDebugPrivilege

BOOL EnableDebugPrivilege() {
    HANDLE hToken; BOOL fOk = FALSE;
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
        TOKEN_PRIVILEGES tp = {1};
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
        fOk = (GetLastError() == ERROR_SUCCESS);
        CloseHandle(hToken);
    }
    return fOk;
}

待解決問題

作者提到:「很想知道怎麼獲取進程的執行緒模組名稱」。ToolHelp32 可透過 TH32CS_SNAPTHREAD 遍歷執行緒 (THREADENTRY32),但執行緒本身無模組概念;需結合模組快照與執行緒堆疊回溯 (StackWalk) 才能分析執行緒所在模組,屬進階除錯技術範疇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved