Tracer les Dlls - Outils et Exercices

M

Myrdinn

Invité
Bonjour à tous.
Voici le quatrième post sur le traçage des Dlls, vous êtes assez nombreux à me le demander, et tant que ce sera le cas nous continuerons cette série.
Si vous avez manqué les premiers épisodes ou si vous souhaiter vous rafraîchir la mémoire voila les liens :
- LA structure du jeu
- Notion de base
- Calcul des dégats physiques

Je tiens à commencer par un remerciement comme d'habitude.
Le premier à Jarulf pour avoir partagé ses connaissances avec la communauté et qui m'a permis de faire un grand bon en avant sur les DLLS de DII.
Le deuxième à Paul Siramy pour des raisons différentes de d'habitude, pour m'avoir fait découvrir le logiciel que nous allons utiliser (C'est un Freeware sans lequel je ne pourrais pas partagé ce post avec vous, le logiciel que j'utilise d'habitude n'étant pas gratuit), pour m'avoir fait découvrir les trésors cachés de PhrozenKeep il y a quelques mois maintenant, également pour les compléments d'information qu'il donne sur OllyDBG et les remarques constructives. :biggthum:
Le troisième pour les programmeur de DiabloII qui ont laissé une tonne d'information dans les fichiers TXT et les Dlls, vous verrez (si on arrive jusque la) que c'est très utile et également pour la communauté de PhrozenKeep à laquelle je commence sérieusement à m'intéresser.

L'outils Indispensable OLLYDBG

1) Téléchargement
Rapidement vous devrez télécharger cet outils à cette adresse. Le logiciel est gratuit et complet, cependant il serait vraiment gentil d'envoyer un petit mail de remerciement à l'auteur qui continue de le développer (La version 9 est très récente).
Le logiciel est extrêmement propre, il suffit juste de le dézipper, aucune installation n'est nécessaire.

2) LE fonctionnement

A- Chargement de la D2Game.dll
Bon le plus simple est de le faire "en live" j'ai assez fait de théorie pendant 3 posts :D
Pour commencer il faut démarrer Diablo2 en mode fenêtré pour cela il faut rajouter -w (avec un espace avant) dans le raccourci.
Ensuite il faut démarrer Ollydbg (Si vous avez un message concernant une Dll plus récente ne vous inquiétez pas et répondez oui)

Pour commencer il est vide.
Maintenant démarrer une partie Diablo2 mais rester en ville.
Retourner sur Ollydbg et cliquer sur File/Attach
Vous verrez la liste de tous les process résidants sur votre machine (Un bon outils pour voir les trojan et les virus au passage)
Choisissez le Game.exe de Diabloii et cliquer sur attach.
Attach.gif


Bon maintenant avant d'expliquer le contenu des écran que vous avez une dernière manipulation.
Cliquer sur View/Executable Modules et choisissez D2Game.dll
Revenz sur la fenêtre principal qui devrait ressembler à ça
BreakpointAtteint.gif


Maintenant une explication des différents éléments de l'écran.


B- Les différents Ecrans

En Haut à gauche - Module Désassemblé
Si vous avez suivi mes instructions à la lettre vous avez actuellement la DLL D2Game.dll désassemblée.
La première colonne en grisée donne les Offsets, la deuxième colonne le code et la troisième les instructions. La quatrième des indications. Sur mon écran vous pouvez lire
ASCII "C:\Projects\Diablo2\Source\D2Game\GAME\Arena.cpp" comme type d'indication :D
Hum vous voyez ici que le jeu est programmé en partie en C++ et que la partie que l'on visionne concerne la fonctionnalité abandonnée ARENA. Blizzard a laissé énormément de message d'assertion pour notre plus grand bonheur.

Un menu pour cet écran est disponible avec le bouton droit. Il est très riche je n'irais pas dans les détails pour le moment, nous le verrons au fur et à mesure.
Bon aujourd'hui nous allons commencer par la routine de calcul des dégats physique, bref nous devons nous positionnez dessus.
pour cela Faite un clic droit et sélectionner Goto->Expression et tapez l'Offset du début de la routine.
Au passage vous verrez que les offsets diffèrent du troisième post, c'est parceque vous voyez la DLL chargée en mémoire. Elle se charge toujours en 6FC3000, bref il vous faut ajouter ce nombre à l'offset de mon POST vous Obtenez 6FCADC40 pour le patch 1.09B et 6FCAE140 pour le patch 1.09D
Tout les traces seront en PAtch 1.09B pour moi. JE vous donnerais systématiquement les offsets de la 1.09D, si vous voyez une différence, parfait on pourra en parler :D


En haut à droite - Les registres.
Vous retrouvez les registres dont nous avons déjà parlé
Registre.gif

Vous remarquerez egalement la liste des Flags registers. Bon pas de détails superflus ici, nous ne sommes pas la pour un cours théorique sur les CPUs.
Juste une petite remarque sur le registre EIP qui pointe sur l'instruction qui va être exécutée (Chez moi c'est une instruction de la NTDLL)

En bas à droite la Pile
En surbrillance le "haut" de la pile.
Encore une fois rien d'extraordinaire nous en reparlerons.
J'en profites simplement pour vous parler d'une fonctionnalité très intéressantes de Ollydbg. Si vous doubleCliquer sur les Offsets vous obtiendrez les Offsets relatif (Très utile quand je vous demande de regarder sur la pile en ESP+70 par exemple).
Dans l'exemple suivant j'ai doubleCliquer sur l'adresse du haut de la pile
Pile.gif

J'en ai profité au passage pour vous montrer que le jeu est en "pause Ollydbg" Paused en jaune quand vous vous y attacher et que vous ne pouvez par revenir à Diablo2 pour l'instant.

Les adresses relatives peuvent être obtenues également sur les autres fenêtres. C'est le cas de la mémoire et nous en aurons besoin pour visualiser les Unit dont nous avons parler dans le premier post.
A ce propos la première Unit que nous regarderons (Pas en détail désolé ce sera pour une autre fois) sera votre personnage.

En bas à gauche - La mémoire
Encore une fois pas de miracle et en plus les colonnes sont déjà nommées par OllyDbg. C'est la que nous verrons les Unit. On accède au menu par un bouton droit comme d'habitude.
Le plus utile sera également GotoExpression. A ce sujet vous pouvez également regarder la D2Game.dll puisqu'elle est chargée en mémoire en tapant 6FC30000 dans GotoExpression et la voir désassemblé en cliquant sur Disassemble.
Contrairement aux autres parties de la fenêtre ou les valeurs sont interprétées et donc remise dans l'"ordre" pour les humains ici les DWORDs doivent être lu de droite à gauche par Bytes et sont en HexaDécimal.
2 exemples
1) 01 00 00 00 doit se lire 00000001 soit 1 en décimal
2) 40 DC CA 6F doit se lire 6FCADC40 c'est l'offset de notre routine de calcul des dégats physiques :D (En patch 1.09B)



Bon il est temps d'utiliser ce logiciel pour notre premier trace c'est le sujet de notre premier exercice.
 
M

Myrdinn

Invité
1) BreakPoint

Maintenant avant de continuer il faut obliger le jeu à s'arrêter sur la fonction de calcul des Dégats Physique pour cela il faut mettre un Arrêt (BreakPoint)

Se placer sur le premier offset (PUSH ESP,1C en 6FCADC40 pour le 1.09B) et faire BoutonDroit BreakPoint/Toggle (ou F2)

La ligne devient Rouge
Il faut ouvrir une nouvelle Fenêtre en faisnt View/breakpoint à partir de la barre de menu.
La fenêtre présente les offsets ou le jeu s'arretera.
Il faut noter que l'on peut également mettre des breakpoint sur la mémoire.
Cela à de nombreuses application, quelques exemples :
- Mettre un breakpoint sur une adresse mémoire d'un des fichiers .bin. Exemple sur TreasureClassEX.bin sur la ligne du TC de Mephisto Hell :rolleyes:
- Mettre un breakpoint sur la vitesse de marche actuelle de votre Unit Joueur
- ...

