7.3 通过API枚举进程

通过,api,枚举,进程 · 浏览次数 : 10

小编点评

**代码概述** 该代码提供了一种使用 CreateToolhelp32Snapshot() 函数枚举当前系统中所有进程信息的方法。该函数使用 TH32CS_SNAPPROCESS 模式创建进程快照,并从快照中提取进程 ID、进程名称、CPU 占用量等信息。 **关键代码** ```c HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID) { // ... } void EnumProcess() { // Create a snapshot of all processes. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Get the first process information. BOOL bRet = Process32First(hProcessSnap, &pe32); // Print process ID and name. printf("进程ID: %-5d --> 进程名: %s \\", pe32.th32ProcessID, pe32.szExeFile); // Get next process information. while (bRet) { // Check if the process name matches the target process name. if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile)) { // Get the process ID. dwPID = pe.th32ProcessID; break; } // Get next process information. bRet = Process32Next(hProcessSnap, &pe32); } // Clean up the snapshot. CloseHandle(hProcessSnap); } ``` **用法** ```c int main() { EnumProcess(); return 0; } ``` **注意** 该代码需要包含 Windows 库,包括 `Windows.h`、`stdio.h` 和 `TlHelp32.h`。

正文

首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用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 许可协议。转载请注明出处!

与7.3 通过API枚举进程相似的内容:

7.3 通过API枚举进程

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

10.3 调试事件转存进程内存

我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数据,使其不易被分析。在这种情况下,通过进程转储功能,可以将加壳程序的内存镜像完整地保存到本...

Libgdx游戏开发(3)——通过柏林噪音算法地图随机地形

原文: Libgdx游戏开发(3)——通过柏林噪音算法地图随机地形-Stars-One的杂货小窝 在B站刷到了随机地图生成的视频,随手学习下并做下记录 注: 本篇使用javafx应用作演示,算是了解这个算法的使用,后续会再出篇libgdx生成地图的示例 说明 抛开算法实现,首先认知柏林噪音算法 一般

Mesh快连

Mesh快连 一、名词解释 Mesh快连是一种由多个节点组成的网络系统,这些节点可以相互连接,形成一个“网状”的结构。 二、如何使用 有线Mesh: 网络拓扑: 设备版本:3.7.12企业版。 配置要求:从设备需恢复默认配置。 拓扑说明:设备接入电源,Q6000作为主设备通过LAN口连接从设备Q30

[转帖]vm内核参数之缓存回收drop_caches

注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 1、关于drop_caches 通常在内存不足时,我们习惯通过echo 3 > /proc/sys/vm/drop_caches 的方式手动清理系统缓存, [root@localhost ~]# free -m total

8.3 NtGlobalFlag

NtGlobalFlag 是一个`Windows`内核全局标记,在`Windows`调试方案中经常用到。这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关、造成崩溃的错误代码和处理方式等等。通过改变这个标记,可以在运行时设置和禁用不同的调试技术和错误处理方式,比如调试器只能访问当前进程、只允许用户模式调试、启用特定的错误处理方式等等。但由于`NtGlobalFlag`标记是内核全局标记

NetMvc通过亚马逊方式服务器端和客户端上传MinIO顺利解决

前言: 1、由于项目是.NET Framework 4.7 MVC LayUI,所以需要找一个资源站点存放项目中静态资源文件; 2、需要支持服务端和客户端都支持上传文件方式; 3、调用简单,涉及库越少越好。 结果: 调用 AWSSDK.S3 和 AWSSDK.Core 实现文件上传到 MinIO ;

[转帖]Sql Server中通过sql命令获取cpu占用及产生锁的sql

https://www.jb51.net/article/266255.htm 这篇文章主要介绍了Sql Server中通过sql命令获取cpu占用及产生锁的sql,需要的朋友可以参考下 获取SQLSERVER中产生锁的SQL语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1

软件设计模式系列之十九——中介者模式

@目录1 模式的定义2 举例说明3 结构4 实现步骤5 代码实现6 典型应用场景7 优缺点8 类似模式9 小结 1 模式的定义 中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更加可维护和扩展。中介者

[转帖]RHEL7 (centos 7)进入救援模式

在硬盘不能启动的时候,就要选择用其他介质(比如光盘)进入救援模式 1、救援模式作用: 更改root密码; 恢复硬盘、文件系统操作 系统无法启动时,通过救援模式启动 2、放入系统光盘,进入BIOS,设置从光盘启动: 3、选择救援模式 “troubleshooting” ==> "Rescue a Re