进程枚举技术
1、快照方式枚举进程
CreateToolhelp32Snapshot() 介绍:
功能:获取指定进程的快照, 以及这些进程使用的堆、模块和线程。
函数原型:HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags, // 系统快照的某些部分。
DWORD th32ProcessID // 进程快照中的进程标识符。
);
参数 dwFlags:
值 | 含义 |
TH32CS_INHERIT | 指示快照句柄是可继承的。 |
TH32CS_SNAPALL | 包括系统中的所有进程和线程, 以及 th32ProcessID 中指定的进程的堆和模块。 |
TH32CS_SNAPHEAPLIST | 包括快照中 th32ProcessID 中指定的进程的所有堆。 |
TH32CS_SNAPMODULE | 包括快照中 th32ProcessID 中指定的进程的所有模块。 |
TH32CS_SNAPMODULE32 | 在从64位进程调用时, 包括快照中 th32ProcessID 中指定的进程的所有32位模块。 |
TH32CS_SNAPPROCESS | 包括快照中系统中的所有进程。 |
TH32CS_SNAPTHREAD | 包括快照中系统中的所有线程。 |
参数 th32ProcessID:
要包括在快照中的进程的进程标识符。此参数可以为零以指示当前进程。
当指定了 TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPMODULE32
或 TH32CS_SNAPALL 值时, 将使用此参数。否则, 它将被忽略, 并且所有进程都包含在快照中。
Process32First() 介绍:
功能:检索有关系统快照中遇到的第一个进程的信息。
函数原型:BOOL Process32First(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPPROCESSENTRY32 lppe // 指向 PROCESSENTRY32 结构的指针。
);
参数 lppe:
PROCESSENTRY32 结构体:
typedef struct tagPROCESSENTRY32 { DWORD dwSize; // 该结构体的大小。 DWORD cntUsage; // 必须为 0。 DWORD th32ProcessID; // 进程标识符。 ULONG_PTR th32DefaultHeapID; // 必须为 0。 DWORD th32ModuleID; // 必须为 0。 DWORD cntThreads; // 进程启动的执行线程数。 DWORD th32ParentProcessID; // 创建此进程的进程的标识符。 LONG pcPriClassBase; // 此进程创建的任何线程的基本优先级。 DWORD dwFlags; // 必须为 0。 CHAR szExeFile[MAX_PATH]; // 进程的可执行文件的名称。 } PROCESSENTRY32;
返回值:如果进程列表的第一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Process32Next() 介绍:
功能:检索有关系统快照中记录的下一个进程的信息。
函数原型:BOOL Process32Next(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPPROCESSENTRY32 lppe // 指向 PROCESSENTRY32 结构体的指针。
);
返回值:如果进程列表的下一项已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Module32First() 介绍:
功能:检索有关与进程关联的第一个模块的信息。
函数原型:BOOL Module32First(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPMODULEENTRY32 lpme // 指向 MODULEENTRY32 结构体的指针。
);
参数 lpme:
MODULEENTRY32 结构体:
typedef struct tagMODULEENTRY32 { DWORD dwSize; // 该结构体的大小。 DWORD th32ModuleID; // 必须为 0。 DWORD th32ProcessID; // 要检查其模块的进程的标识符. DWORD GlblcntUsage; // 模块加载数目,通常设置为 0xFFFF。 DWORD ProccntUsage; // 同上。 BYTE *modBaseAddr; // 在所属进程的上下文中模块的基地址 DWORD modBaseSize; // 模块的大小. HMODULE hModule; // 在所属进程的上下文中对模块的句柄。 char szModule[MAX_MODULE_NAME32 + 1]; // 模块名称。 char szExePath[MAX_PATH]; // 模块路径。 } MODULEENTRY32;
返回值:如果模块列表的第一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Module32Next() 介绍:
功能:检索有关与进程或线程关联的下一个模块的信息。
函数原型:BOOL Module32Next(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPMODULEENTRY32 lpme // 指向 MODULEENTRY32 结构体的指针。
);
返回值:如果模块列表的下一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
DemoCode:
#include<windows.h> #include<stdio.h> #include<tlhelp32.h> BOOL GetProcessList(); int main(void) { GetProcessList(); return 0; } BOOL GetProcessList() { HANDLE hProcessSnap; HANDLE hModuleSnap; BOOL bRet = FALSE; BOOL bModule = FALSE; PROCESSENTRY32 pe32 = {0}; MODULEENTRY32 me32 = {0}; pe32.dwSize = sizeof(PROCESSENTRY32); me32.dwSize = sizeof(MODULEENTRY32); hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); bRet = Process32First(hProcessSnap,&pe32); while(bRet) { printf("%s\n",pe32.szExeFile); hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID); bModule = Module32First(hModuleSnap,&me32); while(bModule) { printf("\t%s\n",me32.szExePath); bModule = Module32Next(hModuleSnap,&me32); } bRet = Process32Next(hProcessSnap,&pe32); } CloseHandle(hProcessSnap); CloseHandle(hModuleSnap); return TRUE; }
类似的还有 Thread32First(),Thread32Next(),Heap32ListFirst(),Heap32ListNext()。
Thread32First() 介绍:
功能:检索有关系统快照中遇到的任何进程的第一个线程的信息。
函数原型:BOOL Thread32First(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPTHREADENTRY32 lpte // 指向 THREADENTRY32 结构体的指针。
);
参数 lpte:
THREADENTRY32 结构体:
typedef struct tagTHREADENTRY32 { DWORD dwSize; // 该结构体大小。 DWORD cntUsage; // 必须为 0。 DWORD th32ThreadID; // 线程标识符。 DWORD th32OwnerProcessID; // 创建该线程的进程的标识符。 LONG tpBasePri; // 分配给线程的内核基本优先级级别(0~31)(优先级最低为 0)。 LONG tpDeltaPri; // 必须为 0。 DWORD dwFlags; // 必须为 0。 } THREADENTRY32;
返回值:如果线程列表的第一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Thread32Next() 介绍:
功能:检索有关系统快照中遇到的任何进程的下一个线程的信息。
函数原型:BOOL Thread32Next(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPTHREADENTRY32 lpte // 指向 THREADENTRY32 结构体的指针。
);
返回值:如果线程列表的下一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Heap32ListFirst() 介绍:
功能:检索有关由指定进程分配的第一个堆的信息。
函数原型:BOOL Heap32ListFirst(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPHEAPLIST32 lphl // 指向 HEAPLIST32 结构体的指针。
);
参数 lphl:
HEAPLIST32 结构体:
typedef struct tagHEAPLIST32 { SIZE_T dwSize; // 该结构体的大小。 DWORD th32ProcessID; // 要检查的进程的标识符。 ULONG_PTR th32HeapID; // 堆标识符。 DWORD dwFlags; // 通常为 HF32_DEFAULT。 } HEAPLIST32;
返回值:如果堆列表的第一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。
Heap32ListNext() 介绍:
功能:检索有关由指定进程分配的下一个堆的信息。
函数原型:BOOL Heap32ListNext(
HANDLE hSnapshot, // 从先前调用 CreateToolhelp32Snapshot 函数返回的快照的句柄。
LPHEAPLIST32 lphl // 指向 HEAPLIST32 结构体的指针。
);
返回值:如果堆列表的下一个条目已复制到缓冲区则返回 TRUE,否则返回 FALSE。