##### Tutorial API Hook #####
[!] Sofredor: #M0rph
[!] Fb: fb.com/rodrigo.correia.3194
[!] WhiteCollarGroup
[!] Forum: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
[!] Sumario:
[!] 0x1 - O que é hook¿
[!] 0x2 - Exemplo de um hook
[+] 0x1 - O que é hook¿
Então meus amores, grosseiramente falando, é uma técnica de fazer desvio em certa chamada API, o próprio
nome já fala, hook(gancho). Imagine, quando você usa uma API do Win, tá lá seu código em C todo lindinho(mentira,
tá cheio de comentarios inuteis e palavrões =s ) bem assim:
...
MessageBox(0, "msg", "title", MB_OK);
...
Tu roda, e aparece a msg lá(obvio), mas se por acaso você queira que não apareça essa msg, que faça outra
coisa, o que usaria(tenha em mente a seguinte situação, seu app <- processo(irá interceptitar a API MessageBoxA
da user32.dll))¿ Um hook seria util nessa situação ;-p
Então, você agora já sabe o que é um hook, mas não sabe como usar(tenha calma, pq quem tem presa come cru
rsrs). Vamos lá, para hookamos uma API do Windows, devemos interceptar a tal API ser hookada, e substituir
por um salto para sua função, este salto será feito com a instrução JMP(salto incondicional em Assembly) +
endereço da sua função, assim, quando for chamada a API hookada, saltará para nossa função =D
[+] 0x2 - Exemplo de um hook
Nosso exemplo será criado em C++ no Visual Studio. Primeiramente, irei citar como será feito. Nós vamos
fazer um exmeplo simples, será assim-> Nossa APP hookará a API MessageBox de sua própria tabela de
importação(IAT). Não irei explicar mais nada, pois no código fonte está todo comentado.
Bye bye, bjs! :-p
Source de exemplo:
[!] Sofredor: #M0rph
[!] Fb: fb.com/rodrigo.correia.3194
[!] WhiteCollarGroup
[!] Forum: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
[!] Sumario:
[!] 0x1 - O que é hook¿
[!] 0x2 - Exemplo de um hook
[+] 0x1 - O que é hook¿
Então meus amores, grosseiramente falando, é uma técnica de fazer desvio em certa chamada API, o próprio
nome já fala, hook(gancho). Imagine, quando você usa uma API do Win, tá lá seu código em C todo lindinho(mentira,
tá cheio de comentarios inuteis e palavrões =s ) bem assim:
...
MessageBox(0, "msg", "title", MB_OK);
...
Tu roda, e aparece a msg lá(obvio), mas se por acaso você queira que não apareça essa msg, que faça outra
coisa, o que usaria(tenha em mente a seguinte situação, seu app <- processo(irá interceptitar a API MessageBoxA
da user32.dll))¿ Um hook seria util nessa situação ;-p
Então, você agora já sabe o que é um hook, mas não sabe como usar(tenha calma, pq quem tem presa come cru
rsrs). Vamos lá, para hookamos uma API do Windows, devemos interceptar a tal API ser hookada, e substituir
por um salto para sua função, este salto será feito com a instrução JMP(salto incondicional em Assembly) +
endereço da sua função, assim, quando for chamada a API hookada, saltará para nossa função =D
[+] 0x2 - Exemplo de um hook
Nosso exemplo será criado em C++ no Visual Studio. Primeiramente, irei citar como será feito. Nós vamos
fazer um exmeplo simples, será assim-> Nossa APP hookará a API MessageBox de sua própria tabela de
importação(IAT). Não irei explicar mais nada, pois no código fonte está todo comentado.
Bye bye, bjs! :-p
Source de exemplo:
Código PHP:
/*
* Sofredor: #M0rph
* Fb: fb.com/rodrigo.correia.3194
* WhiteCollarGroup
* Forum: www.darkhat.com.br/
*/
#include <windows.h>
#include <stdio.h>
DWORD My_Hook(LPCSTR Module_name, LPCSTR Func_Name, LPVOID Your_Function);
int lol();
void main()
{
printf("[!] Starting app...\n");
printf("[!] Activating hook on MessageBoxA...\n");
My_Hook("user32.dll", "MessageBoxA", lol);
printf("[+] Hook Active!\n\n");
printf("[!] Press any key to test...\n\n");
system("pause>null");
MessageBoxA(0, "msg", "title", MB_OK);
ExitProcess(0);
}
int lol(){
printf("Engracadinho.... Tentando usar a MessageBoxA neh? hsuahsu");
system("pause>null");
return 0;
}
// Esta funcao é responsavel por hook a api indica, ele recebe 3 parametros,
// nome do modulo onde está a API, ou seja, a dll * nome da API * nome da funcao para onde sera redirecionada...
DWORD My_Hook(LPCSTR Module_name, LPCSTR Func_Name, LPVOID Your_Function)
{ // com a GetProcAddress iremos pegar o endereco da API
DWORD addr = (DWORD)GetProcAddress(GetModuleHandleA(Module_name), Func_Name);
printf("[+] Found addr MessageBoxA(0x%X)\n", addr);
BYTE jmp[6] = { 0xe9, //jmp = um salto incodicional
0x00, 0x00, 0x00, 0x00, // endereco
0xc3 //retn - é igual ao return de uma funcao
};
DWORD calc = ((DWORD)Your_Function - addr - 5); //((para)-(de)-5)
memcpy(&jmp[1], &calc, 4); //agora vamos constriur nosso shellcode... ;p
// e por fim, escrever na memoria do processo, nosso shellcode
WriteProcessMemory(GetCurrentProcess(), (LPVOID)addr, jmp, 6, 0);
printf("[+] Bytes written...\n");
return addr;
}
Comment