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
}