Ir para conteúdo
Faça parte da equipe! (2024) ×
Conheça nossa Beta Zone! Novas áreas a caminho! ×
  • Quem está por aqui   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.

Criando Trainer para Pinball Conscientemente


Ryokusei
 Compartilhar

Posts Recomendados

Antes de começar a ler o tutorial, siga essas regras abaixo à risca:

 

- Se você é iniciante saia desta página agora,

- Se você tem dúvidas idiotas saia desta página agora,

- Se você não sabe o que é uma API saia desta página agora,

- Se você não sabe o que é um ponteiro saia desta página agora,

- Se você pensa em reclamar por eu falar mais de assembly que de Delphi neste tutorial saia desta página agora,

- Se você pensa em reclamar por achar que eu copiei isso saia desta página agora e se mate,

- Se você não gosta de gatinhos saia desta página agora.

 

Não vou responder dúvidas idiotas nem membros iniciantes querendo aprender, esse tutorial não foi feito pra crianças (embora seja um tutorial bem simples).

Este tópico é pra ter uma discussão de mais alto nível e não a vergonha que são 99% dos tópicos daqui.

Não poste coisas idiotas como "Vlw obrigado aí", "bom tutorial, parabéns", vou punir sem piedade, eu repito "Este tópico é pra ter uma discussão de mais alto nível e não a vergonha que são 99% dos tópicos daqui.".

É com pesar que eu posto esse tutorial aqui, eu sei que como a maioria dos tópicos que prestam, ele vai morrer e ser esquecido.

 

Vamos ao trabalho.

 

Este tutorial foi feito no Windows XP, podem haver divergências em outras versões do Windows, os addresses podem ser outros e coisas do tipo. Se vira aí, use VM dê o seu jeito.

 

Ferramentas necessárias:

 

- Ollydbg

- Cheat Engine

- Pinball 3D Space Cadet para Windows

 

[DOWN]

É necessário se cadastrar para acessar o conteúdo.
[/DOWN]

[sENHA]

É necessário se cadastrar para acessar o conteúdo.
[/sENHA]

 

Se você não pode/consegue baixar o FileSonic então se vira e procura na net as ferramentas.

 

Conhecimentos básicos necessários:

 

- Encontrar addresses no Cheat Engine

 

Tutorial:

 

1 - Inicie o pinball e econtre o address da sua pontuação. Não é o do placar, saiba diferenciar o address do placar do address da sua pontuação real.

No meu caso foi 0x00BEAEBA.

 

857215e71c0df08a653c6d2e97abfdd0.png

 

2 - Vá em "Find out what writes to this address".

 

144ccc80621435443abf7bf457ae3f5b.png

 

3 - Ganhe algum ponto (pra alterar sua pontuação) e veja o opcode que aparece no CE.

 

7695664586c3f444c2e6ff7f2e7c3873.png

 

4 - O opcode e o address devem ser exatamente esses "0101757c - 01 30 - add [eax],esi".

Agora feche o CE e vá ao Olly. Atache o Olly (File/Attach) ao processo do pinball.

Vá ao Address (CTRL+G) 0x0101757C.

Você vai notar que os gráficos do meu ollydbg são diferentes, mas isso não influencia em nada.

 

b49e2e92d6e1396ce5b631e96b673cce.png

 

5 - Marque um Breakpoint (F2) no address 0x0101757C.

Um breakpoint gera um exceção conhecida no debugger quando EIP é igual ao address em que o Breakpoint foi setado.

 

b7b02327a0f91056bb9246a9388d3f5f.png

 

6 - Rode o pinball (F9) e espere que sua pontuação seja alterada para que o breakpoint seja chamado.

Olha que bonito:

 

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

 

EAX é nosso ponteiro da pontuação (meu nesse caso, mas aí no seu pc vai estar diferente) e ESI é quanto será adicionado à nossa pontuação.

 

8bf6fe4e30da0b8f2a3c8c5527c0d773.png

 

7 - Suba um pouquinho e veja a instrução logo acima de 0x0101757C.

 

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

 

Isso é como se fosse (lembre-se que no ollydbg tudo é em hexadecimal):

 

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

 

