进程枚举技术

摘要:
DWORDth32ProcessID//流程快照中的流程标识符。TH32CS_SNAPHEAPLIST包括快照中th32ProcessID中指定的进程的所有堆。此参数可以为零,以指示当前进程。Process32First()描述:函数:检索有关系统快照中遇到的第一个进程的信息。DWORDcntThreads;//进程启动的执行线程数。LONGpcPriClassBase;//此进程创建的任何线程的基本优先级。CHARszExeFile[MAX_PATH];//进程可执行文件的名称。DWORDth32进程ID;//要检查其模块的进程的标识符。DWORDGLblcntUsage//加载的模块数,通常设置为0xFFFF。

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。

免责声明:文章转载自《进程枚举技术》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]Quartus和Modelsim仿真ROM模块SAP MM模块相关透明表收集下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何在Win10上永久禁用Windows Defender Antivirus

1.使用Windows键+ R键盘快捷键打开运行命令。 2.键入regedit,然后单击确定以打开注册表。 3.浏览以下路径: HKEY_LOCAL_MACHINE/SOFTWARE/Policies/Microsoft/Windows Defender 4.右键单击Windows Defender(文件夹)键,选择新建,然后单击DWORD(32位)值。 ...

在VC中使用Windows管道技术编程

不知你是否用过这样的程序,他们本身并没有解压缩的功能,而是调用DOS程序PKZIP完成ZIP包的解压缩。但是在程序运行时又没有DOS控制台的窗口出现而且一切本应该在DOS下显示的信息都出现在了那个安装程序的一个文本框里。这种设计既美观又可以防止少数眼疾手快的用户提前关了你的DOS窗口。  现在就来讨论一下,如何用匿名管道技术实现这个功能。  管道技术由来...

2.汇编语言--masn代码基本结构、数值概念、位运算

 代码基本结构: ; .586 指令集 分号是注释 .586 ; MODEL 后面加 内存模式flat 和语言模式stdcall +其他模式(可以没有) ; 调用约定 flat内存使用方式 stdcall:win32 .MODEL flat, stdcall ;includelib +包含的静态库lib,链接库 系统api includelib...

win10 优化批处理

@ECHO off ECHO 关闭自动修复 bcdedit /set recoveryenabled NO echo 完成 ECHO 关闭Windows Defender reg add "HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindows Defender" /v "DisableAntiSpywar...

IDA,很好很强大

IDA,这款可以把程序反编译成C语言的东西。。 我用我们老师C++课上留的一道小学奥赛水平的弱智题的程序代码为例,先用MinGW编译,结果用IDA反编译出了几千个函数,全都是sub_加编号的名称,每一个都很短,变量名都是v1、v2等等的,一点也看不懂,我甚至连主函数在哪里都找不到。 然后又用VS2010编译,再反编译,令我大开眼界,函数名、变量名全能被...

Windows Update服务启动方法

问题描述 在离线安装Windows功能时,报错1058,无法启动服务。实际上就是无法启动Windows Update服务(服务名是wuauserv),如下图: 异常环境下,在系统服务中Windows Update服务右键无法启动,无法停止,无法重启(凡是此类特征的服务一般都是注册表相关的项、值等出了问题。)下图为正常环境的Windows Update服务...