首页 > 代码库 > 014 进程遍历
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 进程遍历