首先這是一種比較奇特的反調試思路,通過檢測自身父進程來判定是否被調試,原理非常簡單,我們的系統在運行程序的時候,絕大多數應用程序都是由Explorer.exe
這個父進程派生而來的子進程,也就是說如果沒有被調試其得到的父進程就是Explorer.exe
的進程PID,而如果被調試則該進程的父進程PID就會變成調試器的PID值,通過對父進程的檢測即可實現檢測是否被調試的功能。
#include <Windows.h>
#include <stdio.h>
#include <tlhelp32.h>
int IsDebug()
{
DWORD ExplorerId = 0;
PROCESSENTRY32 pe32 = { 0 };
DWORD ProcessId = GetCurrentProcessId();
GetWindowThreadProcessId(FindWindow("Progman", NULL), &ExplorerId);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (hProcessSnap != INVALID_HANDLE_VALUE)
{
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hProcessSnap, &pe32);
do
{
// 先判斷是不是我們自己進程的PID
if (ProcessId == pe32.th32ProcessID)
{
// 判斷父進程是否是 Explorer.exe
if (pe32.th32ParentProcessID != ExplorerId)
{
return TRUE;
}
}
} while (Process32Next(hProcessSnap, &pe32));
}
return FALSE;
}
int main(int argc, char * argv[])
{
if (IsDebug())
{
printf("[-] 進程正在被調試 \n");
}
system("pause");
return 0;
}