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

47 篇文章 38 订阅

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

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


1.CreateToolhelp32Snapshout function

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

语法如下:

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

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



我们这里用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;
}

运行结果如下


C++ 中,遍历所有运行中的进程并获取特定类型的句柄,通常涉及操作系统级别的操作,比如使用 Windows API(如 CreateToolhelp32Snapshot 和 Process32First 等函数)或 Linux 下的 `/proc` 文件系统。以下是使用 Windows API 的一个简化示例: ```cpp #include <windows.h> #include <tchar.h> void ListProcessHandles(DWORD processType, HANDLE* handles) { DWORD snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot, &pe32)) { do { if (pe32.th32ProcessID != GetCurrentProcessId() && !IsBadHandle(pe32.hProcess)) { // 检查进程是否是我们感兴趣的类型 if ((processType == 0 || pe32.th32ProcessID == processType) && pe32.th32Threads > 0) { *handles = OpenProcess(processType, FALSE, pe32.th32ProcessID); // 获取句柄 if (!IsBadHandle(*handles)) { // 打印或处理句柄 _tcprintf(_T("Process %u has handle: %p\n"), pe32.th32ProcessID, *handles); } else { _tcprintf(_T("Failed to open process handle for process %u.\n"), pe32.th32ProcessID); } } } } while (Process32Next(snapshot, &pe32)); CloseHandle(snapshot); } else { _tcprintf(_T("Failed to get the first process entry.\n")); } } // 示例中 processType 可能取值:CREATE_PROCESS, THREAD_BASE_PRIORITY_POSTION,等 int main() { HANDLE handles[100]; // 定义足够大的数组存储句柄 ListProcessHandles(CREATE_PROCESS, handles); return 0; } ``` 在这个示例中,`processType` 参数是一个常量,代表你想要获取的句柄类型,例如 CREATE_PROCESS、THREAD_BASE_PRIORITY_POSTION 等。 请注意,这只是一个基础示例,并非实际项目中的完整代码,它需要适当地错误处理以及权限管理。同时,在 Linux 上,你可以通过 `"/proc/" + pid + "/maps"` 来查看进程内存映射,但这并不是直接获取句柄。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值