功能技术模块
病毒木马的入侵并潜伏在用户计算机上总是有着某种目的,例如获取用户隐私的办公文件或是账号密码,或是控制肉鸡,或是进行加密磁盘文件然后进行勒索。
进程遍历
进程遍历指的是获取在计算机系统上运行的所有进程信息,包括用户进程和系统进程。通过获取进程信息,可以判断是否存在杀软进程,是否有可利用进程,是否运行在虚拟机中,甚至可以分析用户的工作环境等,所以获取系统进程信息是一种不可获取的标志性功能。
本文介绍应用最广泛的进程快照技术来实现进程的遍历
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;
}
运行效果
可发现两个杀软进程系统都在运行中