windows黑客编程系列(六):进程遍历之查询系统是否运行杀软

本文深入探讨了进程快照技术的实现原理与应用,详细介绍了Windows API中的CreateToolhelp32Snapshot、Process32First及PROCESS32Next函数,展示了如何通过这些技术遍历系统中的所有进程,并提供了检测杀毒软件运行状态的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能技术模块

病毒木马的入侵并潜伏在用户计算机上总是有着某种目的,例如获取用户隐私的办公文件或是账号密码,或是控制肉鸡,或是进行加密磁盘文件然后进行勒索。

进程遍历

进程遍历指的是获取在计算机系统上运行的所有进程信息,包括用户进程和系统进程。通过获取进程信息,可以判断是否存在杀软进程,是否有可利用进程,是否运行在虚拟机中,甚至可以分析用户的工作环境等,所以获取系统进程信息是一种不可获取的标志性功能。

本文介绍应用最广泛的进程快照技术来实现进程的遍历

WIN API


CreateToolhelp32Snapshot

获取进程信息为指定的进程、进程使用的堆,模块,线程建立一个快照

函数声明:

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

参数说明:

  • dwFlags:指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。
含义
TH32CS_INHERIT声明快照句柄是可继承的
TH32CS_SNAPALL在快照中包含系统中的所有进程和线程
TH32CS_SNAPHEAPLIST在快照中包含th32ProcessID中指定进程的所有堆
TH32CS_SNAPMODULE在快照中包含th32ProcessID中指定进程的所有模块
TH32CS_SNAPPROCESS在快照中包含系统中的所有进程
TH32CS_SNAPTHREAD在快照中包含系统中的所有线程
  • th32ProcessID:指定将要快照的进程ID,如果该参数为0,则表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下应该忽略该参数,快照所有进程。

返回值:

  • 执行成功,返回快照的句柄;
  • 执行失败,返回INVALID_HANDLE_VALUE;

Process32First

检索系统快照中遇到的第一个进程信息

函数声明:

BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe)

参数说明:

  • hSnapshot:处理快照句柄
  • lppe:指向PROCESSENTRY32结构的指针

返回值:

  • 执行成功,返回TRUE,表示进程列表的第一个条目已复制到缓冲区
  • 执行失败,返回FALSE,由GetLastError返回ERROR_NO_MORE_FILES错误值指示没有进程存在,或者快照不包含进程信息。

PROCESS32Next

检索系统快照中记录的下一个进程信息

函数原型:

BOOL WINAPI PROCESS32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe)

参数说明:

  • hSnapshot:快照句柄
  • lppe:指向PROCESSENTRY32结构的指针

返回值:

  • 如果进程列表的下一个条目已复制到缓冲区,则返回TRUE
  • 如果不存在任何进程或者快照不包含进程信息,则由GetLastError返回ERROR_NO_MORE_FILES错误值

编码实现

所谓快照,指的是过去某个时刻记录的计算机状态,包括进程,线程,堆等,系统的状态是在不断变化的,尤其是进行某些操作后。

快照一般用于恢复某个时间点的计算机状态,当你的系统出现某些错误后,就可以使用快照功能回滚当时的状态。例如:

  • windows系统中的还原点
  • VMware中的快照设置
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include "ConsoleApplication1.h"
#include <tchar.h>
#include <cstring>
#include <shlobj.h>
#include <tlhelp32.h>

BOOL Get_all_process()
{
	PROCESSENTRY32 pe32 = {};
	pe32.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hprocessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hprocessSnap == INVALID_HANDLE_VALUE)
	{
		printf("create snap error!\n");
		return FALSE;
	}
	BOOL bRet = Process32First(hprocessSnap, &pe32);
	while (bRet)
	{
		printf("[%d]\t[%ws]\n", pe32.th32ProcessID, pe32.szExeFile);
		bRet = Process32Next(hprocessSnap, &pe32);
	}
	CloseHandle(hprocessSnap);
		
	return TRUE;
}

int main()
{
	
	Get_all_process();
	return 0;
}

运行效果图

判断是否存在杀软

我们在获取进程列表后,是否可以更近一步,判断进程中是否存在杀软,得到明确信息后,更加方便我们的病毒进行决策

下面我们查询本机中的火绒和Defender的进程名称;

  • SecurityHealthSystray.exe(defender)
  • wsctrl.exe(火绒)
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include "ConsoleApplication1.h"
#include <tchar.h>
#include <cstring>
#include <shlobj.h>
#include <tlhelp32.h>

BOOL Get_all_process()
{
	WCHAR defen[2][30] = { L"SecurityHealthSystray.exe", L"wsctrl.exe" };
	PROCESSENTRY32 pe32 = {};
	pe32.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hprocessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hprocessSnap == INVALID_HANDLE_VALUE)
	{
		printf("create snap error!\n");
		return FALSE;
	}
	BOOL bRet = Process32First(hprocessSnap, &pe32);
	while (bRet)
	{
		for (int i = 0; i < 2; ++i)
		{
			if (wcscmp(defen[i], pe32.szExeFile) == 0)
			{
				printf("%ws is exist\n", defen[i]);
			}
		}
		//printf("[%d]\t[%ws]\n", pe32.th32ProcessID, pe32.szExeFile);
		bRet = Process32Next(hprocessSnap, &pe32);
	}
	CloseHandle(hprocessSnap);
		
	return TRUE;
}

int main()
{
	
	Get_all_process();
	return 0;
}

运行效果

可发现两个杀软进程系统都在运行中

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西杭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值