进程遍历
● 枚举
○ 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
○ HEAPLIST32 堆
1 typedef struct tagHEAPLIST32 {
2 SIZE_T dwSize; //结构体大小
3 DWORD th32ProcessID; //进程标识符
4 ULONG_PTR th32HeapID; //堆标识符
5 DWORD dwFlags; //标志位
6 } HEAPLIST32, *PHEAPLIST32;
dwFlags
○ 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 }
来源:https://www.cnblogs.com/sdk123/p/6984173.html