Resultados 1 a 9 de 9

Tópico: Tutorial API Hook

  1. #1
    Lamer
    Data de Ingresso
    Feb 2012
    Posts
    16
    Post Thanks / Like

    Tutorial API Hook

    ##### Tutorial API Hook #####

    [!] Sofredor: #M0rph
    [!] Fb: fb.com/rodrigo.correia.3194
    [!] WhiteCollarGroup
    [!] Gretz: www.darkhat.com.br/

    [!] 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:
    /*
    * 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;
    }

  2. #2
    Moderador ingresso Avatar de .Nero
    Data de Ingresso
    Feb 2012
    Localização
    Earth
    Posts
    699
    Post Thanks / Like
    Tópico muito bem feito e organizado, parabéns!
    - kiss principle -
    - repeat after me: harem -


  3. #3
    Membro
    Data de Ingresso
    Mar 2010
    Posts
    329
    Post Thanks / Like
    Desculpe a arrogancia,eu ai fazer um tutorial sobre assunto,mas enfim...O seu tutorial não ficou muito bom,vc não explicou muito bem sobre a teoria do Hook e além disso o método usado no Hook não é IAT,é o Inline Hook que consiste em substituir o cabelhaço padrão nos primeiros bytes da função por um Push,um JMP ou um Call para a função da DLL.

  4. #4
    Lamer
    Data de Ingresso
    Feb 2012
    Posts
    16
    Post Thanks / Like
    Sim, faltou um pouco de teoria, mas não quis me conter com essa parte. Sim, você está certo, fui perceber agora, este método é o inline hook(como está explicado no tuto), isso que dá escrever um tuto e não revisar =s

    Desculpe pelos transtornos.

  5. #5
    Membro
    Data de Ingresso
    Mar 2010
    Posts
    329
    Post Thanks / Like
    Sim, faltou um pouco de teoria, mas não quis me conter com essa parte. Sim, você está certo, fui perceber agora, este método é o inline hook(como está explicado no tuto), isso que dá escrever um tuto e não revisar =s

    Desculpe pelos transtornos.
    Entendo,de qualquer forma valeu a atenção,vou dar uma medalha de prata por ter ajudado com o Forum.

  6. #6
    Hacker ingresso Avatar de guedes.acp
    Data de Ingresso
    Sep 2010
    Localização
    #!/usr/bin/env perl
    Posts
    1.444
    Post Thanks / Like
    Otimo tópico, obrigado.

    IAT é uma forma de substituir os primeiros bytes do cabeçalho. Ja vi algumas vezes fazer dessa forma com Delphi e C/C++.
    So respondo se a consiencia perguntar!!!
    Não Respondo MP's de perguntas, as faça em um tópico!

    Perl User, Bioinformatcs Programmer!


    just another biomedical perl hacker try to learn Delphi

  7. #7
    Membro
    Data de Ingresso
    Mar 2010
    Posts
    329
    Post Thanks / Like
    Otimo tópico, obrigado.

    IAT é uma forma de substituir os primeiros bytes do cabeçalho. Ja vi algumas vezes fazer dessa forma com Delphi e C/C++.
    Na verdade IAT é uma Tabela de Importação que todos os programas tem,e nela onde fica os endereços das funções,se vc editar isso pode dizer que MessageBoxA é igual a OpenProcess ou seja lá oq for que vc quer...O método usado para a substituição dos Bytes é as proprias funções da API do Windows,algumas pessoas usam VirtualProtect enquanto outras usam WriteProcessMemory.

  8. #8
    Lamer
    Data de Ingresso
    Feb 2012
    Posts
    16
    Post Thanks / Like
    Acho que apenas VirtualProtect não seria util para mudar os bytes de um executavel. Porque ele serve para dá permissão de leitura/escrita...
    VirtualProtect(dá permissão) e WriteProcessMemory(escreve) ambos amigos.

  9. #9
    Membro
    Data de Ingresso
    Mar 2010
    Posts
    329
    Post Thanks / Like
    Acho que apenas VirtualProtect não seria util para mudar os bytes de um executavel. Porque ele serve para dá permissão de leitura/escrita...
    VirtualProtect(dá permissão) e WriteProcessMemory(escreve) ambos amigos.
    uahuahuah erro meu então,deve ser pq já vi algumas pessoas usando apenas VirtualProtect em Foruns em inglês,enfim,parábens pelo tutorial.

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •