
Hell Code Loader
Injeção de Shellcode com VEH, HWBP e NTAPI no Windows
Tinha um bom tempo que eu não reservava um momento para escrever algo para meu blog, então aproveitei que estou usando um novo tema e decidi publicar este artigo sobre um loader intermediário.
O link desse projeto está aqui: Hell Code Loader
O objetivo é demonstrar como esse loader pode contornar alguns antivírus e, possivelmente, até alguns EDRs mais simples.
Neste post, vamos explorar técnicas avançadas para evadir mecanismos de segurança do Windows, combinando múltiplas abordagens para alcançar a execução de código com baixa detecção.
As técnicas abordadas incluem:
VEH (Vectored Exception Handling)
Chamadas indiretas (NTAPI para operações de memória)
HalosGate para obtenção de SSNs (System Service Numbers)
Carregamento de DLLs via Thread Pool Callback
As informações que você encontrar neste post, técnicas, códigos, provas de conceito ou qualquer outra coisa são estritamente para fins educacionais.
Fluxo de Injeção e Execução
Verificar status do ETW antes de alterações.
Remover HWBPs pré-existentes.
Carregar DLLs via callback.
Definir HWBPs em
AmsiScanBuffereNtTraceEvent.Registrar handler de exceção vetorizada (
VEH).Execução de shellcode:
NtAllocateVirtualMemory→ aloca região PAGE_READWRITE.NtWriteVirtualMemory→ grava o shellcode criptografado.Descriptografia via
RC4DEC.Gatilho de EXCEPTION_ACCESS_VIOLATION:
( (void(*)()) shellcodeMemory)();
Implementando o HWBP Engine
Neste projeto, vamos utilizar breakpoints de hardware para aplicar um patch na AMSI e ETW. Na minha experiência, essa técnica ainda é eficaz contra a maioria dos mecanismos de detecção usados por soluções AV/EDR.
Recentemente, alguns fornecedores começaram a implementar detecções baseadas em ETWti, utilizando chamadas como SetThreadContext, conforme detalhado neste artigo.
O Hardware Breakpoint Engine (HWBP) permite definir breakpoints de hardware em pontos de interesse (por exemplo, AmsiScanBuffer e NtTraceEvent). Utilizamos:
Dr0–Dr3: endereços de breakpoint.
Dr7: controle de habilitação.
Evasão de AMSI/ETW via Breakpoints de Hardware
Ao definir breakpoints em:
AmsiScanBuffer(função emamsi.dll)NtTraceEvent(função emntdll.dll)
podemos interceptar o EXCEPTION_SINGLE_STEP e forçar um retorno de sucesso:
Exemplo de uso:
HalosGate: Obtendo SSNs (Syscall Service Number)
Para obter Syscall Service Numbers (SSNs) mesmo quando as APIs da NTDLL estão hookadas vamos utilizar de base o projeto AsmHalosGate que implementa:
Resolução de Endereços:
Obtém o endereço base da NTDLL
Localiza a tabela de exportação
Encontra os endereços das APIs necessárias
Obtenção de SSNs:
Usa
halosGateUpehalosGateDownpara encontrar SSNs válidosMantém os SSNs em variáveis globais para uso posterior
Carregamento de DLL via Thread Pool Callback (TpAllocWork)
Visão Geral da Abordagem
Resolver o endereço de
LoadLibraryAemkernel32.dllusandoGetProcAddress.Recuperar os ponteiros para
TpAllocWork,TpPostWorkeTpReleaseWorkemntdll.dll.Alocar um trabalho (
TP_WORK) na thread pool comTpAllocWork, passando um callback em assembly que fará um tail-call paraLoadLibraryA, usando o nome da DLL comoContext.Publicar o trabalho com
TpPostWorke liberar o objeto comTpReleaseWork.Aguardar a execução do callback para garantir que a DLL foi carregada.
Implementação em C/C++
Callback em Assembly (x64)
Descriptografia RC4
Bom, quem já viu minhas postagens anteriores sabe que não adianta, vou continuar utilizando essa bomba, por isso, acho que não tenho mais nada a acrescentar. 😂
Ofuscação de Strings básico
Para evitar detecção por assinaturas de strings, implementamos:
Strings "Fragmentadas":
Mecanismo de Descriptografia RC4 básico
O shellcode é descriptografado usando RC4 básico para evitar detecção estática. O processo de descriptografia envolve:
Primeira Camada de Descriptografia:
Dupla Camada de Descriptografia:
Descriptografia:
O shellcode só é descriptografado em memória
Configurando o VEH Handler
Vamos utilizar o mecanismo de VEH para iniciar a thread do nosso shellcode.
Evitando assim o uso de métodos mais tradicionais, como NtCreateThreadEx ou Queue/APC.
O VEH (Vectored Exception Handler) será configurado para capturar exceções do tipo EXCEPTION_ACCESS_VIOLATION, que vai ocorrer ao tentar executar uma região de memória marcada como não-executável.
Quando a exceção for gerada, redirecionamos manualmente o registrador RIP para o endereço onde o shellcode foi previamente alocado.
Essa abordagem permite executar o shellcode de forma mais "furtiva", explorando o fluxo "natural" de exceções do processo:

E registramos:
Aviso! EDRs avançados conseguem detectar uso abusivo de breakpoints de hardware e VEH.
Testes do loader contra AV/EDR
Vou realizar a execução do mimikatz convertido para shellcode, utilizando o projeto donut.
Lembre-se de desativar o bypass AMSI/WLDP/ETW do donut caso queira fazer uso desse projeto, senão ele será facilmente detectado!"
🥈 2º lugar
🏆 Approved Enterprise & Business Security Product 2024 pela AV-Comparatives
🥉 3º lugar
🏆 Approved Enterprise & Business Security Product 2024 pela AV-Comparatives
Ranking baseado em premiações independentes (AV-Comparatives 2024) e reputação no mercado em 2024.
Loader + Dll Proxy
Bom, quando executei o loader no Bitdefender Total Security e no Bitdefender Endpoint Security, ele foi detectado. Então, decidi tentar realizar o proxy de DLL no Notepad++ como mostrei em outras postagens. Fiz apenas isso e contornou a detecção.
Código para realizar o proxy de dll no Notepad++
Finalização
Bom, gostei bastante de fazer esse projetinho no meu tempo livre. Acho que ainda não perdi o jeito de escrever esses “papers” pouco profissionais e documentados, mas não ligo. continuo gostando de fazer isso. Então, é isso. nos vemos na próxima postagem, espero que seja melhor do que essa.

Last updated