• Bem vindo à nossa comunidade - Quer se juntar ao resto dos nossos membros? Registre-se*Registros aprovados pela adminitração

[Tutorial] [ASM] Dando Hook

lucasxdd

Lord XPZ
bom, como não tem uma área de tutoriais para desenvolvimento, vo postar aqui mesmo...

esse tutorial está implementado no tutorial da GXSoft - Desenvolvendo e Entendendo um Servidor que será lançado em breve por mim...

primeiramente... mtos dao hooks, sabem fazer, etc mas nao entendem o que fazem... ai se prendem a programinhas horriveis que "fazem o hook automaticamente"

vou explicar o que cada linha ASM faz e vocês poderão ver que não tem segredo nenhum.

Começando:

um hook simples se dá assim:

Por favor, Entrar ou Registrar para ver o conteúdo das citações!
bom explicar esse hook é muito simples, e vou utilizar a assimilação com o C++

primeiramente você vai até offsets limpos (VAZIOS) clique com botao direito > follow in dump

nos pontinhos que aparecerem la em baixo nos dumps, adicione em um offset o nome de sua DLL e em outro offset o nome do inicio da sua função (nao vou explicar isso aki pois tem varios ensinando... e o objetivo do topico eh explicar ASM do hook)

vou utilizar o nome da GX para dll entao coloquei nos pontinhos la em baixo GXSoft.dll no offset 0x568987 e a funçao de inicio Init no offset 0x568990

seguindo o hook que esta mais acima, você primeiramente vai dar um push no offset da dll

PUSH 0x568987 - isso chama apenas o nome da dll, seria + - você declarar um variavel exemplo string nome = "GXSoft.dll"

porém puderam atentar que não existe uma "variavel" propriamente dita... mas ai que você se engana.

EAX - seria a variavel que está atribuida à DLL, ou seja seria algo parecido com: string EAX = "GXSoft.dll"

bom continuando, você tem na proxima linha a funçao loadlibraryA

essa função ja contem em qualquer executavel que possua uma dll, LoadLibrary nada mais é que chamada de uma dll.... no c++ chamamos uma funçao usando NOMEDAFUNÇAO(); para chamar uma dll completa no C++ utilizamos a LoadLibraryA("nomedll") entao essa linha basta você procurar a linha do LoadLibrary das dlls originais do GS ( nao vou explicar pq nao envolve o ASM)

OR EAX,EAX - nessa parte representaria algo parecido com: if(eax != verdadeiro) ou seja, caso nao exista GXSoft.dll na pasta de onde está o executavel, ele faz algo, que eh a proxima linha...

JE 0 - nada mais é que o famoso ExitProcess(0); do C++

serve para finalizar o processo atual...

entao juntando as 2 ultimas linhas acima temos:

OR EAX,EAX

JE 0

em c++ ficaria + - assim:

if(eax != verdadeiro){

exitprocess();

}

ou seja, caso a dll nao exista, ou nao seja o mesmo nome da variavel EAX, o processo é finalizado!

seguindo temos a linha:

PUSH *OFFSET da Função*

que no meu caso ficaria:

PUSH 0x568990 - chama a linha de inicio da minha dll

no c++ daria pra representar + - assim:

Código:

Por favor, Entrar ou Registrar para ver o conteúdo das citações!
ou seja, não basta chamar apenas a DLL, vc tem que mostrar onde que a dll começa a ser executada, se nao a dll fica perdida, nao sabe oq tem que fazer primeiro, por que uma dll nao tem a funçao MAIN que um .exe possui, e que por padrão é sempre o inicio da aplicação.

se vocês atentarem bem, poderá ver que é a sequencia do if que fiz ali em cima... ficando algo parecido com isso:

if(eax != verdadeiro)

exitprocess();

else

ChamaInicioDaNossaDLL();

IniciaDLL();

PUSH EAX - significa que você esta inicializando a variavel EAX, o que eh bem diferente do CALL eax, onde ela ja está inicializada e vc apenas chama ela novamente. um exemplo em C++ ficaria:

int a = 0; //isso corresponde ao PUSH EAX

para simular o Call seria vc utilizar a variavel a em algum lugar, exemplo:

msgbox(a); //vai aparecer o conteudo da variavel a...no caso 0 (zero).

o GetProcess, é a funçao INICIO das DLLS que ja estao no executavel, entao vc tem que por o CALL dela também, caso nao coloque, o executavel busca as dlls padroes com o LoadLibrary, porém elas ficam perdidas, e nao sabem por onde começar, qual entra primeiro etc... pra isso serve o getProcess

e por fim, colocamos o entrypoint original do executavel, após fazer a leitura da nossa dll, das dlls originais, ele pula (JMP) para o offset original de inicio do programa... que em c++ nada mais é que o ponto de inicio do codigo... ou seja a função MAIN.

espero que tenham entendido, caso tenham duvidas podem postar!

abraços a todos!

OBS: me irrita profundamente essa IDENTAÇÃO CENTRAL DO FORUM, fica tudo mais dificil de ler

credo!

Creditos :

NaM4
 
Topo Bottom