好友
阅读权限30
听众
最后登录1970-1-1
|
1、根据进程名:
[C++] 纯文本查看 复制代码 #include <windows.h>
#include <tchar.h>
#include <TlHelp32.h>
BOOL EnumProcessName();
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
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");
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)
{
return TRUE;
}
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
return FALSE; //其余都返回FALSE
}
缺点:过检测方法简单,现在已经没有实际意义了。
2、父进程检测
原理:
当程序处于未被调试状态时,父进程一般是explorer.exe
一旦程序被调试了,父进程就是调试器的进程
很多OD对父进程检测做了处理,我们检测的时候使用原版的1.xOD就OK了
吾爱OD测试通过
[C++] 纯文本查看 复制代码 #include <windows.h>
#include <TlHelp32.h>
#include <tchar.h>
BOOL DetectParentProcess();
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
if (DetectParentProcess())
{
MessageBox(NULL, _T("检测到调试器"), _T("结果"), 0);
}
else
{
MessageBox(NULL, _T("没有检测到调试器"), _T("结果"), 0);
}
return 0;
}
BOOL DetectParentProcess()
{
BOOL bResult = FALSE;
TCHAR szCurrentAndParentIdAndExplorerId[MAX_PATH] = {0};//定义当前程序ID、它的父窗口及桌面进程ID
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
DWORD dwExplorerId;
//获取explorer.exe进程的ID,桌面进程的类名是"Progman"
//注意返回的进程ID是在GetWindowThreadProcessId函数的第二个参数
//GetWindowThreadProcessId函数返回的是创建explorer.exe线程的句柄
GetWindowThreadProcessId(FindWindow(_T("Progman"), NULL), &dwExplorerId);
Process32First(hSnap, &pe);
do
{
if (GetCurrentProcessId() == pe.th32ProcessID) //遍历到当前进程
{
//当前进程的父进程ID如果不是explorer.exe进程的ID号,一般表示被调试了
if (dwExplorerId != pe.th32ParentProcessID)
{
bResult = TRUE;
}
}
} while (Process32Next(hSnap, &pe));
wsprintf(szCurrentAndParentIdAndExplorerId, _T("当前ID:%u,父进程ID:%u,桌面进程ID:%u"),
GetCurrentProcessId(),
pe.th32ParentProcessID,
dwExplorerId);
MessageBox(NULL, szCurrentAndParentIdAndExplorerId, _T("结果"), 0);
return bResult;
CloseHandle(hSnap);
return FALSE;
}
或者
[C++] 纯文本查看 复制代码 #include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#pragma comment(lib, "psapi")
BOOL IsInDebugger();
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
if( IsInDebugger() )
MessageBox(NULL,TEXT ("u are debugging me !"),TEXT ("OK"),MB_ICONEXCLAMATION);
else
MessageBox(NULL,TEXT ("not debugged!"),TEXT ("OK"),MB_ICONEXCLAMATION);
return 0;
}
//////////////////////////////////////////////////////////////////////
BOOL IsInDebugger()
{
char Expchar[] ="\\EXPLORER.EXE";
char szBuffer[MAX_PATH]={0};
char FileName[MAX_PATH]={0};
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到所有进程的列表快照
if (hProcessSnap == INVALID_HANDLE_VALUE)
return FALSE;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcessSnap, &pe32)) // 查找进程
{
CloseHandle (hProcessSnap);
return FALSE;
}
do // 遍历所有进程
{
if(pe32.th32ProcessID==GetCurrentProcessId() )//判断是否是自己的进程?即查看是否遍历到当前程序的进程
{
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ParentProcessID); //打开父进程
if (hProcess)
{
if (GetModuleFileNameEx(hProcess, NULL, FileName, MAX_PATH) ) // 得到父进程名 没被调试一般为Explorer.EXE
{
GetWindowsDirectory(szBuffer,MAX_PATH); //得到系统所在目录 "C:\Windows"
strcat(szBuffer,Expchar); //组合成类似的字串C:\Windows\Explorer.EXE
if(strcmpi (FileName,szBuffer)) // 比较当前是否为Explorer.EXE进程,不区分大小写(strcmpi)
return TRUE; // 父进程若不是Explorer.EXE,则是调试器
}
else
{
return FALSE; // 无法获得进程名
}
CloseHandle (hProcess);
}
else
{
return FALSE;//无权访问该进程
}
}
}
while (Process32Next(hProcessSnap, &pe32));
CloseHandle (hProcessSnap);
return FALSE;
}
//总结:程序思路就是遍历所有进程,当遍历到当前程序的进程时,得到他的父进程,再和C:\windows\EXPLORER.exe不区分大小写比较,
//如果相等则表示没有被调试,如果不相等表示被调试
//如果用VCdebug下ctrl+f5运行,也会显示被调试,原因是debug是调试版本,在VC下运行,父进程是VC的进程
|
免费评分
-
查看全部评分
|