online faq recherche accueil
 

Il y a 181 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Le ITD

 
n°10503
pralinor
Lightwave's 999ers
Posté le 14-09-2006 à 23:16:04  profilanswer
 

Bonjour à tous,  
 
en ces temps d'absence Myrdinnesques, un tant soit peu d'analyse de Diablo manque à tous :D A commencer par moi-même. Histoire de ne pas être en manque d'assembleur, je vais prendre un peu le relais. Et comme premier petit exercice, je me propose d'étudier le ITD ou ignore target defense ou encore ignore les defenses de l'adversaire.
 
Pour le debugging et l'analyse, je vais employer OllyDBG, je vous renvoie aux nombreux posts de Myrdinn pour ce qui concerne le fonctionnement d'OllyDBG, cela dit, si vous avez besoin d'un coup de main, n'hésitez pas.
 
 
La routine ITD en entier :

0471AA80   55               PUSH EBP
0471AA81   8B6C24 0C        MOV EBP,DWORD PTR SS:[ESP+C]
0471AA85   56               PUSH ESI
0471AA86   6A 00            PUSH 0
0471AA88   6A 73            PUSH 73
0471AA8A   53               PUSH EBX
0471AA8B   E8 C6FCF8FF      CALL <JMP.&D2Common.#10537>
0471AA90   85C0             TEST EAX,EAX
0471AA92   74 31            JE SHORT D2Game.0471AAC5
0471AA94   85FF             TEST EDI,EDI
0471AA96   74 2D            JE SHORT D2Game.0471AAC5
0471AA98   8B07             MOV EAX,DWORD PTR DS:[EDI]
0471AA9A   83F8 01          CMP EAX,1
0471AA9D   75 26            JNZ SHORT D2Game.0471AAC5
0471AA9F   8B47 14          MOV EAX,DWORD PTR DS:[EDI+14]
0471AAA2   85C0             TEST EAX,EAX
0471AAA4   74 06            JE SHORT D2Game.0471AAAC
0471AAA6   F640 16 0A       TEST BYTE PTR DS:[EAX+16],0A
0470AAAA   75 19            JNZ SHORT D2Game.0470AAC5
0470AAAC   57               PUSH EDI
0470AAAD   6A 00            PUSH 0
0470AAAF   E8 CA01F9FF      CALL <JMP.&D2Common.#11056>
0470AAB4   85C0             TEST EAX,EAX
0470AAB6   75 0D            JNZ SHORT D2Game.0470AAC5
0470AAB8   57               PUSH EDI
0470AAB9   E8 94FDF8FF      CALL <JMP.&D2Common.#10328>
0470AABE   85C0             TEST EAX,EAX
0470AAC0   75 03            JNZ SHORT D2Game.0470AAC5
0470AAC2   8945 00          MOV DWORD PTR SS:[EBP],EAX


 
Ok, on va analyser tout ça :
 

0471AA80   55               PUSH EBP  
0471AA81   8B6C24 0C        MOV EBP,DWORD PTR SS:[ESP+C]


 
Un peu d'assembleur : L'instruction PUSH sert à mettre un registre ou un nombre dans la pile (elle le pousse).
L'instruction MOV est une instruction du type : MOV A, B ==> A = B ((il faut lire MOV A, B : MOVE B TO A et pas l'inverse)
 
Ce qui se passe : On commence par sauvegarder ce qu'il y a dans EBP.  
Question : Mais qu'y a-t-il dans EBP ???
Réponse en image. Nouis avons affaire à une structure de type 01 00 00 00 05 00 00 00 qui nous suggère un pointeur d'unité PtUnit. Dans notre cas, un monstre (01) de type zombie (05). Donc, nous sauvegardons le monstre que nous attaquons dans la pile.
 
L'instruction du dessous se lit : EBP = ESP + C (12 en décimal).
Pour l'instant, on laisse de côté.
 

