Ir para conteúdo
Faça parte da equipe! (2024) ×

[Tutorial]Interceptando .Dll's


fogote
 Compartilhar

Posts Recomendados

Será necessário:

- IDE C++

- MS Detours 1.5 (1.5 é o melhor, na minha opinião) Download - Scan

 

O que será feito:

- A injeção de uma biblioteca para interceptar a .dll e fazer as modificações que vc quizer.

- A .dll que injetaremos trabalhará por frames.

 

Descidi postar aqui no fórum uma técnica que eu usava para hackear um jogo chamado Wolfenstein: Enemy Territory.

O jogo era dividido em 3 bibliotecas (.dll's):

- cgame_mp_x86.dll - (Que roda informações de 'GamePlay')Alvo.

- ui_mp_x86.dll - (Que roda a interface do jogo).

- qagame_mp_x86.dll - (Que roda informações de 'Server', se houver algum rodando no PC).

 

Eu trabalhava em cima da cgame, que tinha tudo que era necessário.

 

Sabendo que eu trabalharia com cgame, eu preciso agora achar ele no meio de todos os outros. Cada .dll é diferenciado através de um número 'Módulo', definido normalmente como hModule. O número consiste em 4 bytes (32 bits), por tanto é um DWORD. (Na biblioteca padrão de C++, é definido como HMODULE, também).

 

Ótimo, ja sabemos o que precisamos, agora, o que faremos?

Podemos interceptar a chamada da .dll, que é realizada pelo programa que a roda.

Por isso, será necessário realizaar uma injeção no início do programa, ou antes de ele chamar a .dll (Se você souber quando). Esta chamada é realizada através da funcão:

É necessário se cadastrar para acessar o conteúdo.

LPCSTR = Long Point Char STRing,

ou seja, é uma entrada de texto, que podemos dizer, pelo nome da variável lpLibName, que seja o nome da .dll (Ex.: cgame_mp_x86.dll).

Isto quer dizer que, uma hora, o programa ira chamar esta função, usando o nome da .dll que nós queremos interceptar.

 

Agora vamos deixar isto mais interessante. Nós precisamos fazer a biblioteca que iremos injetar reconhecer quando LoadLibraryA vai chamar a .dll alvo, para isto, precisamos 'hookar' LoadLibraryA. Aí vamos precisar de MS Detours 1.5. Vamos fazer isto:

 

1 - Precisamos, antes de tudo, definir uma nova função, que será chamada no lugar de LoadLibraryA. Esta nova função fltrará .dll por .dll chamada pelo programa, e, quando achar a que nós queremos, recolherá as informações que queremos, seu Módulo. Ela precisa ser identica a LoadLibraryA no tipo de retorno e nos parametros. Também precisaremos criar uma função que copiará a LoadLibraryA original, para poder manter o funcionamento do programa. Definamos as funções assim:

É necessário se cadastrar para acessar o conteúdo.

 

2 - Agora que temos ja definimos as funções, precisamos passar para ela as suas 'tarefas', fassamos primeiro a passagem das tarefas de LoadLibraryA para orig_LoadLibraryA. Usaremos aki o detours. passarei também o código para recolocar as coisas no lugar, caso seja necessário.

É necessário se cadastrar para acessar o conteúdo.

 

Agora vamos atribuir tarefas para a função my_LoadLibraryA. Será necessário definir uma variável global que ira guardar o módulo da .dll que interceptaremos. Chamemos ela de tgModule. Ela será uma HANDLE.

É necessário se cadastrar para acessar o conteúdo.

 

Pronto! Você interceptou a .dll, agora pode fazer o que quizer com ela, como alterar dados, etc... Este módulo será somado ao endereço de cada 'coisa' da .dll, assim você pode hookar funções, roubar infos... bla, bla, bla... :D.

 

FuiZz.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...

Verifique os bugs que seu compilador da, eles podem mostrar algum erro de código que até eu possivelmente tenha cometido.

 

A parte de roubar informações ou altera-las fica meio complicado, pq ai eu ja entro em Assembly, etc... eu recomendo IDA Pro pra fazer um disassamble na .dll desejada e procurar pelo nome da função/estrutura desejada. Você vai ver um número de 8 dígitos hexadecimais logo na frente, que é o suposto endereço, que deve ser "mesclado" ao módulo da .dll. (somado). O endereço pode ser encontrado diretamente, ou através de uma call.

 

Endereço da fuñção

É necessário se cadastrar para acessar o conteúdo.

 

um exemplo de call para szDrawPlayer:

É necessário se cadastrar para acessar o conteúdo.

 

Não me lembro se é exatamente assim, mais é com certeza algo parecido.

 

No caso, se o módulo da .dll for igual a 30000000, o endereço da função szDrawPlayer, NA MEMÓRIA FÍSICA, é 30089DF3.

 

Espero ter ficado mais claro, exemplo fica meio complicado, mais posso postar algo simples dentro de uma semana (muito oculpado, semana de prova, e denho de finalizar alguns projetos).

 

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...

Se quizer aprender, você pode fazer uma simulação, já alterando uma .dll que vc msm pode fazer.

 

Tenta fazer um programa Console que chame uma dll que escreva na tela "Não fui hackiado :D", daí, use um debugger, como Olly Dbg ou IDA Pro pra achar a função que vc fez (o address). Daí, tire o module daí vc pode fazer uma dll que intercepte a normal e altere esta função, fazendo ela escrever "Fui hackiado :(".

 

Daí vc pode partir pra outros programas. Lembre-se que alguns são protegidos contra debugging... Enfim, Se eu puder postar algo relacionado, eu farei assim que puder ;).

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 4 semanas atrás...
Este tópico está impedido de receber novos posts.
 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.