Reverse-engineering des dll contenant des Npcs
Reverse-engineering des dll contenant des Npcs
Dans cette zone du wiki nous parlerons des modifications manuelles des dll utilisées par le serveur T4C lui-même.
Dans nos exemples, nous partirons à chaque fois du Npc Kalastor afin de faciliter l'écriture de cet article.
Modification des emplacements de Npcs (Personnage non joueur)
En premier lieu dans IDA Pro nous recherchons Kalastor.
Recherche du Npc dans le code assembleur
Pour cela sélectionner la fenêtre contenant la liste des strings et utiliser le code clavier (ALT + T). Ensuite entrez le nom "Kalastor" et lancer la recherche.
Si vous ne tombez pas directement sur votre cible, il vous suffit tout simplement d'utiliser le code clavier (CTRL + T) afin d'effectuer la recherche suivante.
Une fois que nous avons trouver l'identifiant de Kalasor qui est "[3044]Kalastor" vous double cliquez dans la fenêtre des string ce qui vous conduira directement dans la database de l'exécutable contenant le string.
.data:10050C48 a3044Kalastor db '[3044]Kalastor',0 ; DATA XREF: sub_10017E80+35A o .data:10050C48 ; sub_10017E80+376 o
Recherche des coordonnées du Npc dans le code assembleur
Après cela, nous n'avons plus qu’à nous rendre à l'offset 10017E80+35A afin d'y trouver le code assembleur suivant :
.text:100181DA mov edi, offset a3044Kalastor ; "[3044]Kalastor" .text:100181DF repne scasb .text:100181E1 not ecx .text:100181E3 push ecx .text:100181E4 call sub_1003CDB0 .text:100181E9 or ecx, 0FFFFFFFFh .text:100181EC mov edx, eax .text:100181EE add esp, 4 .text:100181F1 mov [ebx+0Ch], edx .text:100181F4 xor eax, eax .text:100181F6 mov edi, offset a3044Kalastor ; "[3044]Kalastor" .text:100181FB repne scasb .text:100181FD not ecx .text:100181FF sub edi, ecx .text:10018201 mov eax, ecx .text:10018203 mov esi, edi .text:10018205 shr ecx, 2 .text:10018208 mov edi, edx .text:1001820A rep movsd .text:1001820C mov ecx, eax .text:1001820E and ecx, 3 .text:10018211 rep movsb .text:10018213 pop edi .text:10018214 pop esi .text:10018215 mov dword ptr [ebx+5Ch], 0B42h ; Coordonnée X = 2882 .text:1001821C mov dword ptr [ebx+60h], 468h ; Coordonnée Y = 1128 .text:10018223 mov dword ptr [ebx+64h], 0 ; Monde = 0 .text:1001822A pop ebx .text:1001822B retn
Comme vous pouvez le voir plus haut j'ai commenté dans le code assembleur l'emplacement des coordonnées du PNJ. Nous devons simplement modifier les valeurs afin que Kalastor soit à un autre endroit dans le jeu.
Dans notre exemple, nous utiliserons les coordonnées de l'île GM(1500, 500, 0) comme nouvelle position pour notre ami Kalastor.
Modification des coordonnées avec un éditeur hexadécimal
Nous ouvrons maintenant le fichier NPCs.dll dans un éditeur hexadécimal et nous recherchons l'offset de la coordonnée X pour débuter.
Pour cela nous devrons effectuer un petit calcul afin de trouver celui-ci facilement :
Nous prenons l'offset de la coordonnée X dans IDA Pro qui est 10018215h
.text:10018215 mov dword ptr [ebx+5Ch], 0B42h ; Coordonnée X
Obtention de l'offset ciblant les coordonnée dans le code binaire
Ensuite nous devons soustraire de cette offset l'image base du fichier NPCs.dll (Un simple PE Editor ou IDA Pro lui même vous donne cette information). En général c'est toujours 0x10000000h pour une DLL et 0x400000h pour un exécutable.
0x10018215h - 0x10000000h = 0x18215h
Analyse du code binaire des coordonnées
Dans notre éditeur hexadécimal, nous allons directement à l'offset 0x18215h (En général vous devez utiliser le code clavier CTRL + G) la ou nous y trouverons le code suivant contenant les coordonnées :
C7435C420B0000C7436068040000C7436400000000
Voici une découpe du code assembleur pour que vous puissez comprendre la ligne ci-dessus :
mov dword ptr [ebx+ Adresse] Valeur (Qui est du dword) C7 43 5C 420B0000 C7 43 60 68040000 C7 43 64 00000000
Conversion des coordonnées en hexadécimal
Maintenant pour que notre pnj soit en 1500, 500, 0, nous modifier les valeurs par nos nouvelles coordonnées. Comme vous avez pu le remarquer plus haut pour la coordonnée X nous avons le code hexadécimal 420B0000, donc nous devrons convertir notre coordonnée en hexadécimal et ensuite la swaper.
Conversion de nos coordonnées en hexadécimal :
X : 1500 = 5DC Y : 500 = 1F4 W : 0 = 0
Nous savons également qu'un dword et coder sur 4 octets donc nous convertissons nos coordonnées hexadécimal en dword, pour cela nous devons simplement ajouter des 0 jusqu'à ce que notre code contienne 8 caractères...
X : 000005DC Y : 000001F4 W : 00000000
Swaping des coordonnées hexadécimal
Ensuite nous swapons les coordonnées (je le fait en détails, mais tout cela peut-être fait de tête très facilement) :
Swap pour X :
000005DC 0000 | 05DC 05DC | 0000 05 | DC || 00 | 00 DC | 05 || 00 | 00 DC05 | 0000 DC050000
Swap pour Y :
000001F4 0000 | 01F4 01F4 | 0000 01 | F4 || 00 | 00 F4 | 01 || 00 | 00 F401 || 0000 F4010000
Swap pour W : (Pas besoin ce ne sont que des 0)
Ecriture des modifications
Il nous faut simplement remplacer le code suivant :
C7435C'''420B0000'''C74360'''68040000'''C74364'''00000000'''
Par celui ci :
C7435C'''DC050000'''C74360'''F4010000'''C74364'''00000000'''
Maintenant nous pouvons sauvegarder notre fichier NPCs.dll, relancer le serveur et nous apercevoir que Kalastor ce trouve en 1500, 500, 0.
Modification des statistiques des Npcs
A venir (il est 8h du mat je dois aller bosser xD)
Modification de l'apparence des Npcs
A venir (il est 8h du mat je dois aller bosser xD)
Modification de l'équipements des Npcs
A venir (il est 8h du mat je dois aller bosser xD)
--Mestoph 25 mars 2009 à 10:19 (MSK)