0471AA85   56               PUSH ESI  
0471AA86   6A 00            PUSH 0  
0471AA88   6A 73            PUSH 73  
0471AA8A   53               PUSH EBX  
0471AA8B   E8 C6FCF8FF      CALL <JMP.&D2Common.#10537>


 
Un peu d'assembleur : L'instruction CALL sert à appeler un sous-programme, ici, la fonction 10537 de D2Common.
 
Ce qu'il faut savoir : La fonction 10537 est appelée pour connaître la valeur d'une caractéristique d'un joueur ou d'un monstre. L'un de ses arguments est tiré du fichier MPQ item stat cost.
 
Ce qui se passe : Nous allons interroger le jeu pour savoir si le joueur a du ITD. Dans le fichier item stat cost, la varible item_ignoretargetac a pour valeur 115, soit 73 en héxa (le PUSH 73 que nous voyons).
 
http://diabloii.pralinor.net/ITD2
 
Dans cette image j'ai essayé d'isoler les éléments importants : JE me suis placé au moment du CALL, souligné par un grand trait rouge. On peut constater que les registres ESI, EBX et les valeurs 0 et 73 ont été "pushés" dans la pile (la pile est encadrée). J'ai également isolé le registre EBX qui pointe vers une structure 00 00 00 00 02 00 00 00, qui est un ptUnit joueur (00) de type nécro (02).
 

0471AA90   85C0             TEST EAX,EAX  
0471AA92   74 31            JE SHORT D2Game.0471AAC5


 
Un peu d'assembleur : L'instruction TEST sert aux comparaisons. TEST EAX, EAX, compare le registre EAX avec lui-même. Ce genre d'instruction est très courant en assembleur, il s'agit tout simplement de savoir si un registre est renseigné ou pas.  
JE : Jump equal crée un saut de code, si le test est vrai (le test est vrai si TEST EAX, EAX = 0)
 
Ce qui se passe : La fonction 10537 nous renvoie le ITD. Or un noueur a du ITD, ou n'en a pas. Il n'y a pas de valeur spécifique, c'est un booléen. Donc, si on a du ITD, la fonction renverra 1 dans EAX, sinon, 0.  
Le saut 0471AAC5 marque le début de la routine RTD (reduce target defense) chaque fois que nous verrons un saut sur cette ligne, il faudra en déduire que le ITD est ignoré. Ici, si on n'a pas de ITD : zou, circulez, il n'y a rien à voir.
 

0471AA94   85FF             TEST EDI,EDI  
0471AA96   74 2D            JE SHORT D2Game.0471AAC5


 
Ce qui se passe : PAs de difficulté en assembleur, c'est stricto sensu le même test qu'au-dessus :D Dans le registre EDI, on a un pointeur vers le monstre que l'on attaque. En clair : On vérifie que l'on attaque pas de l'air, si c'est la cas (EDI vide) : zou circulez, il n'y a rien à voir.
 

0471AA98   8B07             MOV EAX,DWORD PTR DS:[EDI]  
0471AA9A   83F8 01          CMP EAX,1
0471AA9D   75 26            JNZ SHORT D2Game.0471AAC5


 
Un peu d'assembleur : L'instruction CMP permet les comparaisons. Ici, on compare le registre EAX à 1.
L'instruction JNZ : jump not zero est l'inverse de JE, donc s'active si on n'a pas zero en résultat.
Donc : si EAX <> 1, zou circulez, il n'y a rien à voir.
 
Ce qui se passe : On récupère le DWORD du pointeur de EDI. Rappelons que dans EDI nous avons une valeur qui "pointe" vers une structure PtUnit qui correspond au monstre attaqué (1 et 2).  
 
http://diabloii.pralinor.net/ITD3
 
Nous voyons que ce monstre attaqué est de type "01 00 00 00", ie un monstre et pas un joueur. Maintenant, on met ce type dans le registre EAX (flêche 3). Voilà ce que fait le MOV : Il récupère le type de bidule attaqué, et le met dans le registre EAX. On compare alors ce registre à 1, si le registre n'est pas à 1 : zou, circulez, il n'y a rien à voir.  
 
