zoukankan      html  css  js  c++  java
  • 【API】检查进程是否存在

    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
    }
    

    运行截图

  • 相关阅读:
    多线程上传和下载大文件(当文件服务器对上传文件大小有限制)
    http和https的区别?
    将数据导出到 excel ,然后下载下来
    注解@Transactional(rollbackFor = Exception.class) 的用法
    浅谈 MongoDB
    浅谈负载均衡
    join,left join,inner join,full join的区别?
    Bootstrap如何适配移动浏览器
    常用正则表达式
    js获取节点
  • 原文地址:https://www.cnblogs.com/17bdw/p/6725846.html
Copyright © 2011-2022 走看看