7.3 通过API枚举进程

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

首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用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月前
|
安全 API
7.4 通过API枚举进程权限
GetTokenInformation 用于检索进程或线程的令牌(Token)信息。Token是一个数据结构,其包含有关进程或线程的安全上下文,代表当前用户或服务的安全标识符和权限信息。GetTokenInformation函数也可以用来获取这些安全信息,通常用于在运行时检查某个进程或线程的权限或安全信息。
62 1
|
5月前
|
存储 SQL Shell
【OSTEP】Abstraction Process | 进程 | 虚拟化 | 进程API
【OSTEP】Abstraction Process | 进程 | 虚拟化 | 进程API
30 0
|
4月前
|
Java API 调度
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
55 0
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
|
7月前
|
安全 API Windows
7.2 通过API创建新进程
创建新的进程是`Windows`程序开发的重要部分,它可以用于实现许多功能,例如进程间通信、并行处理等。其中,常用的三种创建进程的方式分别是`WinExec()`、`ShellExecute()`和`CreateProcessA()`,这三种创建进程的方式各有特点。如果需要创建简单进程或从其他程序启动新进程,可以使用`WinExec()`或`ShellExecute()`函数。如果需要对新进程进行更精细的配置,例如控制进程参数、指定安全级别、传递特定的命令和参数等,可以使用`CreateProcessA()`函数。
70 0
|
11月前
|
Unix Shell API
Unix 进程 API 介绍
Unix 进程 API 介绍
108 0
|
Java API 调度
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
每一个线程都是一个执行流,都按照自己的顺序执行自己的代码,多个线程之间“同时”(并发并行)的执行多份代码。Java中的线程是以轻量级进程来实现的。
Java多线程基础(线程与进程的区别,线程的创建方式及常用api,线程的状态)
|
API Windows 机器学习/深度学习
windows api学习笔记-遍历系统进程,获取进程名称和ID(进程快照)
#include //系统会自动连接到指定的库文件lib #include //声明快照函数的头文件 #include //std io 标准输入输出接口 #include using namespace std; int main() { PROCESSENTRY32 pe32; pe32.
1167 0
|
测试技术 API Windows
利用global API hooks在Win7系统下隐藏进程
本文讲的是利用global API hooks在Win7系统下隐藏进程,在之前的文章《Powershell tricks::Hide Process by kd.exe》介绍过通过kd.exe隐藏进程的技巧,最大的缺点是需要开启Local kernel debugging模式,等待重启才能生效
1753 0
|
网络协议 Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.9 服务器进程未运行
我们下一个要检查的情形是在不启动服务器的前提下启动客户。如果我们这么做后在客户上键入一行文本,那么什么也不发生。客户永远阻塞于它的recvfrom调用,等待一个永不出现的服务器应答。然而这是一个很好的例子,它要求我们更多地了解底层协议以理解网络应用进程将发生什么。
1672 0