Resultados 1 a 2 de 2

Tópico: [C]Inline Hook

  1. #1
    Membro
    Data de Ingresso
    Mar 2010
    Posts
    329
    Post Thanks / Like

    Talking [C]Inline Hook

    O tutorial era se tratar de uma técnica bem conhecida e usada para fazer Api Hooking,se vc acabou de começar a aprender programação
    não aconselharia este tutorial,inclusive não explicarei como funciona as funções usadas da WinAPI por ser algo comum
    para programadores mais experiente.

    1. Oque é Api Hooking.

    Api Hooking é quando alterar-mos o comportamento de uma função do Windows afim de que ela não seja executada e sim
    a nossa função.

    2. Teoria do Hooking.

    Agora que já sabemos oque é Api Hooking precisamos entender como funciona mais profundamente,pra começar existem 3
    métodos de Hook no Windows,EAT Hook,IAT Hook,e Inline Hook.

    IAT Hook(Import Address Table Hook): Achamos o endereço da função na Import Address Table e escrevemos o endereço
    da nossa função que está na DLL que usaremos.

    EAT Hook(Export Address Table Hook): Achamos o endereço da função na Export Address Table da DLL e escrevemos o endereço
    da noosa função que está na DLL que usaremos.

    Inline Hook: Este será o método que usaremos,o Inline Hook é quando pegamos as primeiras instruções de uma função e
    trocamos por um JMP,um Push ou um Call para nossa função.

    3.Como funciona o Inline Hook.

    As funções da Api do Windows tem uma "Introdução" padrão que passou a ser usada depois do WinXP SP2,vamos ver como está introdução é:

    Código:
    MOV EDI,EDI
    PUSH EBP
    MOV EBP,ESP
    E oque faremos com essa introdução ? É nela que iremos escrever o nosso código que chamará nossa função,que ficaria assim:

    Código:
    PUSH MyFunc
    RETN
    No lugar de MyFunc colocariamos o Address da nossa função.

    4.Codando o Hook.

    Por ultimo,agora que já entendemos como funciona o Inline Hook iremos criar uma DLL que ira ser usada para criar nosso Hook nas
    aplicações que injetarmos ela.
    Começamos usando um GetProcAddress,com isso conseguiremos pegar o endereço base da função que iremos hookar,e assim
    poderemos substituir os primeiros bytes pelo nosso PUSH.
    Não vou passar o código inteiro do Hook vcs teram que seguir o tutorial pra entender como é feito,para começar
    declare as seguintes variaveis globais:

    Código:
    DWORD FuncPtr;
    unsigned char  NewCode[6] = {0x68,00,00,00,00,0xC3};
    unsigned char *OldCode[6];
    Oque são elas ? Primeiramente,FuncPtr é um DWORD que sera usado para pegar-mos o endereço onde a função que iremos Hookar está,
    neste caso usaremos MessageBoxA como exemplo.E oque é esse NewCode e OldCode ? O NewCode será as novas instruções que escrevere-mos
    na memoria,oque são Opcodes que cada um deles são equivalentes a instruções em ASM,olhando abaixo você entenderá melhor:

    Código:
    0x68 = PUSH.
    00,00,00,00 = Null-Bytes que serão trocados pelo endereço da nossa função.
    0xC3 = RETN.
    Não irei explicar essas instruções,até pq é algo basico e temos o goole pra isso.
    Por ultimo o OldCode,este Array servira para nós pegar-mos os Bytes que iremos substituir para quando for necessário desfazer o Hook ou tivermos
    que chamar a função original e não acabar-mos num Endless-Loop.


    Agora podemos ir para a parte de Hookar MessageBoxA,vejamos o código seguinte:

    Código:
    int Hook()
    {    
        DWORD dwFunc;
        FuncPtr = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA");
        dwFunc = (DWORD)&MyMessageBoxA;
        ReadProcessMemory (GetCurrentProcess(),(LPVOID)FuncPtr,OldCode,6,NULL);
        memcpy(&NewCode[1],&dwFunc, 4);
        WriteProcessMemory(GetCurrentProcess(),(LPVOID)FuncPtr,NewCode,6,NULL);
        return 0;
    }
    Bom pessoal o código não é tão complexo assim,pra começar pegamos o endereço de MessageBoxA,em seguida setamos o valor de uma variavel para o endereço
    de um nossa função que será chamada invês de MessageBoxA,em seguida pegamos os 5 primeiros bytes do endereço da função MessageBoxA e colocamos no nosso Array
    OldCode para poder-mos usa-lo mais para frente,em NewCode ainda tinha 4 Bytes vazios e com "memcpy" copiamos o endereço da nossa função e substitui-mos aqueles bytes
    vazios para o endereço da nossa função,em seguida escrevemos o NewCode para a memoria do executavel.

    Agora que já conseguimos hookar falta uma coisa para poder-mos compilar,a nossa função que será o substituto para MessageBoxA:

    Código:
    int MyMessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
    {
        int Result;
        WriteProcessMemory(GetCurrentProcess(),(LPVOID)FuncPtr,OldCode,6,NULL);    
        MessageBoxA(hWnd,"Hooked Func!","Hooked Func!",uType);
        WriteProcessMemory(GetCurrentProcess(),(LPVOID)FuncPtr,NewCode,6,NULL);
        return Result;
    }
    Bom pessoal vocês notaram um WriteProcessMemory antes de chamar a função original,porque disso ? Simples,se vocês voltarem
    ao inicio do Tutorial entenderam que nós escrevemos um PUSH para chamar nossa função e um RETN pra que a função original
    não seja chamada,então significa que toda vez que MessageBoxA for chamada nossa função será chamada e MessageBoxA não é concluida com sucesso,
    logo toda vez que vamos chamar a função original mesmo de dentro da nossa DLL precisamos desfazer o Hook,caso contrário cairiamos num Endless Loop,oque
    acabaria dando Stack Overflow.
    E porque do WriteProcessMemory depois que chamamos MessageBoxA? Simples,caso não fizeramos isso a função ficaria sem o Hook,pois deshooka-mos ela,chamamos,e então
    em seguida precisamos hookar novamente,para que o Hook funcione mesmo depois de que a função seja chamada uma função.

    Bom pessoal não vou postar a Source completa,até pq esse tutorial tem intuito de aprendizado caso eu o fizesse não adiantaria muita coisa para vcs,pois vocês tem que entender
    a teoria do Hook e conseguir fazer por sí mesmos.
    E por fim deixo a vocês dois livros que li,eles explicam muito bem sobre o assunto embora esteja em inglês:

    https://www.htbridge.com/publication...in_windows.pdf
    https://www.htbridge.com/whitepaper/...%20Windows.pdf

    Lembrando que esses livros não são meus e sim da High Tech Bridge e ambos estão disponiveis gratuitamente no site da empresa.

    OBS: Meu conhecimento em C não é tão grande pode ter alguma merda ai,qualquer coisa me avisem,e fiz o tutorial sem compilar então podem ter erros.

  2. #2
    Membro Avançado ingresso
    Data de Ingresso
    Dec 2011
    Localização
    !/usr/bin/env perl
    Posts
    868
    Post Thanks / Like
    Muito bom o tutorial, finalmente fez ele... Explicou direito cada passo.

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
  •