URL: https://linuxfr.org/users/ahuillet/journaux/patch-de-binaire-pour-faire-tourner-medal-of-honor-allied-assau Title: Patch de binaire pour faire tourner Medal of Honor: Allied Assault sous Linux Authors: ahuillet Date: 2010年10月23日T18:07:14+02:00 Tags: Score: 23 Bonjour à tous, je voulais vous raconter ce que j'ai fait pour faire fonctionner le jeu Medal of Honor: Allied Assault (MoHAA) sous Linux. Ce jeu est supposé fonctionner avec wine, mais malheureusement je n'ai pas pu aller plus loin que l'installation, et après avoir un peu insisté que ce soit avec wine ou Crossover Games, j'ai abandonné et me suis tourné vers un portage plus ou moins officiel du jeu sous Linux : [http://icculus.org/~ravage/mohaa/](http://icculus.org/~ravage/mohaa/) Donc, on télécharge cet installeur, on le lance, rien ne se passe - on décompresse le "self extract", on finit par trouver le binaire setup.gtk de l'installeur, et l'installation se passe à peu près normalement à partir de là. Le jeu se lance et fonctionne à peu près... Le son est tout de même mauvais, on entend pas les dialogues, il n'y a du son que dans le haut-parleur gauche, mais ça reste jouable. Sauf que passée la première mission, les choses se gâtent. Le jeu freeze complètement au bout de trois pas. Mais moi, j'avais vraiment envie de jouer à ce jeu ! Par chance, les binaires sont distribués avec (certains) symboles de debug, donc lancer le jeu dans gdb donne des résultats à peu près lisibles, ce qui facilite le désassemblage. Je passe le jeu en mode fenêtré, je désactive le "grab" du pointeur de la souris (afin de pouvoir taper des commandes gdb une fois le crash arrivé), et je reproduis le crash. Il s'agit d'un segfault - je n'ai pas gardé de copie de la backtrace, mais la fonction dans laquelle le crash se produit s'appelle void ClientGameCommandManager::PlaySound(str *, float, int, float, float, float, int) et se trouve à l'adresse **0x0004b0f0**. J'ai donc sorti l'artillerie lourde, à savoir objdump -d, pour désassembler la fonction, et étant donné que le son ne marchait de toute façon pas très bien, je me suis dit que je m'en passerais complètement. Il faut savoir que le son n'est pas désactivable dans MoHAA : on peut baisser le volume, mais c'est tout - ce qui évidemment n'empêchait pas le crash de se produire. Voici le début de la fonction, il s'agit d'un prologue classique de fonction x86: 0004b0f0 <_ZN24ClientGameCommandManager9PlaySoundE3strPfifffi>: £spaces£ £/spaces4ドルb0f0: 55 push %ebp £spaces£ £/spaces4ドルb0f1: 89 e5 mov %esp,%ebp £spaces£ £/spaces4ドルb0f3: 57 push %edi £spaces£ £/spaces4ドルb0f4: 56 push %esi £spaces£ £/spaces4ドルb0f5: 53 push %ebx £spaces£ £/spaces4ドルb0f6: 83 ec 4c sub 0ドルx4c,%esp £spaces£ £/spaces4ドルb0f9: c7 45 dc 00 00 00 00 movl 0ドルx0,-0x24(%ebp) £spaces£ £/spaces4ドルb100: 80 3d 40 a1 26 00 00 cmpb 0ドルx0,0x26a140 £spaces£ £/spaces4ドルb107: 0f 84 53 04 00 00 je 4b560 <_ZN24ClientGameCommandManager9PlaySoundE3strPfifffi+0x470> Un moyen très simple d'empêcher le crash, c'est d'empêcher cette fonction de s'exécuter - la solution la plus simple c'est de mettre un "ret" (return) au tout début du prologue. Un coup d'éditeur hexa et on obtient : £spaces£ £/spaces4ドルb0f0: c3 ret £spaces£ £/spaces4ドルb0f1: 89 e5 mov %esp,%ebp £spaces£ £/spaces4ドルb0f3: 57 push %edi £spaces£ £/spaces4ドルb0f4: 56 push %esi £spaces£ £/spaces4ドルb0f5: 53 push %ebx ... ce qui fait amplement l'affaire. Après avoir relancé le jeu, plus aucun son ne sort, et plus aucun crash n'est à déplorer. C'est la deuxième fois dans ma vie que je fais un patch directement sur un binaire pour corriger un bug (une autre fois c'était sur le driver Intel DRI pour corriger un crash sur mon EeePC sans recompiler tout), et globalement c'est assez simple. Par contre, l'absence de symboles de debug aurait été un problème, car ne pas avoir le nom de la fonction (PlaySound) ne m'aurait pas permis de savoir qu'il s'agissait du son. Je n'aurais alors pas pu avoir une approche aussi aggressive pour contourner le crash. J'ai donc pu jouer pendant deux heures avant de rencontrer des bugs dans le portage de la machine virtuelle qui exécute les scripts de mission, ce qui m'a bloqué sur une mission. Mais ça, c'est une autre histoire ! :) Voila, j'espère que ça donne envie à ceux qui ont les CD de MoHAA dans un coin de réinstaller le jeu sous leur OS favori !