C'est toujours le point d'entrée d'une recherche dans les Dlls

2) Tracer
Pour l'instant nous n'utiliserons qu'une seule fonction du menu Debug mais très vite nous en ferrons le tour.
Bref aujourd'hui vous ferez Debug/StepOver (ou la touche F8 au choix).

Commencons
D'abord retour au jeu :D
Faite Debug/run (ou F9)
Vous retournez sur le jeu

Allez tuez un monstre facile.
Au premier coup vous retournez sous OllyDbg pile sur le Breakpoint.
A partir de maintenant vous avancerez ligne à ligne en faisant F8 (StepOver) TStepOver car en cas de Call vers une autre fonction le jeu Executera la fonction en dehors du pas à pas (comme dans mon troisième post.)

Regarder les premiers mouvement sur la pile Cf le troisième post et arrêtez vous avant la cinquième ligne juste avant MOV ESI,ECX

A ce moment ESI contient encore l'adresse de l'attaquant.
Aller à cette adresse mémoire avec BoutonDroit GotoExpression dans la fenetre en bas à gauche et mettez les adresses en position relative.
Vous pouvez également utilisez l'astuce de Paul
j'ammène la souris sur la valeur du registre ESI, et là je fait clic droit / follow in dump, et la fenêtre du bas à gauche se positionne dessus automatiquement, sans avoir à taper de valeur (donc pas de risque d'erreur de saise).

Normallement le premier block doit contenir 00 00 00 00 C'est le code de l'unité (0=Joueur / 1=Monstre ....) Le deuxième Block contient la Classe (0=Ama ...)
Si ce 'est pas le joueur qui est ici mais le montre faite de nouveau F9 (Debug/run) et tachez de taper le premier, ou chercher un monstre plus facile pour vous :lol:.

UnitPlr.gif


Pour moi vous voyez sur la première ligne
00 00 00 00 Unit=Player suivi de
04 00 00 00 UnitType=Barbare
01 00 00 00 Unid= Identifiant unique 1 parceque je suis le premier joueur de la partie
07 00 00 00 UnitMODE=7 ?Si je regarde PlrMOD.TXT 7=Attack1
...
Bon je ne ferais pas toute la liste maintenant on aura l'occasion d'en reparler.

Je vais revenir sur ces 4 premiers Dwords des unités car ils sont commun à toute les unités. si vous le souhaitez vous pourrez regarder un monstre :D

Premier DWORD Unit TYPE 0=Player 1=Monster 2=Objects 3=Missile 4=Item 5=Tiles

Deuxième DWORD ClassID visible dans PlayerStat.txt, Monstats.txt Objects.txt Missiles.txt ou (Weapons.txt,Armors.txtx et Misc.txt) pour le type 4. Pour les monstres c'est leur PopulatedID dans MonStats.txt

Troisième DWORD UniqueID. Compteur incrémenté de 1 à chaque nouvelle unité. Identifiant unique de l'objet (Rien à voir avec les ID antiduppe)

Quatrième DWORD MODE Visible dans PlrMod.txt MonMod.txt ObjMOD.TXT ...


Bon c'est tout pour aujourd'hui
Entrainez vous à vous arretez sur votre objet personnage ou monstre.
Vous pouvez également tracer la suite tout seul et préparer des questions. :D


LA suite dès que vous etes pret.
Pour sortir il suffit d'arrêter le breakpoint dans la fenêtre Breakpoint (Boutondroit Remove ou disable au choix :) )
Ensuite retourner sur le jeu avec F9 (Debug/run)
Faites Echap/quitter sous diabloII
Ensuite arrêter Ollydbg. Eviter d'arreter ollyDBG en cours de debug vous pourriez endommager les executables et risquer une reinstallation


Suites Prévues
La suite 1 - Complément du post 3
La suite 2 - Suite de la routine de Combat
La suite 3 - Nous verrons bien d'ici la.
 
A

Ammaliah

Invité
Il a l'air d'enfer cet outil!!!!

