Unhooking
Nesse post vou abordar uma técnica antiga e simples de como podemos realizar a técnica de DLL unhooking para contornar possíveis antivírus.
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.
O que é um hook?
No contexto de antivírus, um hook pode ser usado para monitorar e modificar chamadas de funções em APIs do sistema, como as fornecidas pela kernel32.dll. por exemplo um antivírus pode usar hooks para interceptar chamadas a funções como CreateFile ou ReadFile para detectar atividades suspeitas de malware, caso queira saber mais sobre recomendo que leia meu post: Simple EDR.

Unhooking
Digamos que temos um antivírus que realiza um hooking apenas na kernel32.dll para monitorar o uso de APIs como OpenProcess, VirtualAllocEx, WriteProcessMemory e CreateRemoteThread. se quisermos contornar esse antivírus, poderíamos ler a seção .text da kernel32.dll presente no disco e substituí-la pela seção .text mapeada na memória do processo. ou seja, apenas vamos copiar o original sem o hooking, e escrever sobre o que está hooked.

Monitoring APIs
Para a prova prática vamos usar um injetor simples, sem o código de unhooking para observar como ele se comporta perante o EDR/AV que fiz:

Código de unhooking:
Obtendo o Handle do Processo e do Módulo
GetCurrentProcess(): Obtém um handle para o processo atual. GetModuleHandleA("kernel32.dll"): Obtém o handle do módulo kernel32.dll que está carregado no processo atual, isso permite acessar informações sobre o módulo.
Obtendo Informações do Módulo
GetModuleInformation(): Preenche a estrutura MODULEINFO com informações sobre o módulo especificado, incluindo a base do módulo e o tamanho, isso é necessário para manipular a memória do módulo.
Abrindo o Arquivo DLL e Criando Mapeamento
CreateFileA(): Abre o arquivo kernel32.dll no diretório do sistema. CreateFileMapping(): Cria um mapeamento de arquivo para a DLL, permitindo que o conteúdo do arquivo seja acessado diretamente na memória.
Mapeando o Arquivo na Memória
MapViewOfFile(): Mapeia a visão do arquivo para a memória, permitindo que o conteúdo do arquivo seja lido diretamente.
Restaurando a Seção .text do Módulo
.text do MóduloPIMAGE_DOS_HEADER e PIMAGE_NT_HEADERS: Estruturas que representam o cabeçalho do arquivo PE (Portable Executable) da DLL. VirtualProtect(): Modifica as permissões de proteção da memória para permitir escrita. memcpy(): Copia a seção .text da DLL mapeada de volta para o módulo carregado na memória.
Limpando e Concluindo
UnmapViewOfFile(): Desfaz o mapeamento do arquivo da memória. CloseHandle(): Fecha os handles abertos. FreeLibrary(): Descarrega a DLL do processo.
Código Completo:
Prova De Conceito:
Note que, para realizar esta prova de conceito eu fiz o seguinte: adicionei ao código de um simples injetor de shellcode o código de unhooking e comentei o uso da API OpenProcess como [HOOKED], pois realizo o unhooking apenas depois do uso dessa API para mostrar que de fato a DLL do EDR/AV estava realizando o hook das APIs normalmente antes de realizar o unhooking.
Last updated