首页 > 系统相关 >7.3 通过API枚举进程

7.3 通过API枚举进程

时间:2023-09-23 11:06:25浏览次数:31  
标签:快照 PID 信息 TH32CS 7.3 枚举 API 线程 进程

首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如PID、线程数量、线程ID等),在对这些信息进行处理后,可以获得很多有用的数据,如当前系统中所有正在执行的进程的信息列表,以及每个进程各自的详细信息(如CPU、内存占用量等)。

CreateToolhelp32Snapshot 函数原型如下:

HANDLE CreateToolhelp32Snapshot(
  DWORD dwFlags,  // 快照类型标记
  DWORD th32ProcessID  // 进程PID,如果打算捕获系统所有进程的信息,则为0
);

参数说明:

  • dwFlags:表示快照类型标记。可以为TH32CS_SNAPALL、TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD。其中:
  • TH32CS_SNAPPROCESS:捕获当前系统中所有进程的信息;
  • TH32CS_SNAPTHREAD:捕获当前系统中所有线程的信息;
  • TH32CS_SNAPALL:捕获当前系统中所有进程和线程的信息;
  • th32ProcessID:进程PID,如果打算捕获系统所有进程的信息,则为0。

函数的返回值是一个句柄,它指向一个新创建的进程快照。如果函数调用失败,函数返回INVALID_HANDLE_VALUE。这个函数通常与Process32First()Process32Next()一起使用,用于枚举进程和线程信息的快照。通过使用创建的进程快照句柄和枚举处理函数,可以获取当前系统中所有进程或线程的详细信息。

  • Process32First 获取快照中第一条记录,即第一个进程的信息,执行成功返回TRUE,并把第一个进程信息写入传入参数PE32指定的结构体中;
  • Process32Next 获取下一个进程的信息,执行成功返回TRUE,并把下一个进程信息写入传入参数PE32指定的结构体中;
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>

int EnumProcess()
{
  PROCESSENTRY32 pe32 = { 0 };
  pe32.dwSize = sizeof(PROCESSENTRY32);

  // 获取全部进程快照
  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (INVALID_HANDLE_VALUE != hProcessSnap)
  {
    // 获取快照中第一条信息
    BOOL bRet = Process32First(hProcessSnap, &pe32);
    while (bRet)
    {
      printf("进程ID: %-5d --> 进程名: %s \n", pe32.th32ProcessID, pe32.szExeFile);
      // 获取快照中下一条信息
      bRet = Process32Next(hProcessSnap, &pe32);
    }
    CloseHandle(hProcessSnap);
  }
  return -1;
}

int main(int argc,char * argv [])
{
  EnumProcess();

  system("pause");
  return 0;

}

上述代码可用于枚举输出当前系统中所有的正在运行进程列表,通过在枚举过程中增加一个_tcsicmp()函数,判断pe.szExeFileszProcessName两者的值我们就可以实现取特定进程的PID,如下代码所示则可实现取QQ进程的PID信息。

#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
#include <tchar.h>

DWORD FindProcessID(LPCTSTR szProcessName)
{
  DWORD dwPID = 0xFFFFFFFF;
  HANDLE hSnapShot = INVALID_HANDLE_VALUE;
  PROCESSENTRY32 pe;
  pe.dwSize = sizeof(PROCESSENTRY32);
  hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
  Process32First(hSnapShot, &pe);
  do
  {
    if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
    {
      dwPID = pe.th32ProcessID;
      break;
    }
  } while (Process32Next(hSnapShot, &pe));
  CloseHandle(hSnapShot);
  return dwPID;
}

int main(int argc,char *argv[])
{
  DWORD PID = FindProcessID(L"qq.exe");
  printf("该进程PID是: %d \n", PID);

  system("pause");
  return 0;
}

本文作者: 王瑞 本文链接: https://www.lyshark.com/post/54a95c77.html 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

标签:快照,PID,信息,TH32CS,7.3,枚举,API,线程,进程
From: https://blog.51cto.com/lyshark/7576499

相关文章

  • 7.4 通过API枚举进程权限
    GetTokenInformation用于检索进程或线程的令牌(Token)信息。Token是一个数据结构,其包含有关进程或线程的安全上下文,代表当前用户或服务的安全标识符和权限信息。GetTokenInformation函数也可以用来获取这些安全信息,通常用于在运行时检查某个进程或线程的权限或安全信息。该函数原......
  • 7.3 通过API枚举进程
    首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如PID、线程数量、线程ID等),在对这些信息进行处理后,可以获得很多有用的数据,如当前系统中所有正在执行的进......
  • 7.4 通过API枚举进程权限
    GetTokenInformation用于检索进程或线程的令牌(Token)信息。Token是一个数据结构,其包含有关进程或线程的安全上下文,代表当前用户或服务的安全标识符和权限信息。GetTokenInformation函数也可以用来获取这些安全信息,通常用于在运行时检查某个进程或线程的权限或安全信息。该函数......
  • 访问api地址时添加cookie头,防止cookie刷新
    putSession(){wx.request({url:'http://127.0.0.1:8000/api/test1',success(res){console.log(res);wx.setStorageSync('session',res.cookies)},dataType:'json'})},get......
  • Apipost最佳实践
    自诞生以来,Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作,让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法,帮助大家更好地了解这款优秀的API开发工具。下载安装直接进入Apipost官网下载即可,也可以直接使用web端无需下......
  • 2023-09-22 uniapp之canvas调用api【uni.canvasToTempFilePath】报错返回:canvasToTemp
    canvasToTempFilePath:失败-失败画布为空一般的解决方案就是查看uni.canvasToTempFilePath的传参是否正确,一个是canvasId必须正确,另一个就是第二个参数为this;但事情显示没那么简单,这二者我都有填写,却仍旧报这个错,我把canvasid换成别的,最后我想起了一件事情,就是canvas为空是因为......
  • FastAPI Request中存储信息
    在请求前拦截,检测token使用Request.state.XXX存信息fromfastapiimportRequest,FastAPIfrompy_jwt.use_jwtimportdecode_tokende......
  • 枚举与类的区别
    枚举的构造方法是私有的private修饰可以,public修饰报错类的构造方法是公有的public修饰2说到枚举只能私有构造,所以如果枚举类里定义抽象方法,每个实例里边都需要实现这个方法如果要实现一个接口,每个实例方法里边也要实现接口里的所有方法如果枚举类里定义了普通方法,实例是......
  • 在线问诊 Python、FastAPI、Neo4j — 创建 节点关系
    目录关系:症状-检查关系:疾病-症状代码重构relationship_data.csv症状,检查,疾病,药品,宜吃,忌吃"上下楼梯疼,不能久站,感觉有点肿","膝关节核磁","右膝髌上囊及关节腔少量积液","扶他林","西红柿,香蕉","辣椒,大蒜""眼睛胀痛,干涩,畏光,眼胀,眼痛,看东西有时候清楚有时候不清楚......
  • 7.1 实现进程内存块枚举
    在Windows操作系统中,每个进程的虚拟地址空间都被划分为若干内存块,每个内存块都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过VirtualQueryEx函数查询得到。该函数可用于查询进程虚拟地址空间中的内存信息的函数。它的作用类似于Windows操作系统中的TaskManager中......