Esse artigo faz parte da revista Clube Delphi Edição 68. Clique aqui para ler todos os artigos desta edição

e="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left" align=left> 

A mágica

“To hook”, em inglês, significa “enganchar alguma coisa”. API Hooking, no nosso contexto, quer dizer pegar uma API do SO, ou de qualquer DLL, e desviar a sua execução normal para um outro lugar, mais precisamente, para outra função. Existem basicamente três formas de fazer isso:

·     EAT e IAT Patching: todo EXE/DLL contém as tabelas de importação e de exportação de API's. Nessas tabelas estão contidos ponteiros que indicam o ponto de entrada (Entry Point) da API. Alterando esses ponteiros, fazendo-os apontar para nosso callback, temos um hook. Porém, se esse EXE/DLL não importar API’s, esse método não funcionará;

·     Simple Code Overwriting: como mencionado anteriormente, se fosse possível adicionar uma chamada para nosso callback no início do código da API, poderíamos “hooká-la”, fazendo nossa função ser executada sempre que a API fosse chamada. Mas há um problema: se depois que nosso código fosse processado, quiséssemos chamar a API original, cairíamos novamente no nosso callback e seria gerado um estouro de pilha. Uma solução seria desfazer o hook para poder chamar a API, refazendo-o novamente após sua execução. Entretanto, durante esse meio termo, várias chamadas à API podem ser feitas e não executariam nosso callback;

·     Extended Code Overwriting: essa é a solução para o problema do método anterior. Quando se insere a chamada para o callback no início da API, o código original que estava ali é sobrescrito (overwritten). Para evitar isso, criamos uma procedure virtual que executará esse código, chamando em seguida o restante da API, pulando o hook.

·      

Embora a teoria acima pareça fácil de entender, sua implementação de longe não o é. Para se fazer o que foi proposto no terceiro método, é necessário escrever código altamente complexo, usando constantemente instruções de baixo nível em assembler, além de criar artimanhas para obter acesso a setores do Windows protegidos, como anéis 0 e 3 (ring 0 e ring 3, veja Links). Felizmente, já fizeram isso por nós.

 

Nota: Existem desvantagens no terceiro método citado, mas elas são menores do que as dos outros. Para saber quais são elas e ainda conhecer outros métodos de API Hooking, veja a seção Links.

 

BmsAPIHook

A bmsAPIHook é uma biblioteca de funções desenvolvida pelo meu amigo Bruno Martins Stuani, um dos poucos especialistas em API Hooking do Brasil. Ele fez a incrível proeza de traduzir para Delphi Language o método Extended Code Overwriting, encapsulando tudo dentro de um conjunto de funções, e no final ainda liberou para download.

Ao lado da MadCodeHook (veja Links), essa é a única biblioteca de API Hooking free ...

Quer ler esse conteúdo completo? Tenha acesso completo