En résumé : On test que l'on cible bien un monstre, et pas un joueur.
 

0471AA9F   8B47 14          MOV EAX,DWORD PTR DS:[EDI+14]  
0471AAA2   85C0             TEST EAX,EAX  
0471AAA4   74 06            JE SHORT D2Game.0471AAAC


 
Ce qui se passe : Pas de difficultés en assembleur, je pense. Nous récupérons la valeur du PtUnit monstre +14 (en clair PtUnitData) et nous vérifions que cette valeur est renseignée. Si ce n'est pas le cas on saute quelques lignes.
 

0471AAA6   F640 16 0A       TEST BYTE PTR DS:[EAX+16],0A  
0470AAAA   75 19            JNZ SHORT D2Game.0470AAC5


 
Ce qui se passe : Ah ! Voilà qui est intéressant. On compare 0A avec une valeur de EAX+16 (EAX etant égal à PTR (EDI +14)). A quoi peut bien correspondre ce 0A. A vrai dire, dans ce genre de situation, il suffit de mettre un point d'arret sur cette ligne et d'aller jouer un peu. La plupart des monstres renvoient 0. Quelques uns 10. Mais dès que vous tombez sur un champions, unique berserk, vous avez 09, 0B, 0D. On cherche donc à savoir si on a affaire à un champion, unique, berserk, etc. Si c'est le cas : zou, circulez, il n'y a rien à voir.
 

470AAAC   57               PUSH EDI  
0470AAAD   6A 00            PUSH 0  
0470AAAF   E8 CA01F9FF      CALL <JMP.&D2Common.#11056>  
0470AAB4   85C0             TEST EAX,EAX  
0470AAB6   75 0D            JNZ SHORT D2Game.0470AAC5


 
Ce qu'il faut savoir : La fonction 11056 sert à savoir si le monstre qui nous fait face est un boss...
 
Ce qui se passe : Maintenant, c'est facile : Si c'est un boss, circulez...
 

0470AAB8   57               PUSH EDI  
0470AAB9   E8 94FDF8FF      CALL <JMP.&D2Common.#10328>  
0470AABE   85C0             TEST EAX,EAX  
0470AAC0   75 03            JNZ SHORT D2Game.0470AAC5


 
Ce qu'il faut savoir : La fonction 10328 sert à savoir si le monstre qui nous fait face est un merc...
 
Ce qui se passe : Maintenant, c'est facile : Si c'est un merc, circulez...
 
NB : On pourrait aller voir si on est curieux ce qui se passe dans ces fonctions. C'est pas le but du jour, toutefois.
 

0470AAC2   8945 00          MOV DWORD PTR SS:[EBP],EAX


 
Ce qui se passe : On va mettre EAX dans le DWORD pointé par EBP.  
 
Question : Qu'est-ce qu'il y a dans EAX ? Si vous avez suivi, vous avez remarqué que depuis le début, on test EAX et si EAX <> 0 : Circulez. On a donc de grandes chances, voire très grande d'avoir 0 dans EAX (ou faut être vraiment très fort :D Ou encore avoir un debugger)
 
Et EBP. Je vous avais dit au début que cette instruction, on la laissait de côté :  MOV EBP,DWORD PTR SS:[ESP+C]
Hé bien, on a la réponse : Le but de ITD est de réduire la défense à 0. On voit donc bien que dans le pointeur de EBP, on a la défense en question que l'on écrase par 0. Donc ESP contenait un pointeur vers une structure des attributs du monstre.
 
 
En résumé :
 
ITD ne fonctionne que sur les monstres.
ITD ne fonctionne pas sur les uniques, champions, berserk, fantomatiques, etc.
ITD ne fonctionne pas sur les boss
ITD ne fonctionne pas sur les mercs.
 
Voilà pour aujourd'hui. Si ça vous intéresse, la routine RTD se situe juste en dessous, elle n'est pas plus difficile à lire :D
 


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10504
athara
ollydebugger
Posté le 15-09-2006 à 08:19:10  profilanswer
 

