Patch ETW

O que é o ETW?
O ETW foi introduzido pela primeira vez junto com o Windows 2000, originalmente projetado para fornecer registros detalhados de usuário e kernel, permitindo habilitar ou desabilitar dinamicamente esses registros sem precisar reiniciar o processo alvo.
Olhando a documentação da Microsoft veremos que ela descreve a arquitetura do ETW da seguinte forma:
A API de rastreamento de eventos é dividida em três componentes distintos:
Controladores, que iniciam e encerram sessões de rastreamento de eventos e habilitam os provedores
Providers, que geram os eventos
consumers, que consomem os eventos
Os controladores são restritos a usuários com privilégios de administrador, mas existem algumas ressalvas.
Além dos callbacks, o rastreamento de eventos de inteligência de ameaças do Windows também fornece rastreamento a partir do kernel e permite usar esses rastreamentos de várias maneiras.
O Windows Event Tracing (ETW) fornece um mecanismo para rastrear e registrar eventos gerados por aplicativos em modo de usuário e drivers em modo kernel.
Algumas das WinAPIs do ETW são:
EventWriteeEventWriteEx– Escrevem um evento no fluxo de eventos do ETW.StartTraceAeStopTraceA– Iniciam e param uma sessão de rastreamento do ETW.QueryAllTraces– Recupera as propriedades de todas as sessões de rastreamento do ETW em execução.
Parte de suas funcionalidades está localizada em ntdll.dll, e podemos modificar funções relacionadas ao ETW na memória para alcançar o efeito de impedir a saída de logs.
Nós utilizamos a técnica de corrigir (patch) o método EtwEventWrite para realizar o bypass, o que acaba sendo semelhante ao que é feito com o AMSI. Ao utilizar o IDA para observar as funções exportadas de ntdll.dll, é possível ver que, se modificarmos a primeira instrução do EtwEventWrite para que ela retorne 0, ele deixa de funcionar.
xor rax, rax obtém um valor 0 - é um método comum em assembly para gerar zero.
Após o patch no EtwEventWrite, ele não consegue mais escrever eventos para o processo atual.
Para verificar se a modificação realmente fez efeito, podemos utilizar um trecho de código que tenta chamar a função EtwEventWrite e observa qual resultado ela retorna.
A ideia é simples: após localizar a função dentro da ntdll.dll, fazemos uma chamada controlada e registramos se ela retorna sucesso, falha ou uma exceção. Isso nos permite identificar se o comportamento padrão da função foi alterado.
Além disso, também podemos inspecionar os primeiros bytes da função em memória para confirmar se houve alguma modificação em relação à implementação original.
O resultado que vamos obter será esse:

Alterantivas de patch
Existem muitas formas para aplicar um patch no ETW, uma outra forma é alterando o SSN (System Service Number) de NtTraceEvent. Isso funciona porque o SSN é o identificador numérico que o sistema operacional utiliza para localizar a função correta na SSDT (System Service Descriptor Table) durante uma syscall.
O efeito dessa técnica pode ser observado na imagem abaixo:

Last updated