Agora sabemos que nosso ponteiro da pontuação tem como base ECX, isso porque a função é do tipo thiscall, ou seja, o ponteiro do objeto em questão é passado em ECX e 0x52 é apenas um offset de alguma propriedade do objeto que neste caso é a pontuação.

Precisamos agora saber da onde vem ECX, precisamos de uma coisa constante e fixa, pois o address da pontuação vai variar sempre.

 

d2e964e08d5cdbcb9683a69606708c24.png

 

8 - Agora note que antes de sair da função, temos alguns "POP":

 

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

 

Temos 3 POP's, ou seja, antes de retornar ESP terá um acréscimo de 12 bytes, pois cada POP adicionará 4 na stack.

Então use CTRL+G e ponha [ESP+C]

 

ac9f37678b8c1bd83dfb0ee8bdb30c80.png

 

9 - Legal, estamos em 0x0100C482.

 

49d399b18a821bb329264cc816cce460.png

 

10 - Suba um pouco e você verá de onde vem ECX.

 

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

 

ECX vem de um valor fixo, que é 0x1025040.

 

Agora que temos uma referência útil podemos fazer nosso trainer.

 

Sabemos que:

 

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

 

Sendo EAX nosso ponteiro para a pontuação. Agora ficou fácil, vamos ao Delphi.

 

d51dcf773b42c0064afe05b838371910.png

 

11 - Cole esse code abaixo pra organizar os objetos no Form:

 

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

 

fa83ba0c44427b5eeff4030e9535d3ed.png

 

12 - Declare a função:

 

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

 

Não esqueça de adicionar a unit TlHelp32.

 

4d74d8c2875fdf01c5e88659330dc870.png

 

13 - Declare as variáveis e constantes globais:

 

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

 

46c3a660f9e25d0494f149dbf5bc3510.png

 

14 - Dê dois cliques no Timer e vamos começar a trabalhar.

 

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

 

776cec684eba84e5514c6dae23559901.png

 

15 - Agora dê dois cliques no Botão para fazermos a última parte.

 

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

 

7d08c93b2fc22dc66522497f83abbd08.png

 

Chegamos ao final, bem é isso aí é pra você entender boa parte do tutorial por si mesmo, assim você pensa e aprende melhor.

Qualquer dúvida sinta-se livre para postar, eu também vou me sentir bem livre pra decidir se respondo ou não.

 

Depois disso tudo tente fazer você mesmo a mesma coisa do tutorial mas com as bolas ao invés da pontuação, se fizer isso pode afirmar que aprendeu.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Não gosto de gatos then fui embora. Brinks.

 

Tutorial fodão mesmo, pena que eu instalei o Seven , logo, sem Pinball.

 

Vou tentar utilizar esse métodos no C++ ( o problema é que C++ tem form builders horríveis (fora o .Net, mas isso é pra fracos )) com algum jogo do Windows 7.

 

Vou acrescentar mais algumas coisas para novatos. Novamente, falarei sobre registradores:

 

A CPU tem uma espécie de memória para a realização da suas operações. Este são os registradores.

 

Cada registrador guarda o número de bits que a CPU foi arquitetada, ou seja.

 

AX = 16 bits (processadores de 16 e 32 bits e 64 ( < eu acho ) )

EAX = 32 bits ( processadores de 32 bits e 64 bits)

RAX = 64 bits (processadores de 64 bits )

 

Os registradores mais básicos são

 

EAX = Registrador Acumulador

EBX = Registrador Base

ECX = Registrador Contador (usado pra loops, por exemplo )

EDX = Registrador de Dados (usado para abrigar ponteiros para endereços na memória para variáveis e strings )

 

etc. etc.

 

O Wikipédia tem tudo, vale a pena ver!

Link para o comentário
Compartilhar em outros sites

Ryokusei, o tutorial é realmente "foda", felipeanchieta concordo com você, estou cada vez mais me aprofundando nesse assunto, quero mais e mais a cada dia, estou fazendo os testes com as "bolas"(Que coisa gay... =D), jájá edito, mas a meu ver, eu entendi, agradecido.

 

OBS: Espero que poste mais coisas deste tipo.

Link para o comentário
Compartilhar em outros sites

then[/color] fui embora. Brinks.

 

Tutorial fodão mesmo, pena que eu instalei o Seven , logo, sem Pinball.

 

