zoukankan      html  css  js  c++  java
  • 进程枚举技术

    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。

  • 相关阅读:
    新概念第二册(1)--英语口语听力课1
    外企面试课程(一)---熟悉常见的缩略词
    公司 邮件 翻译 培训 长难句 结课
    workflow
    公司 邮件 翻译 培训 长难句 20
    公司 邮件 翻译 培训 长难句 19
    Engineering Management
    公司 邮件 翻译 培训 长难句 18
    公司 邮件 翻译 培训 长难句 17
    第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头
  • 原文地址:https://www.cnblogs.com/M-Anonymous/p/9710921.html
Copyright © 2011-2022 走看看