Je sens que je vais m'éclater


Merci Myrdinn
 
M

Myrdinn

Invité
Et tant que vous participerez ce n'est qu'un début :D
Bon je vous laisse une journée ou deux pour digérer et après on attaque la suite :rolleyes:
 
D

Dreddy

Invité
bon, je manque un peu de temps en ce moment, mais je potasserai ça... merci pour ta disponibilité ;)

a+
Dreddy
 
H

hohorga

Invité
Tiens ça me changera du débugger de borland :o M'enfin si je me remet à programmer chez moi.

Merci pour le débuger et les infos de traçage de didi.
 
L

Lord_Age

Invité
Je n'ai pas lu mais voyant la densité des pages et leur nombre je pense que ca été un travail long...
:gratz:
 
C

cestbienmoi

Invité
Oui et moi, je peux m'amuser que le week end :bluecry: :bluecry:
 
J

Joel

Invité
Myrdynn : une traduc du giga post Jarulf/Hammerman/SG/moi sur les differentes structures du jeu ca te dit ?
 
P

Paul Siramy

Invité
Quelques petites réflexions d'ordre mineurs, pour avoir suivi ta procédure vraiment pas-à-pas :
1) 01 00 00 00 doit se lire 00 00 00 01 soit 1 en décimal
2) 40 DC CA 6F doit se lire 6F CA DC 40
J'aurais trouvé plus approprié d'écrire les dwords sans espaces :
1) 01 00 00 00 doit se lire 00000001 soit 1 en décimal
2) 40 DC CA 6F doit se lire 6FCADC40
En ce qui me concerne, c'est ma façon perso de distinguer 1 dword écrit en 4 bytes (avec un espace entre chaque) ou en tant que tel (le dword écrit de façon normale). Sinon on est un peu perdu je trouve.

Se placer sur le premier offset et faire BoutonDroit BreakPoint/Toggle (ou F2)
Je pense que re-préciser l'adresse ne serait pas superflu, j'ai un peu hésité, avant de mettre la ligne 6FCAE140 en rouge : "le 1er offset ? gné ?"
Maintenant replacez-vous dans la fenêtre en haut à gauche, cliquez sur la ligne ayant l'adresse 6FCADC40 (si 1.09 B, sinon 6FCAE140 pour 1.09D), et faites BoutonDroit BreakPoint/Toggle (ou F2)

La ligne devient Rouge
Il faut ouvrir une nouvelle Fenêtre en faisant View/breakpoint.
J'avais bêtement fait click droit / view et là pas de breakpoints... jusqu'a ce que je pense au MENU view :D

Ma proposition :
La ligne devient Rouge
Il faut ouvrir une nouvelle Fenêtre en faisnt View/breakpoint à partir de la barre de menu.

vous avancerez ligne à ligne en faisant F8 (Traceover) Traceover ...
Gros problème : F8 n'est pas Trace Over mais Step Over. Et c'est pas du tout la même chose.


A ce moment ESI contient encore l'adresse de l'attaquant.
Aller à cette adresse mémoire avec BoutonDroit GotoExpression dans la fenetre en bas à gauche et mettez les adresses en position relative.
Mmm, un petit truc que je trouve hyper pratique alors : j'ammène la sourie sur la valeur du registre ESI, et là je fait clic droit / follow in dump, et la fenêtre du bas à gauche se positionne dessus automatiquement, sans avoir à taper de valeur (donc pas de risque d'erreur de saise).

A part ça, quand tu as commencé de décrire les dword de l'Unit ... la lumière à jailli d'un coup et j'ai fait le rapprochement avec le super post dans Phrozen Keep sur la description de ces Units justement. Je me demandais comment on faisait pour surveiller ces valeurs. Merci à ton tutorial, il m'a appris quelques trucs, étant loin de la maitrise de ce logiciel, ça d'une part, la fenêtre view / beakpoint dont je ne m'étais jamais servi, et d'autres petites choses encore.

