.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
Value | Meaning |
---|---|
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
Value | Meaning |
---|---|
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 2#include 3#include 4#include 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 进程遍历
来源: http://www.bubuko.com/infodetail-2114157.html