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
}

运行截图

【API】检查进程是否存在 - CreateToolhelp32Snapshot的更多相关文章

  1. Unix系统编程()检查进程的存在

    检查进程的存在 kill系统调用还有另一重功用.若将参数sig指定为0(即所谓空信号),则无信号发送. 相反,kill仅会去执行错误检查,查看是否可以向目标进程发送信号. 从另一角度来看,这意味着,可 ...

  2. 使用Native API 创建进程

    使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...

  3. 拦截API 注入进程

    本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...

  4. 检查进程启动情况,开始时间、启动时间、启动进程数、进程数是否正确、PID

    #!/bin/sh bin=$(cd ``;pwd) cd ${bin} ### 定义检查函数 chk(){ programName=$ correctNum=$ programSubName=$ # ...

  5. Android开发-API指南-进程与线程

    Processes and Threads 英文原文:http://developer.android.com/guide/components/processes-and-threads.html ...

  6. check if a linux process is done using bash 检查进程是否在运行

    # cat > check_process_is_end.sh while truedo   sleep 30 # seconds   res=`ps -ef | grep RNAhybrid` ...

  7. Android Api 检查參数状态Api

    转载请注明出处:http://blog.csdn.net/droyon/article/details/39938677 在进行Android应用程序开发中,android提供了一个非常好的工具类,来 ...

  8. 微信小程序API~检查登录状态

    wx.checkSession(Object object) 检查登录态是否过期. 通过 wx.login 接口获得的用户登录态拥有一定的时效性.用户越久未使用小程序,用户登录态越有可能失效.反之如果 ...

  9. java 检查进程是否存在

    以nginx进程为例子 private final static String NAME_STRING = "nginx.exe"; //传入进程名称processName pub ...

随机推荐

  1. mysql test== 坑

    错误 <if test="status == '1'"> 正确 <if test="status == '1'.toString()">

  2. MT【66]寻找对称中心

    设函数$f(x)=2x-cosx,{a_n}$是公差为$\frac{\pi}{8}$的等差数列,$f(a_1)+f(a_2)+f(a_3)+f(a_4)+f(a_5)=5\pi$,则 $[f(a_3) ...

  3. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  4. Spark 集成开发

    WordCount.py # coding:utf-8 from pyspark import SparkContext from pyspark import SparkConf def SetLo ...

  5. oracle 按 123456789 排序 而不是 1 10 11 2 这种

    order by  decode(trim(translate(cptm,'0123456789',' ')),null,to_number(cptm))

  6. 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)

    迭代器: l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) ...

  7. MATLAB:图像的与、或、非、异或逻辑运算(&、|、~、xor)

    图像的与.或.非.异或逻辑运算涉及到了&.|.~和xor符号 close all;%关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc; clear all; I=imrea ...

  8. java代码示例(6-1)

     创建Administrator.java /** * 需求分析:定义用户名,密码 * @author chenyanlong * 日期:2017/10/15 */ package com.hp.te ...

  9. CodeForces911D 逆序对

    http://codeforces.com/problemset/problem/911/D 题意 给你一个长度为N的序列,有M次操作.每次翻转[l,r]的区间,每次操作后询问序列逆序对个数的奇偶性 ...

  10. redis 启动停止脚本

    redis 启动停止脚本,该redis需要密码登录,如没有密码,去掉stop函数里的 -a #!/bin/sh # #chkconfig: 2345 80 90 # Simple Redis init ...