使用环境监测实现反调试与反反调试
使用环境监测的反调试方法在这里提供两种简单地方式:
1.FindWindows 寻找调试器窗口或者窗口类。
2.枚举进程信息,寻找调试器进程名称。
反反调试方法:
1.窗口名/窗口类随机化
更可靠的使用环境监测反调试方法(之后会更新):
代码段抽取一个哈希值,或者提取一个特征码进行检测,缺陷:耗能太大
// 使用环境检测反调试: // 1.寻找调试器窗口 // 2.寻找调试器进程 // 3.代码段抽取一个哈希值,或者提取一个特征码进行检测 // 缺陷:耗能太大 // 反反调试方法(针对前两种):窗口名/进程名随机化 #include <stdio.h> #include <Windows.h> #include <tchar.h> #include <TlHelp32.h> BOOL FindProcess(TCHAR *pName); // 寻找调试器窗口/窗口类 // 有可能会调试器会将窗口名随机化,较低可能会将窗口类也随机化 DWORD WINAPI ThreadCallBack(LPVOID lp) { // 工具 - spy++ - ctrl+f - 拖动瞄准按钮放到调试器窗口上 - 点击ok查看窗口信息 // 获取到调试器窗口类为Qt5QWindowIcon HWND hWindow = NULL; while (TRUE) { // 查找调试器窗口 hWindow = FindWindow(NULL, _T("x32dbg")); if (hWindow != NULL) { MessageBox(0, _T("Debug"), _T("rkvir"), MB_OK); break; } // 查找调试器窗口类 else { hWindow = FindWindow(_T("Qt5QWindowIcon"), NULL); if (hWindow != NULL) { MessageBox(0, _T("Debug"), _T("rkvir"), MB_OK); break; } } } return 0; } // 寻找调试器进程 DWORD WINAPI ThreadCallBack2(LPVOID lp) { while (TRUE) { TCHAR NeedFindPName[20] = _T("x32dbg.exe"); if (FindProcess(NeedFindPName)) { MessageBox(0, _T("Debug"), _T("rkvir"), MB_OK); break; } } return 0; } BOOL FindProcess(TCHAR *pName) { HANDLE SnapshotHandle; //定义一个快照 PROCESSENTRY32 ProcessEntry32; //照片结构体 SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //照第一张相 if (SnapshotHandle != INVALID_HANDLE_VALUE) { ProcessEntry32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(SnapshotHandle, &ProcessEntry32)) //照的第一张放到ProcessEntry32里面 { do { if(!_tcscmp(ProcessEntry32.szExeFile, pName)) { return TRUE; } } while (Process32Next(SnapshotHandle, &ProcessEntry32)); return FALSE; } } } int main() { //CreateThread(NULL, NULL, ThreadCallBack, NULL, NULL, NULL); // 寻找调试器窗口/窗口类 CreateThread(NULL, NULL, ThreadCallBack2, NULL, NULL, NULL); // 寻找调试器进程 while (true) { printf("程序正在运行"); } return 0; }