014 进程遍历

[亡魂溺海] 提交于 2020-04-06 22:05:52

进程遍历 
  ● 枚举
    ○ 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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!