C/C++遍历进程和进程ID的小工具

黄舟
黄舟 原创
2017-01-22 14:06:07 1396浏览

当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID

对于上述功能,我们先介绍几个API


1.CreateToolhelp32Snapshout function

得到进程、模块或者线程的快照

语法如下:

HANDLE WINAPI CreateToolhelp32Snapshot(  
  _In_ DWORD dwFlags,  
  _In_ DWORD th32ProcessID  
);

第一个参数:快照中包含了系统的一部分,参数如下:

744.png


745.png

我们这里用TH32CS_SNAPPROCESS

快照包含了系统里面的所有进程。


第二个是关于 PROCESSENTRY32结构体

语法如下:

typedef struct tagPROCESSENTRY32 {  
  DWORD     dwSize;  
  DWORD     cntUsage;  
  DWORD     th32ProcessID;  
  ULONG_PTR th32DefaultHeapID;  
  DWORD     th32ModuleID;  
  DWORD     cntThreads;  
  DWORD     th32ParentProcessID;  
  LONG      pcPriClassBase;  
  DWORD     dwFlags;  
  TCHAR     szExeFile[MAX_PATH];  
} PROCESSENTRY32, *PPROCESSENTRY32;

这描述了一个入口,这个入口是当快照被调用时系统地址空间里面的进程被读取。


这里只介绍szExeFile[MAX_PATH]和

th32ParentProcessID:这是创建进程后的进程的标识(父进程)

szExeFile:进程里面可执行文件的名字


下面是源代码!部分函数没有讲解,但可以通过注释或者字面意思可以了解

#include <Windows.h>  
#include <stdio.h>  
#include <TlHelp32.h>  
  
int main()  
{  
    HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
    if (hProceessnap == INVALID_HANDLE_VALUE)  
    {  
        printf_s("创建进行快照失败\n");  
        return -1;  
    }  
    else  
    {  
        PROCESSENTRY32 pe32;  
        pe32.dwSize = sizeof(pe32);  
        BOOL hProcess = Process32First(hProceessnap, &pe32);  
        char buff[1024];  
        while (hProcess)  
        {  
            wsprintf(buff, "进程名:%s--------------------进程ID:%d", pe32.szExeFile, pe32.th32ParentProcessID);  
            printf_s("%s\n", buff);  
            memset(buff, 0x00, 1024);  
            hProcess = Process32Next(hProceessnap, &pe32);  
        }  
    }  
    CloseHandle(hProceessnap);  
  
    return 0;  
}

运行结果如下


746.png

以上就是C/C++遍历进程和进程ID的小工具的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。