
Depurador de kernel similar ao SoftICE para Windows 11
BugChecker é um depurador de kernel e usuário semelhante ao SoftICE para Windows 11 (e também Windows XP: suporta versões do Windows do XP ao 11, tanto x86 quanto x64). O BugChecker não requer uma segunda máquina conectada ao sistema que está sendo depurado, como no caso do WinDbg e KD. Esta versão do BugChecker (diferentemente da versão original desenvolvida 20 anos atrás) utiliza a API KD interna e não documentada do NTOSKRNL. A API KD permite que WinDbg/KD faça chamadas como ler/escrever memória virtual, ler/escrever registradores, colocar um breakpoint em um endereço, etc.
Por outro lado, o BugChecker original, assim como o SoftICE, costumava "assumir o controle" do sistema, interceptando várias APIs do kernel (tanto exportadas quanto privadas), assumindo o controle do APIC, enviando IPIs, etc. Essa abordagem aumenta a complexidade exponencialmente (e reduz a estabilidade do sistema), pois a implementação deve ser compatível com todas as versões e subversões suportadas do Windows (no nível da assinatura da função), bem como todas as possíveis configurações de hardware suportadas. Além disso, 20 anos depois, o PatchGuard torna essa solução impossível.
Por outro lado, esta versão do BugChecker, ao interceptar chamadas a KdSendPacket e KdReceivePacket no kernel, apresenta-se à máquina que está sendo depurada como um segundo sistema executando um depurador de kernel externo, mas, na realidade, tudo acontece na mesma máquina. Normalmente, isso é alcançado substituindo KDCOM.DLL (que é o módulo que implementa a comunicação por cabo serial para a API KD no Windows) e iniciando o sistema em modo de depuração de kernel. Essa abordagem (inspirada pelo VirtualKD) reduz a complexidade e aumenta a estabilidade e compatibilidade (e portabilidade, por exemplo, para ARM - e modularidade, uma vez que as capacidades de depuração de baixo nível são implementadas por trás de KdXxxPacket e poderiam ser substituídas por uma implementação personalizada). Além disso, a presença de um depurador de kernel na inicialização (embora "falso") faz com que o Windows desabilite o PatchGuard.
No momento, o BugChecker requer um teclado PS/2 para entrada e um framebuffer linear para escrever sua saída. Observe que o teclado embutido de muitos laptops modernos ainda é PS/2.
Demonstração do BugChecker no Windows 11 22H2, dentro do VirtualBox 7.0.4. Uma condição de breakpoint JavaScript é escrita que altera o fluxo de execução em um thread de modo usuário.
BugChecker rodando em um ambiente muito restrito: um Raspberry Pi 4 (4GB RAM), via QEMU no Windows XP (512MB RAM). Um breakpoint é usado para registrar todas as chamadas SYSENTER do modo usuário para o kernel. O índice do serviço é armazenado em um array JavaScript.
Executando BugChecker diretamente em hardware real, em um HP Pavilion Dv2000, que é um PC antigo com teclado PS/2. O sistema operacional é Windows 7 Home 32 bits.
Certifique-se de que o Secure Boot esteja desabilitado ao instalar e usar o BugChecker. Normalmente você pode reativá-lo depois. Se estiver usando VMware ou VirtualBox, o Secure Boot pode ser desabilitado nas configurações da máquina virtual.
Considere também habilitar o menu de inicialização legado, se estiver usando Windows 8, 10 ou 11, usando o comando: bcdedit /set "{current}" bootmenupolicy legacy. Isso permite uma experiência mais suave durante a inicialização, permitindo selecionar a opção de boot do BugChecker e desabilitar a Imposição de Assinatura de Driver ao mesmo tempo.
O primeiro passo é iniciar o Symbol Loader:

Se necessário, desabilite os drivers de vídeo clicando no botão "Disable Display Drvs". A mesma coisa pode ser feita no Gerenciador de Dispositivos do Windows. Após desabilitar os drivers de vídeo, eles permanecem desabilitados mesmo após uma reinicialização do sistema. Eles podem ser reabilitados a qualquer momento depois, quando não estiver usando o BugChecker.
O ponto aqui é que o BugChecker precisa de um framebuffer linear com formato de 32 bits por pixel para desenhar sua interface. Ao desabilitar os drivers de vídeo, o Windows descarta a aceleração de hardware para desenhar sua interface e volta para o modo de compatibilidade VGA. Se estiver executando em hardware real ou VMware, você deve desabilitar os drivers de vídeo. Se estiver executando no VirtualBox, você deve desabilitar os drivers de vídeo ou definir a configuração vm_screen no BugChecker.dat, conforme descrito abaixo. Se estiver executando no QEMU, você não precisa desabilitar os drivers de vídeo, mas certifique-se de especificar o dispositivo de vídeo "-vga std".
Observe que o modo de compatibilidade VGA pode limitar a resolução máxima da tela. O VMware é limitado a uma resolução máxima de 1152x864. O QEMU com o dispositivo de vídeo "-vga std" não sofre dessa limitação.
Curiosamente, se o BugChecker for instalado em um sistema com mais de uma placa de vídeo, é possível desabilitar os drivers de vídeo de apenas uma placa de vídeo, que será a placa conectada à tela que mostrará a interface do BugChecker. A segunda placa (definida como display principal) manterá todos os seus recursos de aceleração 2D e 3D, incluindo suporte a OpenGL e DirectX (NOTA: testado no VMware, com Windows 11 e um display DisplayLink).
Em seguida, clique em "Start Driver", depois em "Auto Detect" e finalmente em "Save". "Auto Detect" deve ser capaz de determinar automaticamente a largura, altura, endereço físico e stride do framebuffer. No entanto, você pode especificar essas configurações manualmente (não se esqueça de clicar em "Save" ao terminar). Se "Stride" for 0, ele é calculado como "Width" * 4 automaticamente ao iniciar o driver. "Address" (ou seja, endereço físico do framebuffer) pode ser obtido no Gerenciador de Dispositivos do Windows, clicando em "Propriedades" do dispositivo de vídeo, na guia "Recursos".
Em seguida, clique em "Callback" na seção "KDCOM Hook Method", depois em "Copy/Replace Kdcom" e, finalmente, você pode reiniciar o sistema.
Este processo de configuração precisa ser feito apenas uma vez e os drivers de vídeo podem ser reabilitados, se necessário. No entanto, ao usar o BugChecker, os drivers de vídeo devem ser desabilitados novamente, se exigido pela sua configuração.
A configuração vm_screen no BugChecker.dat permite abrir a interface do depurador BugChecker no VirtualBox sem especificar antecipadamente uma resolução de tela no Symbol Loader e sem desabilitar os drivers de vídeo.
A ideia é escrever diretamente nas portas de I/O e no Buffer de Comandos do dispositivo de vídeo virtual para obter a resolução atual da tela e notificar o hipervisor sobre qualquer atualização no framebuffer.
Esta solução foi inspirada pelo driver X.org xf86-video-vmware.
Esta solução funciona apenas para VMs do VirtualBox e editando manualmente o arquivo BugChecker.dat:

Este é um recurso experimental. No futuro, esta configuração será adicionada automaticamente pelo Symbol Loader.
O nome e a sintaxe dos comandos foram escolhidos para serem o mais próximos possível dos do SoftICE original para NT:
Nota: O WDK deve ser instalado em seu local padrão, ou seja, X:\WinDDK, onde X é a unidade onde os fontes do BugChecker estão salvos.
Um guia passo a passo para compilar o driver de kernel está disponível aqui.