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。

  • 相关阅读:
    电脑不能连接到热点
    常用网络协议
    HVV面试
    【转载】hacker术语
    渗透测试学习路线
    系统安全——可信计算
    rsync文件同步详解
    rabbitmq集群部署高可用配置
    ansible自动化部署之路笔记
    ELK-elasticsearch-6.3.2部署
  • 原文地址:https://www.cnblogs.com/M-Anonymous/p/9710921.html
Copyright © 2011-2022 走看看