1. 程式人生 > >014 進程遍歷

014 進程遍歷

snap .dll flags function start tool more path 創建

進程遍歷
  ● 枚舉
    ○ 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

ValueMeaning
LF32_FIXED

固定的內存塊,不可移動位置

LF32_FREE

沒有被使用的內存塊

LF32_MOVEABLE

可移動的內存塊,可移動位置


      ○ HEAPLIST32 堆

1 typedef struct tagHEAPLIST32 {
2   SIZE_T    dwSize;          //結構體大小
3 DWORD th32ProcessID;      //進程標識符 4 ULONG_PTR th32HeapID;        //堆標識符 5 DWORD dwFlags;          //標誌位 6 } HEAPLIST32, *PHEAPLIST32;

dwFlags

ValueMeaning
HF32_DEFAULT

進程默認堆


      ○ 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 進程遍歷