Vou tentar utilizar esse métodos no C++ ( o problema é que C++ tem form builders horríveis (fora o .Net, mas isso é pra fracos )) com algum jogo do Windows 7.

 

Vou acrescentar mais algumas coisas para novatos. Novamente, falarei sobre registradores:

 

A CPU tem uma espécie de memória para a realização da suas operações. Este são os registradores.

 

Cada registrador guarda o número de bits que a CPU foi arquitetada, ou seja.

 

AX = 16 bits (processadores de 16 e 32 bits e 64 ( < eu acho ) )

EAX = 32 bits ( processadores de 32 bits e 64 bits)

RAX = 64 bits (processadores de 64 bits )

 

Os registradores mais básicos são

 

EAX = Registrador Acumulador

EBX = Registrador Base

ECX = Registrador Contador (usado pra loops, por exemplo )

EDX = Registrador de Dados (usado para abrigar ponteiros para endereços na memória para variáveis e strings )

 

etc. etc.

 

O Wikipédia tem tudo, vale a pena ver![/size][/font]

 

Use forms em resource, é muito mais limpo e leve.

Se não souber como me avise que eu crio um tópico ensinando.

Link para o comentário
Compartilhar em outros sites

Saber mesmo eu não sei, sei muito pouco ainda.

 

Bom, eu estava fazendo um injetor em C++, me recuso a fazer em Delphi porque eu não sei Delphi e não gosto de só copiar e colar.

 

E no Form/DialogBox desse injetor, eu queria deixar as bordas fixas, de maneira que não pudessem ser redimensionadas. No Form Designer do CLR/dotNet, tem aquela propriedade BorderStyle e tal né. Só que no Form Designer de Resources, as propriedades são mais simples e muito diferentes '-'

 

Então seria sim de grande ajuda em tutorial de uso de Resources, até pra tirar essa imagem de que todo programa em C++ tem que ser em linha de comando.

Link para o comentário
Compartilhar em outros sites

Saber mesmo eu não sei, sei muito pouco ainda.

 

Bom, eu estava fazendo um injetor em C++, me recuso a fazer em Delphi porque eu não sei Delphi e não gosto de só copiar e colar.

 

E no Form/DialogBox desse injetor, eu queria deixar as bordas fixas, de maneira que não pudessem ser redimensionadas. No Form Designer do CLR/dotNet, tem aquela propriedade BorderStyle e tal né. Só que no Form Designer de Resources, as propriedades são mais simples e muito diferentes '-'

 

Então seria sim de grande ajuda em tutorial de uso de Resources, até pra tirar essa imagem de que todo programa em C++ tem que ser em linha de comando.[/size][/font]

 

Beleza, depois eu crio.

Link para o comentário
Compartilhar em outros sites

8 - Agora note que antes de sair da função, temos alguns "POP":

 

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

 

Temos 3 POP's, ou seja, antes de retornar ESP terá um acréscimo de 12 bytes, pois cada POP adicionará 4 na stack.

Então use CTRL+G e ponha [ESP+C]

 

ac9f37678b8c1bd83dfb0ee8bdb30c80.png

 

9 - Legal, estamos em 0x0100C482.

 

 

Existe 3 melhores métodos para achar o endereço de retorno.

 

1º É o melhor método na minha opnião, no canto inferior direito do OllyDbg está a stack nela aparece o endereço de retorno da nossa função como podem ver na img RETURN to 0100C482 from 01017526.

Traduzindo Retornar para 0100C482 de 01017526 ->(nossa função).

 

2º Quando você quer ir direto para instrução retn (retorno) o OllyDbg tem uma função para fazer isso só apertar Ctrl+F9 e depois F8 para executar a instrução retn.

 

3º Quando o prólogo da função é

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

o endereço de retorno sempre vai estar em [EBP+4]

 

lembrando que o endereço de retorno sempre está em [esp] mais depois que ele executa a instrução push ebp o endereço de retorno passa a estar em [esp+4], as instruções push e pop modificam a stack.

 

Ex: push subtrai e pop adiciona.

 

Link para o comentário
Compartilhar em outros sites

Ótimo tópico, realmente muito bem explicado =)

 

Eu acho que aprendi...

Tipo, o Address e Offset são esses aqui?

 

Address: $1025658

Offset: $146

 

 

