Há espaço para injetar código entre um aplicativo e suas bibliotecas externas. Fazer isso não é inerentemente ruim, mas é uma ótima maneira de causar danos.

Quando os desenvolvedores precisam estender a funcionalidade de um programa para o qual não possuem o código-fonte, geralmente recorrem ao hooking de DLL. Esta é uma maneira pouco ortodoxa de fazer um programa fazer algo que não se destina a fazer.

O problema é que os hackers também usam essa técnica por todos os motivos errados, como armar aplicativos inofensivos ou crackear software. Então, o que é o hooking de DLL e como ele realmente funciona?

O que é uma DLL?

Todo aplicativo depende de alguns arquivos fora de seu código base para ser executado. Esses arquivos externos contêm código e dados de que um programa precisa para funcionar corretamente. Quando algum desses arquivos externos desaparece, o programa pode ter problemas de estabilidade ou se recusar totalmente a ser executado.

No sistema operacional Windows, esses arquivos externos são chamados de DLL ou bibliotecas de vínculo dinâmico. As bibliotecas de vínculo dinâmico são componentes essenciais do sistema operacional Windows, fornecendo código reutilizável e recursos que podem ser compartilhados em vários aplicativos.

Arquivos externos no Windows são conhecidos como bibliotecas. Existem dois tipos de bibliotecas: dinâmicas e estáticas. Bibliotecas dinâmicas são carregadas em tempo de execução e bibliotecas estáticas são carregadas em tempo de compilação. DLL é uma biblioteca dinâmica.

O que é DLL Hooking?

O hooking de DLL é uma técnica que inclui interceptar e alterar programas de chamadas de função ou processos feitos para uma DLL. Essencialmente uma configuração Man-in-The-Middle é estabelecido onde um gancho fica entre um programa e as DLLs que ele chama. Todas as chamadas de funções ou chamadas de destino são então rastreadas e alteradas.

Aqui está um exemplo de um fluxo de trabalho de ataque de hooking de DLL:

  1. O invasor analisa as chamadas de função feitas pelo programa e os arquivos DLL dos quais ele depende.
  2. O invasor cria um gancho usando uma das muitas técnicas de implementação, como gancho IAT, gancho embutido, gancho COM, etc.
  3. A execução de código arbitrário acontece.
  4. A execução da chamada de função original pode ou não acontecer.
  5. O invasor encobre seus rastros apagando o gancho e revertendo todas as alterações feitas.

DLL hooking é uma técnica sofisticada que pode ser empregada tanto para o bem (como estender a funcionalidade do programa, depuração e logging) ou para o mal (como ignorar medidas de segurança, roubar dados confidenciais, executar código arbitrário e escrever jogos de vídeo hack).

Como o DLL Hooking funciona?

Antes de mergulhar na implementação do hooking de DLL, é importante esclarecer o básico. Vamos dar um passo para trás e entender o que acontece quando uma chamada de função é feita para uma DLL por um programa.

Quando um programa chama uma função em uma DLL, o sistema operacional primeiro procura o nome da função em Tabela de endereços de importação do programa e obtém o endereço da função do endereço de exportação da DLL Mesa.

Uma vez resolvido o endereço para a função, o programa pode saltar para o endereço da função para acessá-la e executá-la. O hooking de DLL gira em torno de interceptar esse processo e redirecionar a chamada de função para uma função diferente. Há várias maneiras de implementar o hooking de DLL. Vejamos as técnicas mais comumente usadas para implementá-lo.

Isso pode ser bastante técnico, então pode ajudar se você é um usuário avançado do Windows ou, de outra forma, ter um forte conhecimento dos componentes internos do Windows.

IAT Hooking

O hooking IAT é uma técnica eficaz amplamente empregada por autores de malware para burlar as medidas de segurança e evitar a detecção. A tabela de endereços de importação (IAT) é uma estrutura de dados que é carregada na memória sempre que um novo processo é criado. IAT contém os nomes de todas as chamadas de função importadas e seus endereços de memória.

Quando um programa chama uma função na DLL, o nome da função é primeiro procurado no IAT e se o endereço de memória da referida função não for encontrado no IAT, então é estabelecido a partir do endereço de exportação da DLL Mesa.

É uma estrutura de dados onde todas as funções exportadas pela DLL são mapeadas para seus endereços de memória. No hooking IAT, um adversário pode modificar o IAT de um processo e substituir os mapeamentos de funções legítimas com os maliciosos interrompendo assim a operação pretendida e fazendo o programa executar de forma arbitrária código.

Veja como é o fluxo de ataque geral no hooking IAT:

  1. Um programa faz uma chamada de função.
  2. O endereço da função está localizado no IAT.
  3. Desde que o IAT foi fisgado; o endereço da função foi alterado e o local da memória de uma função maliciosa foi carregado.
  4. O programa salta para o local da função maliciosa e o código arbitrário é executado.
  5. Finalmente, a chamada de função original é executada.

Gancho em Linha

O hooking embutido é uma técnica de hooking de DLL que envolve a alteração do código-fonte de uma função de destino para direcionar sua execução para uma função especial. O Inline Hooking, ao contrário do IAT hooking, altera o código da função de destino diretamente, dando ao invasor um controle mais preciso sobre como a função de destino se comporta.

No diagrama acima, observe como a função legítima foi adulterada para apontar para uma função maliciosa. Depois que todas as instruções da função maliciosa são executadas, uma instrução de salto é feita para retornar à função legítima para que ela termine a execução.

Os adversários empregam o hooking embutido para fazer alterações duradouras em um programa, como alterar os parâmetros ou o valor de retorno de uma função.

Microsoft Detours

A Microsoft Research desenvolveu um pacote interno de hooking de DLL, Detours. Ele permite que os programadores rastreiem e alterem as chamadas de função feitas por um programa. Os desvios podem ser usados ​​para uma variedade de tarefas, incluindo, mas não se limitando a: instrumentação, teste e correção de bugs.

Os adversários utilizam Detours para realizar ataques de injeção e hooking de DLL, e os desenvolvedores frequentemente o usam para estender a funcionalidade de seus aplicativos. Você pode saber mais sobre o pacote Detours no repositório GitHub oficial.

Agora você sabe como o DLL Hooking funciona

O hooking de DLL é uma técnica sofisticada que, quando usada pelos motivos certos, pode aumentar os recursos do seu aplicativo ou ajudá-lo a depurar e otimizar o software. Infelizmente, o hooking é mais comumente visto como uma técnica adversária do que como uma técnica de desenvolvimento. Portanto, é importante que você adote e siga as melhores práticas de segurança, garantindo que seus aplicativos estejam seguros e livres de ataques como hooking e injeção.