- Compartilhamento da experiência no desenvolvimento do defendnot, uma ferramenta que desativa o Windows Defender usando diretamente a API de serviço do Windows Security Center (WSC)
- O projeto começou no processo de superar as limitações técnicas e os problemas legais do projeto anterior, o no-defender
- A engenharia reversa e a depuração foram feitas em meio a vários obstáculos, como ambiente especial (MacBook arm64, depuração remota, alta latência)
- Analisou o desvio do registro no Defender e o mecanismo de verificação de processos, melhorando o funcionamento até ficar estável após várias falhas e tentativas
- No fim, implementou até a função de execução automática, ao mesmo tempo em que relembra o quanto o processo foi difícil
Introdução
- Relato da jornada de implementação da ferramenta defendnot, que desativa o Windows Defender
- Em vez de focar nos principais detalhes técnicos, o texto é organizado em torno dos problemas enfrentados no ambiente real e das tentativas frustradas
- A documentação formal e a explicação técnica detalhada serão publicadas separadamente depois
Relembrando 1 ano atrás
- Cerca de 1 ano atrás, foi publicado um projeto chamado no-defender, que explorava a forma como o Windows Defender é desativado via API do WSC
- Esse projeto fingia que outro antivírus estava registrado no sistema ao referenciar código de terceiros de um fornecedor de antivírus
- Após o lançamento, recebeu grande atenção e cerca de 1.500 stars, mas decidiu remover o código-fonte e encerrar o projeto por causa de um pedido de remoção por DMCA da empresa de antivírus relacionada
Como o projeto começou
- No momento da escrita, o autor estava hospedado em um Airbnb em Seul
- O principal ambiente de desenvolvimento era um MacBook M4Pro, e ele não levou um dispositivo separado para engenharia reversa em x86, que era essencial
- Por causa de um CTF e da agenda de viagem, surgiu a situação de precisar trabalhar sem um dispositivo x86
- Junto com a análise da possibilidade de uma implementação “correta” do projeto no-defender, começou a explorar se seria possível uma implementação independente, sem depender de AV
Investigação inicial (Dia 1)
- Com a ajuda de um amigo, conseguiu o binário do WSC e tentou reimplementar o registro no WSC com uma estrutura parecida com a do projeto anterior
- Implementou usando a API COM do WSC, mas recebeu um erro de Access Denied
- Identificou a causa no processo de verificação de assinatura e autenticação do processo que chama a API pelo WSC
- Quando tentou registrar injetando um módulo em um processo de AV, o registro do antivírus foi concluído com sucesso
Substituição do binário de AV e experimentos adicionais (Dia 1)
- Tentou executar a ferramenta por meio de processos de sistema assinados, como
cmd.exe, mas falhou na verificação de PPL (Protected Process Light)
- Interrompeu temporariamente o trabalho, prometendo fazer uma desmontagem e rastreamento detalhados para análise
Montagem do ambiente (Dia 2)
- Devido às limitações do ambiente MacBook arm64, depurar Windows x86 era muito difícil
- Usou remotamente o PC de um amigo que mora nos EUA, com Parasec, Anydesk etc., para fazer depuração e testes em ambiente de alta latência
- No processo em que a compilação do código e a depuração da VM se cruzavam de forma complexa, enfrentou lentidão e confusão
Depuração do serviço WSC (Dia 2)
- Confirmou que o serviço WSC tem a estrutura de uma DLL executada pelo svchost
- Aplicou um desvio com um driver especial para remover a proteção PPL e confirmou com o depurador a entrada na função
- Identificou que dentro do serviço estava sendo feita a verificação do token SID do WinDefend
- Formulou a teoria de que seria possível contornar o processo de autenticação imitando um processo com o SID do WinDefend
Imitação do SID do WinDefend (Dia 2)
- Fez estudo adicional sobre a estrutura dos tokens do Windows e seu funcionamento
- Depois de implementar e executar o código de imitação do SID do WinDefend, verificou que todas as chamadas COM retornavam SUCCESS, mas o AV na prática não era registrado
Reconstrução do algoritmo de verificação (Dia 3)
- Reanalisou cuidadosamente no binário do AV se a checagem de SID realmente estava sendo aprovada
- Quando a checagem de SID falhava, o serviço também verificava estado elevado de privilégio, assinatura do binário e o flag DllCharacteristics (ForceIntegrity) do PE
- Reproduziu a função que executava essa estrutura e fez testes aplicando-a a binários centrais do sistema
Uso do processo Taskmgr (Dia 3)
- Tentou novamente usando o Taskmgr.exe como processo-alvo, mas enfrentou o problema de o WSC rejeitar a solicitação devido a erro no processo de transmissão do nome e bug de IPC
- Depois de melhorar a inferência do caminho do arquivo e a forma de transmitir o nome do AV, confirmou o funcionamento normal
Organização do código (Dia 3)
- Organizou as funcionalidades e tentou implementar a função de execução automática (autorun)
- Sofreu falhas intermitentes no gerenciamento da execução automática e repetiu várias vezes a inspeção do código e do ambiente para descobrir a causa
Implementação da execução automática (Dia 4)
- Confirmou que a causa era uma opção do Task Scheduler: a caixa que impede a execução da tarefa quando o notebook não está conectado à energia AC estava marcada
- Depois de desativar essa configuração, a execução automática passou a funcionar normalmente
- Para finalizar, fez limpeza de código e testes
Conclusão
- O trabalho de engenharia reversa em um ambiente limitado e desconfortável foi uma experiência psicologicamente e fisicamente muito difícil
- Uma documentação mais detalhada sobre a implementação do WSC será publicada separadamente no futuro
Agradecimentos
- Pindos: amigo que cedeu o PC à noite para ajudar na depuração e ainda aqueceu o quarto
- MrBruh: colega que deu o impulso inicial para começar a explorar o projeto e ofereceu feedback sobre as ideias
- Pessoas próximas que mantiveram contato durante o projeto e deram apoio
- Confessa seu amor por kimchi
- Também agradece ao artista que deixou grafite na nossa parede
1 comentários
Comentários do Hacker News
C:\ProgramData\Microsoft\Windows Defendere então criar um arquivo vazio no lugarnetcat.exe