
Отладчик ядра, подобный SoftICE, для Windows 11
BugChecker — это отладчик ядра и пользовательского режима для Windows 11 (а также Windows XP: поддерживаются версии Windows от XP до 11, как x86, так и x64), напоминающий SoftICE. В отличие от WinDbg и KD, BugChecker не требует второй машины, подключенной к отлаживаемой системе. Эта версия BugChecker (в отличие от оригинальной версии, разработанной 20 лет назад) использует внутреннее и недокументированное KD API в NTOSKRNL. KD API позволяет WinDbg/KD выполнять такие вызовы, как чтение/запись виртуальной памяти, чтение/запись регистров, установка точки останова по адресу и т. д.
Напротив, оригинальный BugChecker, как и SoftICE, «захватывал» систему, перехватывая несколько API ядра (как экспортируемых, так и частных), беря под контроль APIC, отправляя IPI и т. д. Такой подход экспоненциально увеличивает сложность (и снижает стабильность системы), поскольку реализация должна быть совместима со всеми поддерживаемыми версиями и подверсиями Windows (на уровне сигнатур функций), а также со всеми возможными поддерживаемыми конфигурациями оборудования. Более того, спустя 20 лет PatchGuard делает такое решение невозможным.
Напротив, эта версия BugChecker, перехватывая вызовы KdSendPacket и KdReceivePacket в ядре, представляется отлаживаемой машине как вторая система, запускающая внешний отладчик ядра, но на самом деле всё происходит на той же машине. Обычно это достигается заменой KDCOM.DLL (модуля, реализующего последовательное соединение для KD API в Windows) и запуском системы в режиме отладки ядра. Этот подход (вдохновлённый VirtualKD) снижает сложность, повышает стабильность и совместимость (а также переносимость, например, на ARM — и модульность, поскольку низкоуровневые возможности отладчика реализованы за KdXxxPacket и могут быть заменены пользовательской реализацией). Кроме того, наличие отладчика ядра во время загрузки (хотя и «поддельного») заставляет Windows отключать PatchGuard.
На данный момент BugChecker требует клавиатуру PS/2 для ввода и линейный буфер кадров для вывода. Обратите внимание, что встроенная клавиатура многих современных ноутбуков по-прежнему является PS/2.
Демонстрация BugChecker на Windows 11 22H2, внутри VirtualBox 7.0.4. Написано условие точки останова на JavaScript, изменяющее поток выполнения в потоке пользовательского режима.
BugChecker, работающий в очень ограниченной среде: Raspberry Pi 4 (4 ГБ ОЗУ) через QEMU на Windows XP (512 МБ ОЗУ). Точка останова используется для журналирования всех вызовов SYSENTER из пользовательского режима в ядро. Индекс службы сохраняется в массиве JavaScript.
BugChecker, запущенный непосредственно на «голом железе» на HP Pavilion Dv2000 — старом ПК с клавиатурой PS/2. ОС — Windows 7 Home 32-бит.
Убедитесь, что Secure Boot отключён при установке и использовании BugChecker. Обычно его можно снова включить позже. Если вы используете VMware или VirtualBox, Secure Boot можно отключить в настройках виртуальной машины.
Также рассмотрите возможность включения устаревшего меню загрузки, если используется Windows 8, 10 или 11, с помощью команды: bcdedit /set "{current}" bootmenupolicy legacy. Это обеспечивает более плавный процесс загрузки, позволяя одновременно выбрать параметр загрузки BugChecker и отключить проверку подписи драйверов.
Первый шаг — запустить Symbol Loader:

При необходимости отключите драйверы дисплея, нажав кнопку «Disable Display Drvs». То же самое можно сделать в диспетчере устройств Windows. После отключения драйверов дисплея они остаются отключёнными даже после перезагрузки системы. Их можно снова включить в любое время, когда BugChecker не используется.
Суть в том, что BugChecker требует линейный буфер кадров с форматом 32 бита на пиксель для отрисовки интерфейса. При отключении драйверов дисплея Windows отключает аппаратное ускорение для рисования своего интерфейса и переходит в режим совместимости с VGA. При работе на «голом железе» или VMware следует отключить драйверы дисплея. При работе на VirtualBox следует отключить драйверы дисплея или установить параметр vm_screen в BugChecker.dat, как описано ниже. При работе на QEMU отключать драйверы дисплея не нужно, но убедитесь, что указано устройство отображения "-vga std".
Обратите внимание, что режим совместимости с VGA может ограничить максимальное разрешение экрана. VMware ограничен максимальным разрешением 1152x864. QEMU с устройством отображения "-vga std" этим ограничением не страдает.
Интересно, что если BugChecker установлен в системе с более чем одной видеокартой, можно отключить драйверы дисплея только одной видеокарты, которая будет подключена к монитору, отображающему интерфейс BugChecker. Вторая карта (установленная как основной дисплей) сохранит все свои функции 2D- и 3D-ускорения, включая поддержку OpenGL и DirectX (ПРИМЕЧАНИЕ: протестировано на VMware с Windows 11 и дисплеем DisplayLink).