
Windows 11용 SoftICE 스타일 커널 디버거
BugChecker는 Windows 11(및 Windows XP도 지원: XP부터 11까지, x86 및 x64 모두)을 위한 SoftICE 스타일의 커널 및 사용자 디버거입니다. BugChecker는 WinDbg나 KD처럼 디버깅 대상 시스템에 연결할 두 번째 머신이 필요하지 않습니다. 이 버전의 BugChecker(20년 전에 개발된 원본 버전과 달리)는 NTOSKRNL의 내부 문서화되지 않은 KD API를 활용합니다. KD API는 WinDbg/KD가 가상 메모리 읽기/쓰기, 레지스터 읽기/쓰기, 주소에 중단점 설정 등의 호출을 할 수 있게 해줍니다.
반면, 원래 BugChecker(SoftICE도 마찬가지)는 여러 커널 API(익스포트된 것과 프라이빗 모두)를 후킹하고, APIC를 제어하며, IPI를 전송하는 등 시스템을 "인수"했습니다. 이 접근 방식은 지원되는 모든 Windows 버전 및 하위 버전(함수 시그니처 수준)과 가능한 모든 하드웨어 구성에서 호환되어야 하므로 복잡성이 기하급수적으로 증가하고(시스템 안정성은 낮아집니다). 또한 20년 후에는 PatchGuard가 이 솔루션을 불가능하게 만듭니다.
반면에, 이 버전의 BugChecker는 커널에서 KdSendPacket 및 KdReceivePacket 호출을 가로채어 디버깅 대상 머신에 외부 커널 디버거를 실행하는 두 번째 시스템으로 스스로를 제시하지만, 실제로는 모든 것이 동일한 머신에서 발생합니다. 일반적으로 이는 KDCOM.DLL을 교체하고(Windows에서 KD API의 직렬 케이블 통신을 구현하는 모듈) 시스템을 커널 디버깅 모드로 시작하여 달성됩니다. 이 접근 방식(VirtualKD에서 영감을 받음)은 복잡성을 낮추고 안정성과 호환성(및 이식성, 예: ARM - 그리고 모듈성, 하위 수준 디버거 기능이 KdXxxPacket 뒤에 구현되어 사용자 정의 구현으로 대체될 수 있음)을 높입니다. 또한 부팅 시 커널 디버거가 존재하면(비록 "가짜"일지라도) Windows가 PatchGuard를 비활성화합니다.
현재 BugChecker는 입력에 PS/2 키보드가 필요하고 출력에 선형 프레임버퍼가 필요합니다. 최신 노트북의 내장 키보드는 여전히 PS/2인 경우가 많습니다.
VirtualBox 7.0.4 내 Windows 11 22H2에서 BugChecker 시연. 사용자 모드 스레드의 실행 흐름을 변경하는 JavaScript 중단점 조건이 작성됩니다.
매우 제한된 환경에서 실행되는 BugChecker: Raspberry Pi 4(4GB RAM), QEMU에서 Windows XP(512MB RAM)를 통해. SYSENTER 호출을 사용자 모드에서 커널로 모두 기록하는 데 중단점이 사용됩니다. 서비스 인덱스는 JavaScript 배열에 저장됩니다.
HP Pavilion Dv2000(PS/2 키보드가 있는 오래된 PC)의 베어 메탈에서 BugChecker 직접 실행. OS는 Windows 7 Home 32bit입니다.
BugChecker를 설치하고 사용할 때 Secure Boot가 비활성화되어 있는지 확인하세요. 일반적으로 나중에 다시 활성화할 수 있습니다. VMware 또는 VirtualBox를 사용하는 경우 가상 머신 설정에서 Secure Boot를 비활성화할 수 있습니다.
Windows 8, 10 또는 11을 사용하는 경우 명령어 bcdedit /set "{current}" bootmenupolicy legacy를 사용하여 레거시 부팅 메뉴를 활성화하는 것도 고려하세요. 그러면 부팅 중 BugChecker 부팅 옵션을 선택하고 동시에 드라이버 서명 적용을 비활성화할 수 있어 더 원활한 환경을 제공합니다.
첫 번째 단계는 Symbol Loader를 시작하는 것입니다:

