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:
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:
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
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:
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:
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