Voici mon deuxième tutorial, qui est un exemple plus concret de la création d'un cheat, la partie Debug y est beaucoup plus apronfondie ;).
Source / Exemple :
Creation du trainer pour PinBall (flipper de windows)
=====================================================
Dans cet exemple je vais montrer comment créer un gamehack à partir
d'un programme inconnu ( car dans mon précédent essai j'ai pris un jeu dont je connaissais le code)
Outils & compétence nécessaires:
1) TSearch (http://fly.to/mtc)
2) Un Désasembleur (Olydbg ou WinDasm)
2) Une connaissance en Assembleur (peut être très basique)
1)T-Search
----------
A. Lancer T-Search (ça devrait aller pour le moment)
B. Lancer PinBall.
C. Jouer un petit peu afin d'obtnir un score (peu importe du moment qu'il dépasse les 10 000) et on met pause (F3)
D. Selectionner le processus dans T-Search (Pinball bien sur)
E. Click sur la loupe dans le mémory searcher
F. Cherché pour les values qui sont égales à votre score, comme les score dépassent les millions
on cherche dans une valeur codée sur 4 bits (ulong,uint,...)
G. Tsearch va retourné 2 address's, AF2CCC et C6AEBA (ces address sont sans doute différentes
chez vous car elles sont alloué dynamiquement (DMA = Dynamic Memory Allocation)
Vous avez donc 2 valeurs, mhhh la quelle est la bonne ?
On va donc continuer à jouer juste le temps de changer le score et on va remettre pause.
Là on va clické sur la loupe avec le _ à droite afin de rafiné notre selection.
On va donc cherché des valeurs qui sont égale à notre nouveau score.
Ha zut, les 2 address sont encore là,...
On peut refaire l'opération plusieurs fois vous obtienderais toujours ces 2 même address.
On va donc les selectionnées toutes les deux ( le + en vert) et les mettre dans la cheat list.
On modifie la Value de notre première address et on retourne dans le jeu et.... Non le score à pas changé :(
On modifie la seconde address et on retourne au jeu, à première vue ça ne change pas non plus mais lorsque que l'on gange quelques points surplémentaire Bam on obtien la valeur que l'on a attribué + les points gagnés.
L'affichage du score est donc actualisé à chaque fois que l'on gagne des points suplémentaires.
On connait donc notre address contenant notre score, voilà on se met 100 000 000 de points et on est premier :D.
(pour info la première address contient la screenValue c-a-d la valeur à afficher.)
H. certains seront satisfait, ils ont leur meilleur score, mais c'est pas fini !
En effet, à cause de la DMA (Dynamic Memory Allocation) les address vont changée à chaque chargement du process :(.
Certains vont me dire, bah c'est fichu les trainers pour ce jeu...
Hé bien non !, car en effet il y a un moyen de contourner la DMA, c'est le code qui lui est static (car aussi non les jumps ne pointerais pas vers les bonnes address et ce serait la ***)
I. Voilà le grand avantage de T-Search, c'est son AutoHAck Tool !
Mettez le jeu en pause et ouvrez l'autohack windows (par le menu Auto-HAck)
Ensuite activé l'auto hack (par le même menu)
Faites un click droit sur la variable contenant notre score et clickez sur AutoHack (tout en bas)
Maintenant continuez à jouer et augmenter votre score,...
Poum, un ligne apparait dans la fenêtre de AutoHack :
102038B: add[eax],esi (ajouter à notre score (qui est pointé par eax) le contenu de esi)
Nous avons là notre code et son address qui va mettre à jour notre score !!
J. Ouvrez votre Debuger, et Dasm Pinball.
Aller à la ligne 102038B.
vous trouverez :
:0102038B 0130 add dword ptr [eax], esi //Ajout du score
:0102038D 8B10 mov edx, dword ptr [eax] //Mettre le contenue du score dans EDX.
:0102038F 81FA00CA9A3B cmp edx, 3B9ACA00 // LE comparer à 100 000 000
:01020395 0F8E4D5BFFFF jle 01015EE8 // SI >= alors sauter vers 01015EE8
Voilà le code n'est pas très dure à comprendre, les deux dernières lignes ne nous intéresse pas.
K. Le Patch
Nous savons maintenant que eax pointe vers notre variable (qui même si elle change de place, sera toujorus pointé par eax)
Il y a plusieurs game Patch possible mais contrairement à mon autre code, il ne suffit pas de NOPer tout ça car aussi non nous n'aurons jamais de points :p
Voici mon Patch :
Add esi,0007A120 //On ajoute 500 000 à Esi
add dword ptr [eax], esi //Ajout du score
Mon patch est très simple, on rajoute 500 000 à chaque fois que l'on gagne des points,...
Mais un grave problème arrive,... Où allons nous caser notre instruction Suplémentaire ?
Car en effet, il n'y a pas de place :(
Nous allons devoir alors 'Dévier notre code' avec un jump vers la fin du fichier qui contient plein de 00 (espace libre)
Nous avons de la chance, il y en a plein :)
Prenons donc une address au hazard : 01020385.
Nous allons donc remplacer :
:0102038B 0130 add dword ptr [eax], esi //Ajout du score
par:
:01015ED5 E9ABA40000 jmp 01020385 // Saut vers nos 0.
Là encore nous avons quelques problèmes, car notre Jmp est codé sur 5Bytes alors que notre Add est sur 2Bytes.
Nous allons donc devoir Ecraser les données qui suivent:
:0102038D 8B10 mov edx, dword ptr [eax] //Mettre le contenue du score dans EDX.
:0102038F 81FA00CA9A3B cmp edx, 3B9ACA00 // LE comparer à 100 000 000
:01020395 0F8E4D5BFFFF jle 01015EE8 // SI >= alors sauter vers 01015EE8
on met donc notre jmp puis on remplit de NOP les espaces restant (le mov et le add = 4Bytes puis on prend 1Byte de cmp mais alors il est modifier donc on met encore 5 Nop pour l'effacer entièrement)
Dans mon patch, j'avoue je n'ai pas été très ne finesse et j'ai aussi virer le jle,...
Le Patch donne donc:
:01015ED1 90 nop
:01015ED2 90 nop
:01015ED3 90 nop
:01015ED4 90 nop
:01015ED5 E9ABA40000 jmp 01020385
:01015EDA 90 nop
:01015EDB 90 nop
:01015EDC 90 nop
Maintenant que la déviation est terminée, il va faloir patch les Zeros apr le code désiré:
:01020385 81C620A10700 add esi, 0007A120 //On ajoute les 500 000 points
:0102038B 0130 add dword ptr [eax], esi //On les ajoutes au score
:0102038D 8B10 mov edx, dword ptr [eax] // On met le score dans edx
:0102038F 81FA00CA9A3B cmp edx, 3B9ACA00 // On le compare à 100 000000
:01020395 0F8E4D5BFFFF jle 01015EE8 // On saute à 01015EE8 si >=
:0102039B E93D5BFFFF jmp 01015EDD // aussi non on retourne à l'opération suivant notre premier Patch.
nous avons donc fait ça :
code.code.code.code.code.code
code.code.code.code.code.code
code.code.code.code.code.code
code.code.code.code.code.code
code.code.code.code.code.code
code.code.code.code.code.code
PATCH.PATCH.PATCH.PATCH.PATCH >-|
|-> code.code.code.code.code.code |
| code.code.code.code.code.code |
| code.code.code.code.code.code |
| 00000000000000000000000000000 |
| 00000000000000000000000000000 |
| PATCH.PATCH.PATCH.PATCH.PATCH <-|
|-< PATCH.00000000000000000000000
00000000000000000000000000000
Il est conseillé de tester ça avec le debuger avant de créer un trainer car on sait jamais qu'il y ai une erreur ;)
Maintenant notre Patch mis au point, il ne suffit plus qu'a le coder, prenons exemple sur mon Tutorial précédent (http://www.cppfrance.com/code.aspx?ID=24006)
Voir la source et l'exe pour un teste ;)
Voilà c'est fini, j'ai p-e été un peu rapide mais l'essentiel est là ;).
Krust
Conclusion :
Voilà donc la suite de mon tutorial, qui est un exemple concret de la création d'un cheat.
UPDATE :
Windows a mis à jour son Pinball (qui l'eu cru).
Rien de nouveau appart un légé décallage du code qui rendait l'ancien patch obsolète.
Voici les nouveaux patchs (Ce ne sont que les addrs qui ont changées)
BYTE PATCH1[] = "\x90\x90\x90\x90" //Nop Nop Nop
"\xE9\xAA\xAD\x00\x00" //Jmp 0102232F
"\x90\x90\x90"; //Nop Nop Nop
BYTE PATCH2[] = "\x81\xC6\x20\xA1\x07\x00" //add esi, 0007A120
"\x01\x30" //add dword ptr [eax], esi
"\x8B\x10" //mov edx, dword ptr [eax]
"\x81\xFA\x00\xCA\x9A\x3B" //cmp edx, 3B9ACA00
"\x0F\x8E\x4E\x52\xFF\xFF" //jle 01015EE8
"\xE9\x3E\x52\xFF\xFF"; //jmp 01015EDD
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.