Artigo Clube Delphi 68 - API Hooking

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Neste artigo apresentarei uma das mais avançadas técnicas de programação para Windows: API Hooking.

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

imagem_pdf.jpg

API Hooking

Parte I - Dominando o sistema operacional

Programadores costumam se perguntar quais são os limites de suas ferramentas de desenvolvimento. Com nós, usuários do Delphi, não é diferente, mas com certeza nossas fronteiras são bem mais distantes do que a maioria das outras. Neste artigo mostrarei um bom exemplo disso, apresentando uma das mais avançadas técnicas de programação para Windows: API Hooking.

 

Conceitos iniciais

O Windows, como todo sistema operacional, possui um conjunto de funções que permite o desenvolvimento de aplicações para serem executadas sobre o SO. A cada uma dessas funções damos o nome de API (Application Programming Interface).

A API é uma camada entre o sistema operacional e uma aplicação, permitindo que programas se comuniquem com o SO e com seus serviços. Por exemplo, uma API torna possível um software criar janelas, exibir caixas de diálogo, desenhar na tela, apagar arquivos etc.

Quando colocamos um botão (TButton) em um formulário do Delphi, estamos chamando uma série de funções do sistema operacional, que cuidarão de desenhar corretamente o botão na tela, bem como responder às ações do usuário, como cliques do mouse e pressionamento de teclas. O mesmo vale para um aplicativo feito em VB, C++ etc.

Imagine agora o seguinte: você tem o código fonte do Windows e pode alterar as API’s do sistema operacional, adicionando uma chamada a alguma função criada por você, conhecida por callback, no início da declaração da função original.

Assim, sempre que tal API fosse executada, por quem quer que seja, o seu código seria chamado antes, e você poderia decidir o que fazer, repassando o processamento de volta para o SO ou realizando outra tarefa. Mas nós não temos o código-fonte do sistema da Microsoft para fazer isso. Isso seria então uma coisa impossível de se fazer? Definitivamente, não!

 

O que posso fazer com API Hooking?

A técnica de API Hooking permite, literalmente, reprogramar as funções do sistema operacional. Com o poder de interceptar tais comandos, é possível mudar seus parâmetros, alterando a ação que seria executada originalmente.

É possível, por exemplo, bloquear a exclusão de um determinado arquivo, impedir que um aplicativo seja executado, solicitar uma confirmação do usuário para gravar um documento no disco etc.

Sem sombra de dúvidas, a maior fatia de opções é na área de segurança, como antivírus e anti-spywares. Mas existem situações do nosso cotidiano de desenvolvedores onde a API Hooking, além de possivelmente ser a única saída, é uma “mão na roda”.

 

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;

"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?