【API】检查进程是否存在 - CreateToolhelp32Snapshot
1 学习目标
今天静态逆向mydocument病毒时,看到病毒代码为了防止自身被调试会先检测杀毒软件和调试工具的进程是否存在。如果没有杀毒软件则释放真正的病毒文件,提前熟悉一下枚举进程的反汇编代码。
2 编程思路
2.1 代码原理
这是一段检测指定进程是否存在的代码,使用CreateToolhelp32Snapshot这个API获取进程信息。然后对比有没有杀毒软件的进程。
2.2 编写思路
将这几个功能封装成一个函数。
- 1、 定义TCHAR数组,数组中存放要检测的进程名
- 2、获取进程信息
- 3、遍历进程名
- 4、对比是否存在指定的进程名
如果检测到有相关的进程名,函数返回值为TRUE,否则为FALSE
3 参考文章
判断指定的进程或程序是否存在方法
http://blog.csdn.net/yeahhook/article/details/6942414
Anti-Debug之父进程检测以及根据进程名检测
http://www.52pojie.cn/thread-193804-1-1.html
4 实现流程
4.1 编程环境
操作系统:windows 7
编译器版本:vs 2010
4.2 前置API函数
// 获取进程的快照以及堆,模块,这些进程和线程使用。
CreateToolhelp32Snapshot()
// 存放快照进程信息的一个结构体
PROCESSENTRY32
// Process32First是一个进程获取函数 ,利用process32First函数来获得第一个进程的句柄。
Process32First()
// Process32Next是一个进程获取函数,利用Process32Next函数来获得下一个进程的句柄。
Process32Next()
// 关闭句柄
CloseHandle()
4.3 C++代码
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <TlHelp32.h>
BOOL EnumProcessName();
int main()
{
if (EnumProcessName())
{
MessageBox(NULL, _T("检测到OD"), _T("结果"), MB_OK);
}
else
{
MessageBox(NULL, _T("没有检测到OD"), _T("结果"), MB_OK);
}
return 0;
}
BOOL EnumProcessName()
{
TCHAR szOLLYDBG[] = _T("OLLYDBG.EXE"); //要检测的OD进程名
TCHAR sz52[] = _T("吾爱破解.EXE");
TCHAR szICey[] = _T("ICEYOD.EXE");
TCHAR szODICE[] = _T("OLLYICE.EXE");
TCHAR szWINDBG[] = _T("WINGUARD.EXE");
TCHAR szTestQQ[] = _T("QQ.EXE"); //测试QQ进程是否存在
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnap)
{
MessageBox(NULL, _T("创建进程失败"), _T("错误"), MB_ICONERROR);
return FALSE;
}
if (Process32First(hSnap, &pe))
{
do
{
if (lstrcmpi(szOLLYDBG, pe.szExeFile) == 0 ||
lstrcmpi(sz52, pe.szExeFile) == 0 ||
lstrcmpi(szICey, pe.szExeFile) == 0 ||
lstrcmpi(szODICE, pe.szExeFile) == 0 ||
lstrcmpi(szWINDBG, pe.szExeFile) == 0||
lstrcmpi(szTestQQ, pe.szExeFile) == 0)
{
return TRUE;
}
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
return FALSE; //其余都返回FALSE
}