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.


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

PIMAGE_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