Autre chose : je sais bien que tu n'en as pas encore parlé, et c'est sans doute pas le moment, mais moi dans Ollydbg / Options / Debuggin Options, je rêgle dans la partie Analysis1 la "procedure recognition" sur Fuzzy, et c'est essentiel pour que Ollydbg décode certains switch comme il faut (qui fonctionne comme une table de décision). Je disais ça juste au cas où.

Tu dit d'envoyer un Merci au programmeur de ce débuggueur, ce serait pas plutot des sous qu'il lui ferait + plaisir ? Je ne me rappelle plus comment est son site, et je ne dis PAS aux membres de JudgeHype de payer, mais je mentionne que si on se sert souvent de ce débugueur, ce serait une encore meilleure façon de le remercier.

Dernière chose : le screenshot est un peu grand, alors que je suis en 1024*768. Je n'ose imaginer ceux ayant internet en 800*600. Tu l'a fait exprès ou c'est juste un oubli ? il est vrai que de toute façon à Ollydbg plus on a de place, mieux c'est, surtout pour le code désassemblé.

Bon boulot en tout cas :clap: Je faisais juste mes habituelles propositions d'améliorations :razz:
 
M

Myrdinn

Invité
Ok Paul je commenterais ta réponse dès que j'en aurais le temps.

@Paul et Joel

Hum je connais l'excellent post d'Hammerman, je m'en suis servi pour compléter mes propres notes. Je connais d'ailleurs quelques valeurs qui ne sont pas mentionnées. J'ai également une cartographie très précises de d2game.dll et des fonctions exportées de la D2Common.dll. Je travaille dessus en ce moment pour "traduire les offsets" pour la vesion 1.09D.

Je ne pense pas que ces documents existent sur PhrozenKeep, c'est avec plaisir que je les partagerais avec vous s'il n'existe pas déjà ;)
 
L

Lord_Age

Invité
Juste une question qui pourrait parraitre bête mais:
A quoi sert de tracer les DLL ???:confused:
 
L

Lord_Age

Invité
Donc si j'ai bien compris ca sert a transformer le jeu a sa facon non ??
 
R

reep

Invité
C est marrant quand on cherche ollydbg sur google on tombe direct sur des sites de Cracking :lol:
Arrete tout de suite Myrdinn on t'a repéré :D
 
M

Myrdinn

Invité
Provient du message de Paul Siramy
Quelques petites réflexions d'ordre mineurs, pour avoir suivi ta procédure vraiment pas-à-pas :

J'aurais trouvé plus approprié d'écrire les dwords sans espaces :
...Sinon on est un peu perdu je trouve.

Très bonne idée :D J'edite en conséquence



Je pense que re-préciser l'adresse ne serait pas superflu, j'ai un peu hésité, avant de mettre la ligne 6FCAE140 en rouge : "le 1er offset ? gné ?"

J'avais bêtement fait click droit / view et là pas de breakpoints... jusqu'a ce que je pense au MENU view :D

Ok Encore entièrement d'accord avec toi.


Gros problème : F8 n'est pas Trace Over mais Step Over. Et c'est pas du tout la même chose.
Oups je devais être fatigué, effectivement c'est Step Over pour pas à pas, je ne voulais pas parler de la fenetre Trace pour l'instant j'ai anticipé bêtement. Idem EDIT

Bon c'est la que j'ai des commentaires à faire :D

Mmm, un petit truc que je trouve hyper pratique alors : j'ammène la sourie sur la valeur du registre ESI, et là je fait clic droit / follow in dump, et la fenêtre du bas à gauche se positionne dessus automatiquement, sans avoir à taper de valeur (donc pas de risque d'erreur de saise).
Je ne connaissait même pas cette astuce, comme quoi j'ai vraiment bien fait de faire un post :D

