跳转至

检查调试驱动程序

一些调试器会加载内核模式驱动程序协助操作。你可以通过尝试获取其内核模式驱动程序的句柄来检测这些调试器,像这样:

bool DebuggerDriversPresent() {
    // 常见调试器驱动程序设备名称数组
    const char drivers[9][20] = {
        "\\\\\\.\\\\EXTREM", "\\\\\\.\\\\ICEEXT",
        "\\\\\\.\\\\NDBGMSG.VXD", "
\\\\\\.\\\\RING0",
        "\\\\\\.\\\\TRW", "\\\\\\.\\\\SYSERBOOT",
        "\0"
    };
    for (int i = 0; drivers[i][0] != '\0'; i++) {
        auto h = CreateFileA(drivers[i], 0, 0, 0, 
OPEN_EXISTING, 0, 0);
        if (h != INVALID_HANDLE_VALUE) {
            CloseHandle(h);
            return true;
        }
    }
    return false;
}

有几个常见的内核模式驱动程序设备名称要检查,比如\.\EXTREM 和 drivers 数组中显示的其他名称。如果这个获取句柄的代码成功,系统上就运行着调试器。不过,与之前的方法不同,获取其中一个驱动程序的句柄并不总是意味着调试器附加到你的机器人。