检测系统实时调试器痕迹
检测实时调试器是否是OllyDbg等调试软件。这个方法挺垃圾的,主要是这是在赌,赌那些调试人员的电脑上有OllyDbg等调试软件,且实时调试器被设置成了这些软件。
实时调试器注册表路径_x32:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
实时调试器注册表路径_x64:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
可以看到在Win10本机中,实时调试器被设置成vs的调试器。
#include <stdio.h> #include <Windows.h> BOOL Check_Realtime_Debugger(); DWORD WINAPI ThreadallBack(LPVOID lp) { while (true) { if (Check_Realtime_Debugger() == TRUE) { MessageBox(0, "已设置实时调试器", "提示", MB_OK); break; } } return 0; } BOOL Check_Realtime_Debugger() { // 注册表路径 CHAR RegPath32[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"; CHAR RegPath64[] = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"; // 获取当前程序位数 HANDLE CurrentHandle = GetCurrentProcess(); BOOL Is86Process; IsWow64Process(CurrentHandle,&Is86Process); HKEY hKey = NULL; // 键名 char KeyName[] = "Debugger"; // 获取注册表路径对应的KEY BOOL bRet; if (Is86Process == TRUE) { // 如果当前程序是32位 bRet = RegCreateKey(HKEY_LOCAL_MACHINE, RegPath32,&hKey); } else { // 如果当前程序是64位 bRet = RegCreateKey(HKEY_LOCAL_MACHINE, RegPath64, &hKey); } if (bRet != ERROR_SUCCESS) { printf("获取64位程序的注册表路径Key失败"); return FALSE; } else { // 查询键值 char KeyValue[MAX_PATH]; DWORD KeyValueLength; DWORD ValueType; BOOL QueryRet= RegQueryValueEx(hKey, KeyName,NULL,&ValueType, (LPBYTE)KeyValue, &KeyValueLength); if (QueryRet != ERROR_SUCCESS) { printf("查询键值失败"); return FALSE; } else { if (strstr(KeyValue, "vsjitdebugger.exe") != NULL || strstr(KeyValue, "Ollydbg") != NULL) { return TRUE; } else { return FALSE; } } } } int main() { CreateThread(NULL, NULL, ThreadallBack, NULL, NULL, NULL); while (true) { printf("正在运行\n"); } }