M
Myrdinn
Invité
Voila un nouveau post sur le tracage de DLL.
C'est une démonstration du produit avant de passer à des exercices dans outils et exercices.
Ce post à trois buts
1) Démonstration de l'utilisation de OllyDBG
2) Quelques notions sur la méthodologie pour tracer les Dlls
3) Pour les allergiques à l'assembleur il reste les passages en couleur pour faire plus ample connaissance avec nos amies valkyries. Dans ce cas je vous invites à passer toutes les parties écrites en blanc Ce pourrait être utile pour déterminer le niveau idéale pour les valkyries par exemple.
Pour faire plaisir à Simon33 j'utiliserais la nomenclature 0x000... pour les chifres hexadécimaux hors du code.
J'ai fait un trace unique sur le code hier soir après avoir joué avec trombe. Je vous donne le résultat directement sans remaniement et donc avec des trous que l'on comblera ensemble plus tard.
J'ai choisis cet exemple car vous pouvez le faire sans tuer votre mercenaire (ce qu'il vaut mieux faire quant on trace un combat ) et surtout vous pouvez le faire sans sortir de la ville.
Pour faire ce trace vous devez utiliser la méthode décrit dans le quatrième post de Tracer les Dlls .
Placer le brekpoint sur 6FCD6790 et invoquer votre valkyrie en ville.
Vous vous arreterez automatiquement sur ce qui suit
La routine qui gèrela valkyrie débute en 6FCD6790 pour le patch 1.09B. Si vous voulez les offsets pour le patch 1.09D je les chercherais pour vous.
EBP=SLVL
EBX=GamePTr
EBP=EDX=PlrUnit
EBX=ECX=GamePtr
ESI=0x138 (312)???
EDI=PlrUnit
Bon comme d'habitude pour ceux qui ont suivi les posts tracer les Dlls.
On sauvegarde et initialise les différents registres.
A noter que je ne sais pas encore à quoi correspond le 312 contenu par ESI ?
Si c'est important on le saura assez vite.
Si vous voulez jouer avec les unités c'est le moment avant de continuer.
EBX=GamePtr. Si vous faite boutondroit/Follow in Dump vous verrez l'unité GAME.
Je devrais éditer mon post sur la structure du jeu, en attendant une petite explication.
Au démarrage d'une partie le jeu créé une structure qui contient les liens vers toutes les autres unités du jeu et également les valeurs spécifiques à la partie.
A partir de cette unité il est possible de trouver tous ce qui concerne la partie en cours
Exemple
Il contient la liste de tous les pointeurs des joueurs,monstres objets ....
Il contient également le type de jeu D2C ou LOD, L'heure actuelle en Frame, la Master Seed qui permet de générer les Seeds de toutes les unités créées, la difficulté ...
Dans le quatrième post je donne le lien vers la structure connue de cette unité. La première page excel vous permet de voir les différentes valeurs. Attention il y a un décalage de 0x20 ente la version 1.09B et la version 1.09D
Jetez un oeil et demandez moi si vous avez besoin d'aide.
Vous pouvez également regarder votre unité joueur c'est la deuxième page de fichier excel (es pages suivantes contiennent les structures filles de cette unité (inventaire, skills,stats ....) )
Toujours pareil clickdroit sur EBP / Follow in Dump et la méthode décrit dans le quatrième post.
Encore une fois n'hésitez pas à me demander des renseignement sur cette structure.
Avant de continuer une petite astuce d'ollydbg.
EBP contient le SLVL de la valkyrie.
Juste avant le PUSH vous pouvez faire un bouton droit sur EBP et faire Modify et entrez la valeur que vous voulez. De cette façon vous pouvez vous faire une Valkyrie niveau 90 sans modifier votre perso.
Maintenant que la creation de la valkyrie à commencer, il faut modifier ce flag.
FLAG PlrUnit(+E8)=OOOOOOOE = initialize pointer
ECX=4E si ECX=0xE
Bon encore une fois l'occasion de regarder votre unité Joueur. En +E8 vous avez des Flags, normalement vous devriez avoir 0x0E, qui correspond à un Flag Creation.
On modifie cette valeur en ajoutant 0x40 on obtient 0x4E.
EDI = pointeur = Pile+14 on va voir a quoi ca sert très vite
On modifie l'unité joueur en fixant le Flag en +E8 avec la valeur 4E(c'est un reste de l'étape précedente
LE REP STOS Créé 8 lignes(défini par ECX) à partir de EDI (Ex ESP+14)
On vient de créer un nouvel espace pour accueillir une structure de 8 valeurs (DWORDs)
C'est probablement une structure transitoire car elle est créé sur la pile.
Initalisation de 2 registres pour la suite
EDX=Nouvelle Structure (Ptr (ESP+14)) que l'on vient de créer
ECX=EBX=GamePTR
Creation de la Structure EDX avec les valeurs suivantes
EDX-04 = EBP = PlayerPtr
EDX+04 = EBP = PlayerPtr
EDX+08 = 0x165
EDX+0C = 0x7
EDX+10 = 0x1
EDX+1C = 0x2
Bon pour l'instant ces chiffres ne sont pas parlant nous verrons bien pour la suite.
Le Call appelle la routine de création d'un monstre.
C'est à cela que servait la structure transitoire.
Sans faire aucun trace, voici ce que l'on peut deviner rapidement.
En +08
0x165 (357 en décimal)=ID de la valkyrie dans Monstats.txt
Si vous chercher la ligne valkyrie dans ce fichier sous excel (ligne 359) la colonne F correspond bien au populatedID=357
Et le 1 2 et 7?
Difficle de répondre pour le moment. Le 7 signifie probablement = Minion
Le 1 le nombre de valkyrie ...
Soit dit en passant avec ollyDBG vous pouvez modifier ces valeurs avant qu'elles ne soit utilisées en cliquantDroit / Modify.
Mais bon vous risquez probablement un crash
Regradons ce qui se passe
EAX=Valkyrie Ptr
ESI = ValkyriePtr
On fait un test rapide suir l'existence du pointeur
Pas de valkyrie = EXIT Else continue
Cool une nouvelle unité est prête. L'unité Valkyrie.
Un petit dump de ce que j'ai obtenu
J'ai mis les adresses en position relatives.
Toujours pareil si vous utilisez mon fichiers excel vous trouverez
+00 UnitType Ici (01 00 00 00) soit 0x1 (on lit les bytes de droite à gauche)LEs valkyries sont des unités Monstres.
+04 UnitClass ici 0x165 on vient de le voir c'est le populated ID de monstats.txt.
+08 Unit UnisueID 0xF C'est l'ID unique séquentiel utilisé par le jeu pour identifier les unité de même type dans la partie. Bref ici c'est le 15eme monstres de la partie créé.
Bizarre on n'est même pas sortie en ville ????
Je suis prêt à parier que nos amis les NPCs, les poules et autres animaux sont aux nombres de 14. (Pas sur pour les NPCs d'ailleurs)
+0C MODE=0x1 Il faut consulter le fichier MonMode.txt je le fait pour vous ligne1=Neutral(NU) Bref la valkyrie est dans le mode Neutre pour le moment.
+2c/+30/+34 on peut voir la Seed (pour l'aléatoire)
+38 On trouve le pointeur sur la structure Hpath qui gère la position sur la carte/les déplacements/ les cibles ...
+58 Vitesse d'animation= 0x100 soit 256 c'est cette valeur qui est utilisé par les formules d'IAS pour gérer la vitesse d'attaque. Mais également par le FastCast,FastBlock ...
... vous regarderez mon fichier excel si vous voulez en apprendre plus.
Bon maintenant que la valkyrie est créée il va falloir la compléter
C'est la suite qui devient plus intéressante
C'est une démonstration du produit avant de passer à des exercices dans outils et exercices.
Ce post à trois buts
1) Démonstration de l'utilisation de OllyDBG
2) Quelques notions sur la méthodologie pour tracer les Dlls
3) Pour les allergiques à l'assembleur il reste les passages en couleur pour faire plus ample connaissance avec nos amies valkyries. Dans ce cas je vous invites à passer toutes les parties écrites en blanc Ce pourrait être utile pour déterminer le niveau idéale pour les valkyries par exemple.
Pour faire plaisir à Simon33 j'utiliserais la nomenclature 0x000... pour les chifres hexadécimaux hors du code.
J'ai fait un trace unique sur le code hier soir après avoir joué avec trombe. Je vous donne le résultat directement sans remaniement et donc avec des trous que l'on comblera ensemble plus tard.
J'ai choisis cet exemple car vous pouvez le faire sans tuer votre mercenaire (ce qu'il vaut mieux faire quant on trace un combat ) et surtout vous pouvez le faire sans sortir de la ville.
Pour faire ce trace vous devez utiliser la méthode décrit dans le quatrième post de Tracer les Dlls .
Placer le brekpoint sur 6FCD6790 et invoquer votre valkyrie en ville.
Vous vous arreterez automatiquement sur ce qui suit
La routine qui gèrela valkyrie débute en 6FCD6790 pour le patch 1.09B. Si vous voulez les offsets pour le patch 1.09D je les chercherais pour vous.
Code:
Initalisation/sauvegarde des registres
6FCD6790 83EC 24 SUB ESP,24
6FCD6793 53 PUSH EBX
6FCD6794 55 PUSH EBP
6FCD6795 8BEA MOV EBP,EDX
6FCD6797 8BD9 MOV EBX,ECX
6FCD6797 8BD9 MOV EBX,ECX
6FCD6799 56 PUSH ESI
6FCD679A 57 PUSH EDI
EBP=SLVL
EBX=GamePTr
EBP=EDX=PlrUnit
EBX=ECX=GamePtr
ESI=0x138 (312)???
EDI=PlrUnit
Bon comme d'habitude pour ceux qui ont suivi les posts tracer les Dlls.
On sauvegarde et initialise les différents registres.
A noter que je ne sais pas encore à quoi correspond le 312 contenu par ESI ?
Si c'est important on le saura assez vite.
Si vous voulez jouer avec les unités c'est le moment avant de continuer.
EBX=GamePtr. Si vous faite boutondroit/Follow in Dump vous verrez l'unité GAME.
Je devrais éditer mon post sur la structure du jeu, en attendant une petite explication.
Au démarrage d'une partie le jeu créé une structure qui contient les liens vers toutes les autres unités du jeu et également les valeurs spécifiques à la partie.
A partir de cette unité il est possible de trouver tous ce qui concerne la partie en cours
Exemple
Il contient la liste de tous les pointeurs des joueurs,monstres objets ....
Il contient également le type de jeu D2C ou LOD, L'heure actuelle en Frame, la Master Seed qui permet de générer les Seeds de toutes les unités créées, la difficulté ...
Dans le quatrième post je donne le lien vers la structure connue de cette unité. La première page excel vous permet de voir les différentes valeurs. Attention il y a un décalage de 0x20 ente la version 1.09B et la version 1.09D
Jetez un oeil et demandez moi si vous avez besoin d'aide.
Vous pouvez également regarder votre unité joueur c'est la deuxième page de fichier excel (es pages suivantes contiennent les structures filles de cette unité (inventaire, skills,stats ....) )
Toujours pareil clickdroit sur EBP / Follow in Dump et la méthode décrit dans le quatrième post.
Encore une fois n'hésitez pas à me demander des renseignement sur cette structure.
Avant de continuer une petite astuce d'ollydbg.
EBP contient le SLVL de la valkyrie.
Juste avant le PUSH vous pouvez faire un bouton droit sur EBP et faire Modify et entrez la valeur que vous voulez. De cette façon vous pouvez vous faire une Valkyrie niveau 90 sans modifier votre perso.
Code:
Modification du Flag Création d'unité de l'unité joueur
6FCD679B 8B8D E8000000 MOV ECX,DWORD PTR SS:[EBP+E8]
6FCD67A1 33C0 XOR EAX,EAX
6FCD67A3 83C9 40 OR ECX,40
Maintenant que la creation de la valkyrie à commencer, il faut modifier ce flag.
FLAG PlrUnit(+E8)=OOOOOOOE = initialize pointer
ECX=4E si ECX=0xE
Bon encore une fois l'occasion de regarder votre unité Joueur. En +E8 vous avez des Flags, normalement vous devriez avoir 0x0E, qui correspond à un Flag Creation.
On modifie cette valeur en ajoutant 0x40 on obtient 0x4E.
Code:
Creation de structure
6FCD67A6 8D7C24 14 LEA EDI,DWORD PTR SS:[ESP+14]
6FCD67AA 898D E8000000 MOV DWORD PTR SS:[EBP+E8],ECX
6FCD67B0 B9 08000000 MOV ECX,8
6FCD67B5 F3:AB REP STOS DWORD PTR ES:[EDI]
On modifie l'unité joueur en fixant le Flag en +E8 avec la valeur 4E(c'est un reste de l'étape précedente
LE REP STOS Créé 8 lignes(défini par ECX) à partir de EDI (Ex ESP+14)
On vient de créer un nouvel espace pour accueillir une structure de 8 valeurs (DWORDs)
C'est probablement une structure transitoire car elle est créé sur la pile.
Code:
6FCD67B7 8D5424 14 LEA EDX,DWORD PTR SS:[ESP+14]
6FCD67BB 8BCB MOV ECX,EBX
6FCD67BD 896C24 10 MOV DWORD PTR SS:[ESP+10],EBP
6FCD67C1 896C24 18 MOV DWORD PTR SS:[ESP+18],EBP
6FCD67C5 C74424 1C 650100>MOV DWORD PTR SS:[ESP+1C],165
6FCD67CD C74424 20 070000>MOV DWORD PTR SS:[ESP+20],7
6FCD67D5 C74424 24 010000>MOV DWORD PTR SS:[ESP+24],1
6FCD67DD C74424 30 020000>MOV DWORD PTR SS:[ESP+30],2
Initalisation de 2 registres pour la suite
EDX=Nouvelle Structure (Ptr (ESP+14)) que l'on vient de créer
ECX=EBX=GamePTR
Creation de la Structure EDX avec les valeurs suivantes
EDX-04 = EBP = PlayerPtr
EDX+04 = EBP = PlayerPtr
EDX+08 = 0x165
EDX+0C = 0x7
EDX+10 = 0x1
EDX+1C = 0x2
Bon pour l'instant ces chiffres ne sont pas parlant nous verrons bien pour la suite.
Code:
Creation de la valkyrie
6FCD67E5 E8 16780100 CALL D2Game.6FCEE000
6FCD67EA 8BF0 MOV ESI,EAX
6FCD67EC 85F6 TEST ESI,ESI
6FCD67EE 75 0A JNZ SHORT D2Game.6FCD67FA
6FCD67F0 5F POP EDI
6FCD67F1 5E POP ESI
6FCD67F2 5D POP EBP
6FCD67F3 5B POP EBX
6FCD67F4 83C4 24 ADD ESP,24
6FCD67F7 C2 0400 RETN 4
C'est à cela que servait la structure transitoire.
Sans faire aucun trace, voici ce que l'on peut deviner rapidement.
En +08
0x165 (357 en décimal)=ID de la valkyrie dans Monstats.txt
Si vous chercher la ligne valkyrie dans ce fichier sous excel (ligne 359) la colonne F correspond bien au populatedID=357
Et le 1 2 et 7?
Difficle de répondre pour le moment. Le 7 signifie probablement = Minion
Le 1 le nombre de valkyrie ...
Soit dit en passant avec ollyDBG vous pouvez modifier ces valeurs avant qu'elles ne soit utilisées en cliquantDroit / Modify.
Mais bon vous risquez probablement un crash
Regradons ce qui se passe
EAX=Valkyrie Ptr
ESI = ValkyriePtr
On fait un test rapide suir l'existence du pointeur
Pas de valkyrie = EXIT Else continue
Cool une nouvelle unité est prête. L'unité Valkyrie.
Un petit dump de ce que j'ai obtenu
Code:
VALKYRIE UNIT DUMP
$ ==> >01 00 00 00 65 01 00 00 ...e..
$+8 >0F 00 00 00 01 00 00 00 ......
$+10 >00 00 00 00 00 00 00 00 ........
$+18 >80 4A 28 02 00 00 00 00 €J(....
$+20 >00 00 00 00 00 00 00 00 ........
$+28 >00 00 00 00 DA 07 46 4C ....ÚFL
$+30 >4E 5A 8C 32 E4 A4 D2 62 NZŒ2ä¤Òb
$+38 >00 EC 05 07 00 00 00 00 .ì....
$+40 >00 00 00 00 00 00 00 00 ........
$+48 >00 00 00 00 00 00 00 00 ........
$+50 >00 00 00 00 00 01 00 00 .......
$+58 >00 01 00 00 00 00 00 00 .......
$+60 >28 DD A8 04 00 00 00 00 (ݨ....
$+68 >00 00 00 00 00 EA 05 07 .....ê
$+70 >00 E2 71 05 00 00 00 00 .âq....
$+78 >00 00 00 00 00 00 00 00 ........
$+80 >00 00 00 00 00 D9 71 05 .....Ùq
Toujours pareil si vous utilisez mon fichiers excel vous trouverez
+00 UnitType Ici (01 00 00 00) soit 0x1 (on lit les bytes de droite à gauche)LEs valkyries sont des unités Monstres.
+04 UnitClass ici 0x165 on vient de le voir c'est le populated ID de monstats.txt.
+08 Unit UnisueID 0xF C'est l'ID unique séquentiel utilisé par le jeu pour identifier les unité de même type dans la partie. Bref ici c'est le 15eme monstres de la partie créé.
Bizarre on n'est même pas sortie en ville ????
Je suis prêt à parier que nos amis les NPCs, les poules et autres animaux sont aux nombres de 14. (Pas sur pour les NPCs d'ailleurs)
+0C MODE=0x1 Il faut consulter le fichier MonMode.txt je le fait pour vous ligne1=Neutral(NU) Bref la valkyrie est dans le mode Neutre pour le moment.
+2c/+30/+34 on peut voir la Seed (pour l'aléatoire)
+38 On trouve le pointeur sur la structure Hpath qui gère la position sur la carte/les déplacements/ les cibles ...
+58 Vitesse d'animation= 0x100 soit 256 c'est cette valeur qui est utilisé par les formules d'IAS pour gérer la vitesse d'attaque. Mais également par le FastCast,FastBlock ...
... vous regarderez mon fichier excel si vous voulez en apprendre plus.
Bon maintenant que la valkyrie est créée il va falloir la compléter
C'est la suite qui devient plus intéressante