014 進程遍歷
進程遍歷
● 枚舉
○ Windows API
○ 數據庫 -> 註冊表來訪問 -> RegQuery函數來獲取
○ ToolHelp庫
○ 兼容性比較好
○ WIndows 95 就存在
○ Process Startus庫 EnumProcess 函數 PSAPI.DLL
● Tool Help Reference
○ Tool Help Structures
○ 結構體
○ HEAPENTRY32
1 typedef struct tagHEAPENTRY32 {2 SIZE_T dwSize; //結構體大小 3 HANDLE hHandle; //堆塊句柄 4 ULONG_PTR dwAddress; //堆塊開始的地址 5 SIZE_T dwBlockSize; //堆塊的大小 6 DWORD dwFlags; //標誌位 7 DWORD dwLockCount; //不再被使用的 總是設置為0 8 DWORD dwResvd; //保留位不再被使用 9 DWORD th32ProcessID; //使用堆的進程的標識符。10 ULONG_PTR th32HeapID; //堆標識符。這不是句柄,只對工具幫助函數有意義。 11 } HEAPENTRY32, *PHEAPENTRY32;
dwFlags
Value | Meaning |
---|---|
|
固定的內存塊,不可移動位置 |
|
沒有被使用的內存塊 |
|
可移動的內存塊,可移動位置 |
○ HEAPLIST32 堆
1 typedef struct tagHEAPLIST32 { 2 SIZE_T dwSize; //結構體大小3 DWORD th32ProcessID; //進程標識符 4 ULONG_PTR th32HeapID; //堆標識符 5 DWORD dwFlags; //標誌位 6 } HEAPLIST32, *PHEAPLIST32;
dwFlags
Value | Meaning |
---|---|
|
進程默認堆 |
○ MODULEENTRY32 模塊 任何一個進程都是由多個模塊
1 typedef struct tagMODULEENTRY32 { 2 DWORD dwSize; //結構體大小 3 DWORD th32ModuleID; //這個成員不再被使用,並且總是被設置為1。 4 DWORD th32ProcessID; //模塊的進程的標識符 5 DWORD GlblcntUsage; //模塊的負載計數,通常不太有意義,通常等於0xFFFF。 6 DWORD ProccntUsage; //模塊的負載計數,通常不太有意義,通常等於0xFFFF。 7 BYTE *modBaseAddr; //模塊的基本地址在擁有過程的上下文中。 8 DWORD modBaseSize; //模塊大小 9 HMODULE hModule; //在擁有過程的上下文中對模塊的句柄。 10 TCHAR szModule[MAX_MODULE_NAME32 + 1]; //模塊名字 11 TCHAR szExePath[MAX_PATH]; //模塊地址 12 } MODULEENTRY32, *PMODULEENTRY32;
○ PROCESSENTYR32 進程
1 typedef struct tagPROCESSENTRY32 { 2 DWORD dwSize; //結構體大小 3 DWORD cntUsage; //這個成員不再使用,並且總是被設置為0。 4 DWORD th32ProcessID; //進程標識符 5 ULONG_PTR th32DefaultHeapID; //這個成員不再使用,並且總是被設置為0. 6 DWORD th32ModuleID; //這個成員不再使用,並且總是被設置為0. 7 DWORD cntThreads; //進程啟動,執行的線程數 8 DWORD th32ParentProcessID; //創建這個過程的過程的標識符(它的父進程)。 9 LONG pcPriClassBase; //這個過程創建的任何線程的基本優先級。 10 DWORD dwFlags; //這個成員不再使用,並且總是被設置為零。 11 TCHAR szExeFile[MAX_PATH]; //進程的可執行文件的名稱。要檢索可執行文件的完整路徑 12 } PROCESSENTRY32, *PPROCESSENTRY32;
○ THREADENTRY32 線程
1 typedef struct tagTHREADENTRY32 { 2 DWORD dwSize; //結構體大小 3 DWORD cntUsage; //這個成員不再使用,並且總是被設置為零。 4 DWORD th32ThreadID; //線程標識符 5 DWORD th32OwnerProcessID; //創建線程的進程的標識符。 6 LONG tpBasePri; //線程優先級 0最小 31最大 7 LONG tpDeltaPri; //這個成員不再使用,並且總是被設置為零。 8 DWORD dwFlags; //這個成員不再使用,並且總是被設置為零。 9 } THREADENTRY32, *PTHREADENTRY32;
● Tool Help Function
○ CreateToolhelp32Snapshot //創建當前進程快照
○ Heap32First //檢索由進程分配的堆的第一個塊的信息。
○ Heap32ListFirst //檢索由指定進程分配的第一個堆的信息。
○ Heap32ListNext //檢索由進程分配的下一堆的信息。
○ Heap32Next //檢索一個進程分配的下一個堆的信息。
○ Module32First //檢索有關進程的第一個模塊的信息。
○ Module32Next //檢索與進程或線程相關的下一個模塊的信息。
○ Process32First //檢索系統快照中遇到的第一個進程的信息。
○ Process32Next //檢索系統快照中記錄的下一個進程的信息。
○ Thread32First //檢索系統快照中記錄的第一個線程信息
○ Thread32Next //檢索系統快照中記錄的下一個線程信息
○ Toolhelp32ReadProcessMemory //將分配給另一個進程的內存復制到應用程序提供的緩沖區。
● Process32First function
1 #include <windows.h> 2 #include <tlhelp32.h> 3 #include <tchar.h> 4 #include <stdio.h> 5 6 int main( void ) 7 { 8 //創建系統快照 9 HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 10 if( hProcessSnap == INVALID_HANDLE_VALUE ) 11 { 12 printf("創建系統快照錯誤代碼:%d", GetLastError()); 13 } 14 PROCESSENTRY32 pe32 = {0}; 15 pe32.dwSize = sizeof(PROCESSENTRY32); 16 if(!Process32First(hProcessSnap, &pe32)) 17 { 18 DWORD dwError = GetLastError(); 19 if(dwError == ERROR_NO_MORE_FILES) 20 { 21 //沒有任何快照信息 22 } 23 } 24 25 do 26 { 27 _tprintf(TEXT("PID:%d\t"), pe32.th32ProcessID); 28 _tprintf(TEXT("File:%s\r\n"),pe32.szExeFile); 29 if(!_tcscmp(TEXT("QQ.exe"), pe32.szExeFile)) 30 { 31 HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID); 32 if(hModuleSnap == INVALID_HANDLE_VALUE) 33 { 34 } 35 MODULEENTRY32 me32 = {0}; 36 me32.dwSize = sizeof(MODULEENTRY32); 37 /* 38 if(Module32First(hModuleSnap.&me32)) 39 { 40 } 41 */ 42 do 43 { 44 _tprintf(TEXT("Module Name:%s\t"), me32.szModule); 45 _tprintf(TEXT("Module Base: 0x%x\t"),me32.modBaseAddr); 46 _tprintf(TEXT("Module Path:%s\r\n"),me32.szExePath); 47 } 48 while(Module32Next(hModuleSnap,&me32)); 49 CloseHandle(hModuleSnap); 50 } 51 }while (Process32Next(hProcessSnap,&pe32)); 52 CloseHandle(hProcessSnap); 53 return 0; 54 }
014 進程遍歷