필요한 경우 "Disable Display Drvs" 버튼을 클릭하여 디스플레이 드라이버를 비활성화하세요. Windows 장치 관리자에서도 동일한 작업을 수행할 수 있습니다. 디스플레이 드라이버가 비활성화되면 시스템 재부팅 후에도 비활성화 상태로 유지됩니다. BugChecker를 사용하지 않을 때 언제든지 다시 활성화할 수 있습니다.
BugChecker는 인터페이스를 그리기 위해 32비트-퍼-픽셀 형식의 선형 프레임버퍼가 필요합니다. 디스플레이 드라이버를 비활성화하면 Windows는 UI 그리기를 위한 하드웨어 가속을 해제하고 VGA 호환 모드로 대체됩니다. 베어 메탈 또는 VMware에서 실행하는 경우 디스플레이 드라이버를 비활성화해야 합니다. VirtualBox에서 실행하는 경우 디스플레이 드라이버를 비활성화하거나 아래 설명대로 BugChecker.dat에서 vm_screen 설정을 지정해야 합니다. QEMU에서 실행하는 경우 디스플레이 드라이버를 비활성화할 필요는 없지만 "-vga std" 디스플레이 장치를 지정해야 합니다.
VGA 호환 모드는 최대 화면 해상도를 제한할 수 있습니다. VMware는 최대 해상도 1152x864로 제한됩니다. "-vga std" 디스플레이 장치가 있는 QEMU는 이 제한이 없습니다.
흥미롭게도 BugChecker가 두 개 이상의 그래픽 카드가 있는 시스템에 설치된 경우, BugChecker UI를 표시할 화면에 연결된 카드 하나의 디스플레이 드라이버만 비활성화할 수 있습니다. 다른 카드(기본 디스플레이로 설정)는 OpenGL 및 DirectX 지원을 포함한 모든 2D 및 3D 가속 기능을 유지합니다(참고: VMware, Windows 11 및 DisplayLink 디스플레이에서 테스트 완료).
그런 다음 "Start Driver"를 클릭하고 "Auto Detect"를 클릭한 후 마지막으로 "Save"를 클릭합니다. "Auto Detect"는 프레임버퍼의 너비, 높이, 물리적 주소 및 스트라이드를 자동으로 결정할 수 있습니다. 그러나 이러한 설정을 수동으로 지정할 수도 있습니다(완료 후 "Save" 클릭하는 것을 잊지 마세요). "Stride"가 0이면 드라이버 시작 시 "Width" * 4로 자동 계산됩니다. "Address"(프레임버퍼의 물리적 주소)는 Windows 장치 관리자에서 디스플레이 장치의 "속성"을 클릭하고 "리소스" 탭에서 확인할 수 있습니다.
그런 다음 "KDCOM Hook Method" 섹션에서 "Callback"을 클릭하고 "Copy/Replace Kdcom"을 클릭한 후 시스템을 재부팅합니다.
이 설정 과정은 한 번만 수행하면 되며 필요한 경우 디스플레이 드라이버를 다시 활성화할 수 있습니다. 그러나 BugChecker를 사용할 때는 구성에 따라 디스플레이 드라이버를 다시 비활성화해야 합니다.
BugChecker.dat의 vm_screen 설정을 사용하면 Symbol Loader에서 사전에 화면 해상도를 지정하거나 디스플레이 드라이버를 비활성화하지 않고 VirtualBox에서 BugChecker 디버거 UI를 열 수 있습니다.
아이디어는 가상 디스플레이 장치의 I/O 포트와 명령 버퍼에 직접 쓰여 현재 화면 해상도를 얻고 프레임버퍼의 업데이트를 하이퍼바이저에 알리는 것입니다.
이 솔루션은 X.org xf86-video-vmware 드라이버에서 영감을 받았습니다.
이 솔루션은 VirtualBox VM에서만 작동하며 BugChecker.dat 파일을 수동으로 편집해야 합니다:

이 기능은 실험적입니다. 향후 이 설정은 Symbol Loader에 의해 자동으로 추가될 예정입니다.
명령어 이름과 구문은 원래 NT용 SoftICE의 것과 최대한 가깝게 선택되었습니다: