进程枚举技术

Posted m-anonymous

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程枚举技术相关的知识,希望对你有一定的参考价值。

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
",pe32.szExeFile);
        hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
        bModule = Module32First(hModuleSnap,&me32);
        while(bModule)
        {
            printf("	%s
",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。

 




























以上是关于进程枚举技术的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

如何通过进程id枚举到所有的窗口

隐蔽的恶意代码启动

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

代码片段:Shell脚本实现重复执行和多进程

ZwQueryVirtualMemory枚举进程模块