-
De binaire à assembleur.
Bonjour,
Après moultes recherches, je piétine. Voilà mon problème :
Je souhaite m'amuser un peu avec un jeu abandonware qui a bersé mon enfance. Malheureusement des crash du jeu interviennent régulièrement et bien entendu aucun patch n'existe et le code source n'est pas disponible.
Avec mes petites connaissances en programmation, j'essaye donc de déboguer ça moi même.
J'ai pu repérer la dll et la ligne qui crash via le debuger de visual studio, qui montre des instructions asm.
Seulement, je n'arrive pas a éditer l'asm via visual, et je n'arrive pas a mettre la main sur un logiciel ou un outil qui permet de transformer ma dll en asm.
Je sais qu'un tel procédé existe et je n'ai pas peur de me lancer à l'attaque de milliers de lignes d'asm non commentées ;)
Si vous avez des conseils, logicels, experiences, etc, à me proposer, je vous en serais très reconnaissant !
-
Bonjour,
— C'est quel jeu ?
— Sur quel système d'exploitation ?
Ce que tu recherches s'appelle un « désassembleur » (disassembler en anglais) Fais une recherche, car il en existe un certain nombre.
Il est peu probable que ce soit dans une DLL que se trouve ton problème. Plus précisément, s'il ne s'agit pas d'une partie intégrante de ton logiciel, il est possible que ce soit une bibliothèque d'usage général, donc beaucoup plus vaste que tu l'imagines. Des milliers de lignes ne sont qu'un minimum, malheureusement : j'avais désassemblé à une époque les 32 ko de ROM d'un huit bits de 1987 et obtenu 20.000 lignes.
D'autre part, la plupart de ces produits étaient déjà écrits dans un langage de haut niveau. Généralement en C, souvent en C++ ou en Delphi. Le code assembleur que tu vas obtenir va être assez éloigné du code source original.
Enfin, si tu obtiens des plantages aléatoires, il est probable qu'il ne s'agisse pas d'un bug mais d'une incompatibilité avec les bibliothèques et les environnements récents. Regarde plutôt dans un premier temps si tu ne peux pas retrouver les bibliothèques originales.
-
Merci d'avoir répondu,
Il s'agit de Warhammer - Dans l'ombre du rat Cornu, de 1996 et j'y joue sur windows 7 32bit.
Le crash que j'obtiens n'est en fait pas aléatoire, c'est tout le temps le même au même moment : lorsque je lance certains sorts. (pas tous, juste certains ! mais tout le temps les mêmes)
j'ai alors droit à : Exception non gérée à 0x1004a945 dans WHSHR.EXE*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.
ligne asm montrée par Visual : 1004A945 mov ecx,dword ptr [eax]
où eax = 0
Si ma mémoire est bonne, même a l'époque quand j'y jouais sur windows 95/98, le bug existait.
-
Sous UNIX, on appelle cela une « segfault » et c'est extrêmement courant : on veut récupérer la donnée à l'adresse pointée par EAX, mais EAX contient une valeur invalide. Il faut donc vérifier en amont pourquoi cette valeur est invalide en examinant les routines censées avoir modifié EAX et ça peut remonter loin.
Les problèmes sont que, d'une part, EAX contient probablement la valeur de retour d'une fonction écrite en C ou C++ et que, d'autre part, ça peut vraiment être dû à n'importe quoi : par exemple, si tu alloues 1024 octets de mémoire en C en écrivant « ptr = malloc(1024) », il y a de forte chances pour que le retour de malloc soit transmis dans EAX, lequel va ensuite être écrit à l'adresse occupée par la variable x. Si le programmeur a considéré que le système retournerait toujours de la mémoire et n'a pas géré les erreurs possibles, ce qui arrive fréquemment, alors le programme plantera le jour où le système d'exploitation refusera de le satisfaire.
Il est aussi tout-à-fait possible que cette valeur soit un handle vers un fichier ou un pointeur vers une ressource comme la mémoire vidéo. Si celui-ci ou celle-ci n'existe plus sous la forme que le jeu connaissait, cela va conduire également à un échec non pris en charge.
Vois également cette page, si ce n'est déjà fait : elle traite des adaptations à faire pour faire fonctionner le jeu dans un environnement adéquat : WarHammer sous XP.
-
Problème localisé : toutes les parties ne chargent pas toutes les ressources (en particulier ici les ressources nécessaires aux sorts). Aillant bien fouillé les fichiers de confs des parties en question et n'ayant rien trouvé, le chargement doit se faire dans les dll associées :( pas moyen donc de customiser les parties comme j'aurai aimé le faire !
Merci en tout cas pour tes clarifications et ton aide.
-
Comment ça, « customiser les parties » ?