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:

  • EventWrite e EventWriteEx – Escrevem um evento no fluxo de eventos do ETW.

  • StartTraceA e StopTraceA – 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