A part ça, quand tu as commencé de décrire les dword de l'Unit ... la lumière à jailli d'un coup et j'ai fait le rapprochement avec le super post dans Phrozen Keep sur la description de ces Units justement. Je me demandais comment on faisait pour surveiller ces valeurs. Merci à ton tutorial, il m'a appris quelques trucs, étant loin de la maitrise de ce logiciel, ça d'une part, la fenêtre view / beakpoint dont je ne m'étais jamais servi, et d'autres petites choses encore.
PArfait, je mettrais ce post en lien assez tot, ou encore mon fichier Excel sur les différentes structure (je parle de structure que le post de phrozenKeep n'a pas abordé je crois comme la structure de la création des objets par exemple, mais je viens déjà de vous en parler dans ma précédente réponse ). Pour l'instant je ne voulais pas embrouillez les lecteurs avec trop de détails c'est déjà assez lourd à digérer. Je livrerais tout mes fichiers de travail dans un cinquième post je pense ou bientôt sur PhrozneKeep si ca a un interet la bas.

Autre chose : je sais bien que tu n'en as pas encore parlé, et c'est sans doute pas le moment, mais moi dans Ollydbg / Options / Debuggin Options, je rêgle dans la partie Analysis1 la "procedure recognition" sur Fuzzy, et c'est essentiel pour que Ollydbg décode certains switch comme il faut (qui fonctionne comme une table de décision). Je disais ça juste au cas où.

Comme tu le sais OllyDbg n'est pas le logiciel que j'utilise d'habitude, personnellement j'ai un vieux programme qui s'appelle WorkShopDll particulièrement pratique pour le PEHeader et d'autres fonction (Extractiopn des tables,images,fenêtre de dialogue ... des Dlls)
Bref je suis loin dêtre un expert de OllyDBG. J'ai encore de nombreuses choses à apprendre, je vais être obligé de te remercier pour une troisième raison :lol:

Tu dit d'envoyer un Merci au programmeur de ce débuggueur, ce serait pas plutot des sous qu'il lui ferait + plaisir ? Je ne me rappelle plus comment est son site, et je ne dis PAS aux membres de JudgeHype de payer, mais je mentionne que si on se sert souvent de ce débugueur, ce serait une encore meilleure façon de le remercier./quote]
Oui c'est lui qui demande au moins un remerciement. Effectivement des sous c'est encore mieux mais je me vois mal exiger ca de vous :lol:


Dernière chose : le screenshot est un peu grand, alors que je suis en 1024*768. Je n'ose imaginer ceux ayant internet en 800*600. Tu l'a fait exprès ou c'est juste un oubli ? il est vrai que de toute façon à Ollydbg plus on a de place, mieux c'est, surtout pour le code désassemblé.

Bon boulot en tout cas :clap: Je faisais juste mes habituelles propositions d'améliorations :razz:
Oui Mea Culpa j'ai pas réfléchi avant de faire mes screenshot et je ne peux pas faire de FTP au boulot. j'arrangerais ca aux plus vite pour eviter une lecture fastidieuse du post.

MErci à toi pour ces commentaires constructifs, je vais editer un nouveau remerciement ;)
 
M

Myrdinn

Invité
Provient du message de Lord_Age
Donc si j'ai bien compris ca sert a transformer le jeu a sa facon non ??
Oui pour du modding ou pour en comprendre le mecanisme :D

Provient du message de reep
C est marrant quand on cherche ollydbg sur google on tombe direct sur des sites de Cracking :lol:
Arrete tout de suite Myrdinn on t'a repéré :D

Hum il faut voir avec Paul c'est lui qui m'a fait connaître ce Soft :lol:

Sinon le modding c'est du Hacking. La "traduction" Française et la connotation dans ce forum n'ont rien de général. Hack n'est pas synonyme de salo#^$µrie, tout dépend de ce que tu en fait ;)
 
P

Paul Siramy

Invité
C est marrant quand on cherche ollydbg sur google on tombe direct sur des sites de Cracking

Hum il faut voir avec Paul c'est lui qui m'a fait connaître ce Soft
Un scalpel dans les mains d'un chirurgien sauve des vies. Le même dans les mains d'un tueur... L'outil est indépendant de l'utilisation que l'on en fait, et Ollydbg n'a pas été fait à la base pour le Hacking (en tout cas ça m'étonnerait fort :D )
 
Haut