:gratz: à toi pour ce post très didactique.
Je ne manquerai pas d'y réferer pour toutes les personnes qui demandent des explications sur le fonctinnement du ITD !
 
Bon allez, une seule petite critique ;) : les dessins faits sous paint sur la capture d'écran de olly pourraient être un peu moins grossiers :D. Mais c'est bien pour trouver quelque chose à redire;

n°10505
pralinor
Lightwave's 999ers
Posté le 15-09-2006 à 16:40:33  profilanswer
 

Les dessins ne sont pas faits sous paint, mais photoshop :D Je le fais volontairement pour avoir l'idée d'un bonhomme en train de t'expliquer sur un tableau :D
 
Pour le reste, il faut bien remplacer Myrdinn :D


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10506
ToTo07
C is a sharp tool
Posté le 15-09-2006 à 18:23:25  profilanswer
 

bravo a toi, je regarde ca et j'essairai de comprendre (pas gagné, je comprend deja rien au posts sur le MF :sweat: ) des que j'aurai du temps

n°10507
pralinor
Lightwave's 999ers
Posté le 15-09-2006 à 19:50:56  profilanswer
 

En fait le code n'est pas forcément essentiel. Je le mets pour illustrer ce qui se passe et permettre à tout le monde de voir que je ne tire pas les choses d'un gris-gris du marabout du coin. En fait, il suffit de se rappeler globalement l'essentiel, qui est :
 
Si on a de l'ITD, on test en séquence :
A- Est-ce que c'est un monstre
B- Est-ce que c'est un monstre spécial
C- Est-ce que c'est un boss
D- Est-ce que c'est un merc
 
Le code fait ces tests-là. Le résultat : Si l'un des tests est vrai, pas d'ITD, sinon défense = 0. Aussi simple que ça ! Et c'est ça qu'il faut retenir.


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10508
ToTo07
C is a sharp tool
Posté le 15-09-2006 à 20:35:29  profilanswer
 

oui mais moi j'essaye de comprendre les dll pour, un jour peut etre, pouvoir pousser mon mod a un stade superieur, mais pour l'instant c'est pas gagné ~~


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°10509
Joel
Every day it's workload
Posté le 16-09-2006 à 10:36:57  profilanswer
 

mouais, avant d'attaquer les DLL, y a qd même 10'000 trucs a faire rien qu'avec les txt :ack:

n°10510
ToTo07
C is a sharp tool
Posté le 16-09-2006 à 11:05:42  profilanswer
 

pralinor a écrit :

[...]Si on a de l'ITD, on test en séquence :
A- Est-ce que c'est un monstre
[...] Le code fait ces tests-là. Le résultat : Si l'un des tests est vrai, pas d'ITD, sinon défense = 0. Aussi simple que ça ! Et c'est ça qu'il faut retenir.


 
:D
 

Joel a écrit :

mouais, avant d'attaquer les DLL, y a qd même 10'000 trucs a faire rien qu'avec les txt :ack:


 
certes mais y'a des trucs qui je pense ne sont faisables qu'avec les DLL :hmm:
 
et pis y'a des trucs qui buguent avec les txt (ou alors je suis pas doué :ack: (remarque, c'est tres probable :hmm: ) )
 
et pis HS nanmého [:ackdeblonde:6]


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°10513
pralinor
Lightwave's 999ers
Posté le 17-09-2006 à 14:27:37  profilanswer
 

Tout le monde aura compris qu'il faut lire l'inverse :D A savoir si ce n'est pas un streum.  
 
Si tu veux apprendre les DLLs ce genre de post est quand même pas mal !


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10514
Constance
[ms]Modo Maudit®
Profil : Modérateur
Posté le 17-09-2006 à 15:11:31  profilanswer
 

pralinor a écrit :

Pour le reste, il faut bien remplacer Myrdinn :D

D'ailleurs quelqu'un a des nouvelles ?
Fait un moment qu'il a pas posté, Ulmo pareil ...


