【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
}

运行截图

549050-20170418010635431-205628125.png

转载于:https://www.cnblogs.com/17bdw/p/6725846.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值