Ryo, dá fixo pro tópico não morrer =)

 

Depende, o Address base das bolas é o mesmo do da pontuação. Se o seu address da pontuação for $1025658 então tudo certo, pois o offset está correto para as bolas.

Link para o comentário
Compartilhar em outros sites

Não, aqui o address da pontuação é $1025040 mesmo

Mas a parada da bola funcionou com os 2 address...

 

Dei o BreakPoint e tal, daí na parte do [ESP+C] eu coloquei [ESP+8] porque tinha 2 POP, certo?

Aí eu não lembro pra que address foi, mas lá tinha o $1025658. Eu fiz algo errado?

Link para o comentário
Compartilhar em outros sites

Cara se tá funcionando não tem nada errado, rs

Daqui a pouco eu posto como mexer as bolas. Essa frase ficou meio gay

 

Agora como mexer nas bolas...

 

Pra achar o address das bolas eu pensei da seguinte forma:

 

- Se BALL=1 então o valor das bolas=3

- Se BALL=3 então o valor das bolas=0

 

E assim eu pesquisei.

 

- First scan por "3",

- Perde 1 bola,

- Next scan por "2",

- Achei!

 

Caso você precise é só seguir a lógica até filtrar e conseguir somente 1 address no CE.

 

1194228a94a56c4c0b12423daa91af4b.png

 

Agora vejo o opcode que altera esse valor.

 

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

 

e8ae64e8dc46eef2c88a897395d55ee0.png

 

Já sei que meu offset é 0x146, agora falta saber da onde vem ECX, pois ESI vem de ECX segundo o opcode no address 010175B5. Seto um breakpoint em 010175B7, e espero o olly parar nele.

 

3af1a6f3d2898721cf209b59b2d81de7.png

 

Quando o olly parar no breakpoint que você setou pressione CTRL+F9 pra ir até o "RETN 4", aí dê um F8 e então role a barra um pouco pra cima.

 

5798f975a8d387be2252c1c47af114b7.png

 

A função é chamada assim:

 

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

 

Então sabemos que é do tipo thiscall e o objeto alvo vem de ESI, temos que achar da onde ESI vem agora.

 

Dá um look aqui:

 

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

 

Exatamente o mesmo ponteiro que a pontuação, ou seja, bolas e pontuação são propriedade do mesmo objeto.

 

Agora você sabe que o address é 0x1025040 e o offset 0x146.

 

Vá programar.

Link para o comentário
Compartilhar em outros sites

Nessa parte

 

7 - Suba um pouquinho e veja a instrução logo acima de 0x0101757C.

 

 

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

 

Eu fiquei confuso, no Pinball foi excelente o resultado, deu certo, fui tentar em outro jogo (de site)

e não consegui devido a algumas coisas

 

O que eu fiz:

 

1- Attach no plugin-container.exe

2- ctrl+g 0x6e8fd63c (address do skill infinito pegado com Cheat Engine)

3- Dei F2 pra marcar um Breakpoint e F9 pra rodar

4- Subi um pouco encima pra pegar o offset e tem aqui:

 

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

 

Dai eu não intendi, eu subi mais ainda e tem até alguns parecido com o que achou no tutorial

mais assim:

 

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

 

Mais dai tem vários iguais, não sei qual é o offset, alguma ajuda?

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...

- Se você não gosta de gatinhos saia desta página agora.

kkkkk, pensei seriamente em sair dessa pagina =P

mas enfin, Parabéns Ryokusei, aprendo muito com seus tutorias aqui na wc.

win 7 não tem pinball D: vo ver se eu consigo baixar =P

Edit: ja tem o pinbal pra intalar no tuto*-* vlw ;]

 

minha maior dificuldade é entender esses codigos em assembly u.u

na facul tamo vendo uma cadeira que ver assembly, mas tamo vando ainda o assembly do processador Neander(assembly bem basico com poucos comandos)

eu ate sei um pouco de assembly msm, mas tem algumas coisas que não entendo =P

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...

ja que foi aberto por esse motivo ai vai *_* (desculpas pela demora, custei pra ver que tinha sido reaberto)

 

da onde vc tirou aquele ESP? pode esplicar? ^^

tinha outra duvida, mas nao lembro + =P

Obrigado.

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

×
×
  • 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.