---------------
« L'inconvénient des écrans plats par rapport aux CRT, c'est qu'on peut rien poser dessus :ack: »
n°10515
ToTo07
C is a sharp tool
Posté le 17-09-2006 à 15:27:21  profilanswer
 

pralinor a écrit :

Si tu veux apprendre les DLLs ce genre de post est quand même pas mal !


 
bah vi mais je comprends pas tout (qui a dit presque rien, sisi je t'ai entendu, toi au fond :o ) :spamafote:
 
j'avai mp myrdinn pour qu'il m'explique 2-3 choses mais il a toujours pas lu :/


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°10517
pralinor
Lightwave's 999ers
Posté le 17-09-2006 à 17:40:24  profilanswer
 

La dernière fois que j'ai vu Myrdinn passer, c'est courant août, il avait fait une maj sur le fixe de D2LOD.  
Pareil pour Ulmo, pas de nouvelles !  
 
Si tu as besoin de 2-3 explications, je peux sans doute en fournir 1-2 ;D Je risque d'être pas mal occupé par la suite, dès novembre arrivé, les cours reprennent, ça ne me laisse pas beaucoup de temps libre !


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10522
Ulmo
Posté le 22-09-2006 à 19:54:46  profilanswer
 

Coucou !
Bon ça doit faire 3 mois que je ne suis pas passé...
Bonne surprise ce post. Ca me fait plaisir de voir des choses techniques comme ça. En plus tes lecteurs ne se pleignent pas de mal de tête.

n°10523
Constance
[ms]Modo Maudit®
Profil : Modérateur
Posté le 22-09-2006 à 20:11:56  profilanswer
 

Ulmo a écrit :

En plus tes lecteurs ne se pleignent pas de mal de tête.

Normal, ils ont fait un claquage direct, plus moyen de répondre alors ...


---------------
« L'inconvénient des écrans plats par rapport aux CRT, c'est qu'on peut rien poser dessus :ack: »
n°10524
ToTo07
C is a sharp tool
Posté le 22-09-2006 à 20:17:09  profilanswer
 

perso je trouve que c'est moins "fatigant" que du myrdinn :ack:
 
/HS
 
j'ai testé et ca marche :) j'obtiens des resultats coherent (meme si j'ai pas tout pigé et que je saurais pas faire un truc comme ca sur une autre routine :ack: )


Message édité par ToTo07 le 22-09-2006 à 20:17:30

---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°10527
pralinor
Lightwave's 999ers
Posté le 25-09-2006 à 17:38:18  profilanswer
 

Quand j'aurais un peu de temps, je montrerai d'autres routines. C'est pas bien difficile dans l'absolu :D La routine étant assez simple; je suppose que c'est pour ça que personne n'a râlé.


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10529
ToTo07
C is a sharp tool
Posté le 25-09-2006 à 18:14:09  profilanswer
 

semi-HS : si tu vois une routien tres simple, tu me le dis et j'essayerai de la comprndre et tu me corrigeras :ack: stp [:bellandy:7]
 
/semi-HS

n°10535
pralinor
Lightwave's 999ers
Posté le 26-09-2006 à 17:26:49  profilanswer
 

Tu peux essayer sur le RTD qui se trouve juste derrière. RTD c'est le reduce target defense. T'as une bonne base avec ce que j'ai fait, et tu pourras comprendre certains aspect du code du ITD.  
 
La seule difficulté réelle lors du RTD, c'est la dernièrte lorsque l'on calcul la perte de défense. Les maths en assembleur c'est pas facile à comprendre :D


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10536
ToTo07
C is a sharp tool
Posté le 26-09-2006 à 17:28:50  profilanswer
 

ok, je vais essayer
 
resultats soit demain soit fin de semaine


---------------
MULTI-PAF'S : 1 constance :D   2 sho  3 tetlouze :evil: 4 cafard :evil:  5 xono  6  xono² 7 waznoth 8 waznoth² 9 cafard²  10 tetlouze²   11 Mezzi  12 moi-même :sol: 13 aurox 14 gandalf
qui veut gagner des bonbons  i love this video   plus court TT : 19 secondes, merci ******* ^^ :ack: :razz: poesie :)
Mon mod pour d2 : v1.11[ABANDONNE]   OLOLOLOL²² TeTlis flood  KolleKtor  
La loi de Murphy, c'est l'Histoire de ma vie  
n°10538
pralinor
Lightwave's 999ers
Posté le 30-09-2006 à 11:37:20  profilanswer
 

OK, pour aider au debugging, je vais continuer par un petit cours d'assembleur sur les sauts conditionnels. Et tout d'abord, nous allons regarder le fonctionnement de 2 instructions particulières CMP et TEST.
 
L'instruction CMP :
 
Comme son nom l'indique, cette instruction permet une comparaison. Que signifie-t-elle, comment est-elle faite ?
 
Techniquement l'instruction CMP fait quasi strictement la même chose que l'instruction SUB, elle ne fait pas une comparaison en soit, mais fait une soustraction. Ainsi, l'instruction :
 

CMP EAX, EBX


 
réalise dans les faits :
 

EAX - EBX


 
Seulement, contrairement à l'instruction SUB, qui réalise la soustraction, l'instruction CMP se concentre sur regarder le résultat de cette même instruction.
 
Un petit peu d'assembleur  : Comme vous l'avez remarqué, l'assembleur fonctionne sur un principe simple : Il balaye une zone de mémoire de façon séquentielle et exécute les instructions qu'il trouve sur des pavés de zone mémoire. Par exemple : Lorsqu'il se trouve face à l'instruction 56, il empile le registre ESI (PUSH ESI), puis il se trouve face à un bloc 6A 00, et execute un PUSH 00, etc.  
Vous savez également aussi que l'assembleur traîne des "registres" qui sont des zones de mémoire interne qui lui permettent de garder trace soit de valeurs, soit de pointeurs. Parmi ces registres, il y a EAX, EBX, ESI, EDI, etc. (Enfin ESI et EDI sont des offsets pour être précis). Il y a un registre particulier, le registre EIP, qui sert à pointer la prochaine instruction à exécuter (utile en cas de saut :D).
L'assembleur utilise aussi des "drapeaux" (des "flags" en anglais). Les drapeaux sont techniquement des zones binaires (donc à 0 ou 1) qui indique l'état d'un nombre, d'une instruction, etc. Les drapeaux sont nommés ESPUOZDI sur OllyDBG, ils se trouvent dans l'écran de droite en bas des registres.

 
L'instruction SUB réalise donc la soustraction ET va toper les drapeaux pour indiquer le résultat de la soustraction (est-ce que le nombre obtenu est nul, est-ce qu'il positif ou négatif, pair ou impair, etc.). L'instruction CMP ne fait que toper les drapeaux. Le drapeau qui nous intéresse souvent est le drapeau Z. Si EAX = EBX alors EAX - EBX = 0 ==> Le drapeau Z est mis à 1.
Un autre drapeau intéressant est le C : si EAX < EBX, alors EAX - EBX < 0 ==> LE drapeau C est mis à 1 (d'où le corollaire, si EAX > EBX, alors EAX - EBX > 0 et le drapeau C = 0).
 
Ces drapeaux vont pouvoirs être utilisés par nos instructions de sauts... :D
 
 
L'instruction TEST :
 
De la même façon que l'instruction CMP est une instruction SUB cachée, l'instruction TEST n'est qu'une instruction AND cachée. L'instruction AND est ni plus ni moins qu'un ET logique (J'espère que tout le monde sait ce qu'est un ET logique  :sweat: ). De la même façon que SUB réalise la soustraction ET modifie les drapeaux, et que CMP ne modifie que les drapeaux, AND réalise le et logique et modifie les drapeaux, tandis que TEST ne modifie que les drapeaux.
 
Les instructions logiques sont particulièrement utiles pour réaliser des masques, ou regarder le résultat d'opérations. PAr exmeple : Un AND EAX, EBX modifiera le drapeau Z à 1 si EAX et EBX étaient différents, et à 0 s'ils sont égaux.  
 
L'instruction test est très souvent utilisée pour tester un registre avec lui-même : TEST EAX, EAX. Si EAX = 0, alors le ET logique ne fonctionne pas, et met 1 dans Z, sinon, il met 0, puisque fatalement AND EAX, EAX ne peut être qu'exact ! (ou alors faut vraiement être fort  :sol:)
 
Les débranchements conditionnels :
 
Nous arrivons maintenant à la partie qui nous intéresse, le débranchement. Les instructions de débranchement (sans surprise) utilisent les drapeaux pour déterminer ce qu'elle vont faire.
 
Un peu d'assembleur (ouais vous êtes pas sauvés) : L'assembleur comme vous le savez utilise des instructions au nom baroque comme MOV, ADD, MUL, IMUL, etc. Mais il utilise également des alias. Les alias sont ni plus ni moins que des pseudonymes d'instructions. Comme on s'en doute, nos sauts conditonnels disposent de pseudonymes pour nous compliquer la tâche.
 
JE (JZ) :
JUMP EQUAL ou JUMP ZERO, son alias, est pris si Z = 1.
 
Exemple courant :
 

TEST EAX, EAX
JE labas


 
Si EAX est renseigné, le flag Z = 0 ==> Le JE n'est pas pris
Si EAX = 0, le drapeau Z = 1 ==> Le JE est pris.
 
Facile !
 
JNE (JNZ) :
JUMP NOT EQUAL (JUMP NOT ZERO) est pris si Z = 0
 
A noter : JE est le contraire de JNE, tout comme JZ est le contraire de JNZ :D
 
JL (JNGE) :
JUMP LESS (JUMP NOT GREATER OR EQUAL) est pris si S not = O
 
JLE (JNG) :
JUMP LESS OR EQUAL (JUMP NOT GREATER) est pris si Z = 1 ou S not = O
 
A noter : En fait, on peut oublier les flags dans ces cas-là, il suffit de lire la comparaison pour savoir si le saut est pris ou pas !
 
JG (JNLE) :
JUMP GREATER (JUMP NOT LESS OR EQUAL)
 
JGE (JNL) :
JUMP GREATER OR EQUAL (JUMP NOT LESS)
 
Et voilà, vous êtes maintenant des pros des sauts conditionnels :D


---------------
Le savoir ne vaut que s'il est partagé : FAQ des nécros.
Technique : Configuration clavier --- Les sorts d'os.
D2 en assembleur: La qualité d'un objet I  [:manureva:9]  --- Ralenti l'ennemi --- La perte de durabilité ----- Le ITD
Théorie: Les maths -- TEST/CMP/Les jumps -- La pile
n°10549
schoom
'tin les nuls
Posté le 12-10-2006 à 19:51:58  profilanswer
 

Constance a écrit :

D'ailleurs quelqu'un a des nouvelles ?
Fait un moment qu'il a pas posté, Ulmo pareil ...


 
Aperçu sur le site de Gorkk pour TitanQuest ou il s'est inscrit et mis quelques posts ( techniques of course ) en Août, et puis plus vu ....


---------------
[:schoom:5]  listen the best Psy-Trance with Winamp http://85.25.86.69:8000/listen.pls
La perfection est tout juste suffisante
( Herbert von Karajan )
Account Europe ( HC ) : *schoom
n°10550
guigolum
noone can stop us now
Posté le 14-10-2006 à 11:49:44  profilanswer
 

'et' logique, aussi appelé '.'  
1(=vrai).1=1
0(=faux).x(quoique ce soit) = 0
'ou' logique, aussi appelé '+':
1+x=1
0+0=0;


---------------
il y a ceux qui s'etonnent, qui s'affolent et questionnent; les autres s'en tamponnent tellement la beuh est bonne;
laissez bruler la weed, et n'oubliez personne; dans la fumée des dieux s'effondre babylone..
le libéralisme, c'est la course à l'ovule : pour qu'une personne reussise, un millier doivent crever.

Aller à :
Ajouter une réponse