Tutorial n°1 par Rg12

Comment traduire lorsqu’on manque de place dans un éditeur Hex et/ou que le texte n’est pas visible dans les éditeurs de ressources ?

En effet les mots français sont généralement plus longs que ceux de nos voisins allemands. Voici une technique permettant d’outrepasser cette limitation.
Cette méthode est également très utile lorsque des éditeurs de ressources tel que Reshacker n’arrivent pas à lire tout le texte contenu dans le programme.
Pour ce faire nous aurons besoin de 2 outils : Windasm (j’utiliserais la version 8.93) ainsi qu’un éditeur Hexadécimal (j’utiliserais Hex Workshop).


1) Trouver le contenu à traduire dans Windasm

Pour cela lancer Windasm. Aller dans le menu Disassembler puis Open File to Disassemble… Une fois le fichier désassemblé, cliquez sur l’avant dernière icône de la barre d’outils, juste avant l’imprimante. Il doit ressembler
à ça : Ce bouton vous ouvre une fenêtre contenant une grande partie de phrases anglaises qu’il vous faudra traduire… Repérez l’élément que vous voulez traduire dans la liste. Double-cliquez dessus.

Vous devez arriver à quelque chose de ce style :

Pour moi l’élément à traduire est « english ».

Ce qui est dans le rectangle rouge correspond à l’adresse du code, c’est-à-dire l’endroit dans le programme où se situe l’information décrite après. Cette adresse retirée de 400 000 (l’Image Base) s’appelle l’offset (qui ici vaut 447286-400000= 47286)
Ce qui est dans le rectangle bleu est l’instruction en hexadécimale donnée par le programme à l’ordinateur. Le « push » écrit plus à droite ne servira pas ici, il est juste bon de savoir qu’il correspond à l’instruction en langage assembleur.
Et enfin le rectangle noir est celui qui nous intéresse le plus. Les chiffres inscrits dedans correspondent à l’endroit dans le programme où se situe le mot « english ». Vous pouvez d’abord remarquer que si l’on prend le rectangle noir :
00 46 8F 48 (on espace deux par deux pour une meilleure visibilité) et qu’on le retourne : 48 8F 46 00 on retrouve une partie du code inscrit dans le rectangle bleu. Le 68 qui est devant correspond à l’instruction « push » en hexadécimal.
Notre but va donc être de changer l’adresse du rectangle noir (et donc automatiquement celle du rectangle bleu sauf le 68 qui va rester) par une nouvelle adresse que l’on aura choisi, celle où il y aura notre traduction.

 

2) Modifier l’instruction pour qu’elle pointe vers la traduction

Si vous n’y êtes pas, placez-vous sur la ligne même sous la StringData comme sur l’image ci-dessus. Regardez alors tout en bas de Windasm. Vous devez y trouver quelque chose comme cela :

Il faut seulement tenir compte de @Offset 00047286 (dans cet exemple). Le h indique que c’est de l’hexadécimal. On remarquera par ailleurs que le Code Data correspond au rectangle rouge qui est donc égal à l’offset + 400 000.

Ouvrez donc votre éditeur hexadécimal et ouvrez le fichier (dans Hex Workshop faire File puis Open). Tout d’abord allez à l’offset qui vous était indiqué dans Windasm pour vérifier que vous retrouvez bien le même code que celui du rectangle bleu (voir image 1). Normalement il n’y a pas de problème à ce niveau car nous n’avons encore rien modifié. Si c’est le cas refaites les étapes unes par unes, vous avez du oublier quelque chose. A présent il vous faut trouver un emplacement avec beaucoup de 0. Cet emplacement servira à placer les mots et/ou phrases traduits.
Dans mon exemple je trouve parmi plusieurs celui-ci qui est très grand :


L’offset que j’ai choisi est 00 00 0D 20 que l’on voit mieux ici :

Vous pouvez alors écrire la traduction du mot et/ou phrase à cet endroit.
Pour moi ce sera "français" car le mot que je cherche à traduire est "english" (voir image 1).
Il faut maintenant faire un peu de calcul, je ne vous rassure rien de bien compliqué.
Vous prenez l’offset où vous avez écrit votre traduction (correspondant au premier caractère : dans mon exemple je prendrais donc 00 00 0D 20) et vous y ajoutez l’Image Base qui est toujours la même : 400 000. Cela donne donc : 00 40 0D 20.
Vous inversez ensuite deux par deux comme au début dans Windasm et vous obtenez :
20 0D 40 00 que vous regroupez ensuite pour donner 200D4000. Vous avez à présent votre valeur à remplacer ! Si vous ne comprenez pas ce n’est pas grave. Vous allez dans votre éditeur hexadécimal à l’offset que vous a indiqué Windasm (chez moi 00047286). Vous y trouverez le contenu du rectangle bleu, autrement dit dans mon exemple : 68 48 8F 46 00. J’ai dit précédemment qu’il ne fallait pas toucher au 68 car celui-ci correspond à l’instruction permettant d’aller voir ce qu’il y a en 48 8F 46 00.
On remplace donc dans l’éditeur hexadécimal 48 8F 46 00 par 00 40 0D 20.
Le programme ne va plus pointer vers « english » (7 lettres) mais vers le nouvel emplacement créé qu’on lui a indiqué pour ainsi afficher « français » (8 lettres).

Remarque 1 : Ici, cette méthode ne permet de gagner qu’un caractère ce qui peut parfois être modifié malgré tout en supprimant simplement des 0 en trop disposés à côté. Cependant, il se pourra que dans vos traductions vous ayez besoin de bien plus de place.

Remarque 2 : Cette technique de traduction peut s’avérer difficile au début, il vous faut la relire plusieurs fois si nécessaire et vous comprendrez le principe.