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
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.
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
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
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
En haut à droite - Les registres.
Vous retrouvez les registres dont nous avons déjà parlé
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
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 (En patch 1.09B)
Bon il est temps d'utiliser ce logiciel pour notre premier trace c'est le sujet de notre premier exercice.
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
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.
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
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
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
En haut à droite - Les registres.
Vous retrouvez les registres dont nous avons déjà parlé
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
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 (En patch 1.09B)
Bon il est temps d'utiliser ce logiciel pour notre premier trace c'est le sujet de notre premier exercice.