checkparentproc.cpp
来自「此为本书的配套光盘.本书结合实例」· C++ 代码 · 共 94 行
CPP
94 行
/*--------------------------------------------------------------
CheckParentProc.cpp -- 检测用户模式调试器(如OllyDbg)
(c) www.pediy.com code by 段钢, 2003.11
--------------------------------------------------------------*/
#include <windows.h>
#include <tlhelp32.h>
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()
{
HANDLE hProcessSnap = NULL;
DWORD ParentID;
char Expchar[] ="EXPLORER.EXE";
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() )//判断是否自己的进程?
{
ParentID=pe32.th32ParentProcessID;
//if(pe32.th32ParentProcessID!=ExplProc)
// return TRUE; // 父进程不是Explorer.EXE,则是调试器
}
}
while (Process32Next(hProcessSnap, &pe32));
if (!Process32First(hProcessSnap, &pe32)) // 查找进程
{
CloseHandle (hProcessSnap);
return FALSE;
}
//根据ID得到创建此窗口的进程的文件名
//对于Win 2000/XP要容易些,因为有GetModuleFileNameEx这个函数,它可以查指定进程中任何模块的文件名,
//而且带有路径。Win9X下除了枚举进程一一比较外,我还没想出办法。
do // 遍历所有进程
{
if(pe32.th32ProcessID==ParentID)
{
strrev(pe32.szExeFile); //Win98得到的进程名有路径,而Win2000/XP下得到进程名无路径
strrev(Expchar); // 为了省事,在这将字符串倒过来比较,即比较后12位是否为Explorer.EXE
if(strnicmp (pe32.szExeFile,Expchar,12)) // 比较当前是否为Explorer.EXE进程
return TRUE;
}
}
while (Process32Next(hProcessSnap, &pe32));
CloseHandle (hProcessSnap);
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?