使用环境监测实现反调试与反反调试

使用环境监测的反调试方法在这里提供两种简单地方式:
  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;
}

 

posted @ 2022-04-08 11:44  人类观察者  阅读(125)  评论(0编辑  收藏  举报