Reverse-engineering des dll contenant des Npcs

De T4C Tech
Aller à la navigation Aller à la recherche

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)