Faire tourner un vieux jeu nativement sour Windows

Est-il possible de faire marcher Ford Racing 2 sur Windows 10 nativement ?

Bonjour à tous ! Aujourd’hui je vais vous parler d’une petite expérience que j’ai faite pour essayer de faire marcher un vieux jeu :)

Il y a quelques temps, j’ai retrouvé sur une des mes vieilles machines Ford Racing 2, et je me suis mis en tête de le relancer pour retrouver les sensations de l’époque.

Comment faire marcher un vieux jeu ?

Comme je disais, me voilà en possession d’un dossier contenant le jeu et la première chose que je teste, c’est bien sûr d’essayer de le lancer directement. L’introduction marche, mais une fois passée, le jeu plante avec un message d’erreur.

Une petite erreur bien désagréable
Une petite erreur bien désagréable

Une petite recherche me mène rapidement sur un forum qui propose un binaire patché du jeu qui évite cette erreur (je ne mets pas le lien car il est un peu shady), mais je n’ai pas spécialement envie de faire tourner ça chez moi.

A partir de là, j’ai trois possibilités :

  • Utiliser une VM de Windows pour faire tourner le jeu. Je n’en ai pas d’installée sur ma machine et j’avais un peu la flemme de trouver une image donc j’écarte ça.
  • Utiliser Wine avec Linux, qui arrive à faire des miracles sur un certain nombre de jeux. En l’occurrence j’étais sous Windows et utiliser Linux impliquait de redémarrer mon ordinateur. Par flemme j’écarte à nouveau cette option.
  • Tenter de modifier le binaire pour éviter l’erreur, quitte à perdre en fonctionnalité. Vu que quelqu’un l’a visiblement déjà fait, il y a une chance pour que ça soit faisable. En plus, ça faisait un petit moment que je voulais me plonger dans le binaire d’un jeu, c’était donc l’occasion de m’y mettre !

Bon ce n’est pas la méthode que je recommanderais dans l’absolu, mais mon "moi" du moment s’est dit qu’il y avait une chance pour que ça se passe bien.

Patch du binaire

A partir de là, je lance Cutter, qui permet de désassembler et de modifier le binaire.

Une recherche rapide me permet de trouver le message d’erreur dans les chaînes de caractères. Cutter permet de chercher les références à cette adresse, ce qui me permet de trouver la fonction qui se sert de ce message.

La fonction qui déclenche l'erreur. En orange la référence à la chaîne de caractères. En rouge l'appel à la fonction CoCreateInstance qui retourne une erreur.
La fonction qui déclenche l'erreur. En orange la référence à la chaîne de caractères. En rouge l'appel à la fonction CoCreateInstance qui retourne une erreur.

Je teste d’abord, sans trop y croire, d’inverser le test (présent après l’appel à CoCreateInstance) pour que l’exécution continue. Une nouvelle erreur apparaît, que j’essaie de faire disparaître de la même manière : cette fois, le programme crashe sans message d’erreur. Mauvaise méthode donc.

Deuxième essai : je localise les appels à cette fonction dans le reste du code. Coup de chance, elle n’est appelée qu’une seule fois ailleurs ! Je neutralise cet appel (en le remplaçant par des NOP, l’instruction qui n’a pas d’effet). Je lance le jeu et… bingo ! Il fonctionne à nouveau ! Seul problème, la bande son du jeu n’est pas jouée, mais les bruitages sont toujours là. Je lance VLC avec la bande son et je peux enfin me lancer dans ma petite session nostalgie ;)

J'ai maintenant de quoi faire chauffer le bitume en 600 * 400
J'ai maintenant de quoi faire chauffer le bitume en 600 * 400

Bonus

Deux petites choses en bonus que j’ai pu trouver :

  • La configuration du jeu est écrite dans le registre. Pour configurer le jeu il faut lancer un utilitaire fourni avec. Je trouve ça pas super malin mais ça m’a fait rire.
  • Dans les chaînes de caractère du jeu j’ai trouvé des évocations à l’activation de cheats… Je vous avoue que ça me titille d’aller voir de quoi il s’agit ;)

Petite anecdote sur la configuration dans le registre : à la base j’ai vu que je pouvais passer le jeu en Full HD, donc je me suis empressé de le faire. Sauf que je n’avais pas vu qu’il passait le jeu en couleur 16 bits, ce qui m’a empêché de relancer le jeu… et l’utilitaire aussi ! J’ai du relancer le jeu avec Procmon pour comprendre où il allait chercher la config… La galère :lol:


Bilan des courses : le jeu marche !

Je vous avoue que je n’y croyais pas du tout au début et j’étais plus motivé par la curiosité qu’autre chose.

Si vous voulez bricoler vos jeux vous aussi sachez que :

  • Ici, j’ai eu un sacré coup de bol qu’il n’y ait qu’un seul appel incompatible avec Windows 10. Honnêtement, je pense que ça tient du miracle.
  • Un bon nombre de jeux plus récents sont protégés par des solutions qui rendent le reverse engineering très compliqué (par exemple Denuvo et VMProtect).
  • Légalement, le reverse engineering tombe sous le coup de la loi française, et communiquer dessus encore plus. Ici, je m’appuie sur l’article L122–6-1 du Code la propriété intellectuelle qui me permet de le faire pour des raisons d’interopérabilité (et accessoirement le jeu est assez vieux donc je doute que l’éditeur essaie de poursuivre qui que ce soit de toute manière).

10 commentaires

Billet intéressant ! :)

Je ne comprends pas bien par contre pourquoi remplacer l’appel de la fonction par NOP NOP permet de continuer le jeu sans provoquer d’autres erreurs ultérieures ? Le « wma_source_filter » serait un composant facultatif du jeu ?

@Green : en fait cette fonction s’occupe d’initialiser l’objet qui lit la musique et s’occupe de la changer quand il faut. Cet objet n’est pas utilisé ailleurs dans le code, donc enlever cette fonction neutralise juste la lecture de la musique sans casser quoi que ce soit ailleurs. S’il y avait eu deux fonctions, une pour initialiser et une pour lire il aurait fallu enlever les appels à ces deux fonctions partout dans le code.

@Stalone c’est parce que j’ai pas encore de SSD :'(

Billet intéressant ! :)

Je ne comprends pas bien par contre pourquoi remplacer l’appel de la fonction par NOP NOP permet de continuer le jeu sans provoquer d’autres erreurs ultérieures ? Le « wma_source_filter » serait un composant facultatif du jeu ?

Green

Au vu de ce qu’il dit ensuite, c’est visiblement un composant indispensable pour lire les musiques du jeu.

Edit: grilled

+1 -0

Salut,

Une petite recherche me mène rapidement sur un forum qui propose un binaire patché du jeu qui évite cette erreur (je ne mets pas le lien car il est un peu shady), mais je n’ai pas spécialement envie de faire tourner ça chez moi.

Un autre site te propose simplement d’installer localement le codec évoqué par le message d’erreur : https://www.pcgamingwiki.com/wiki/Ford_Racing_2

Install the Windows Media Source Filter

  1. Download the Windows Media Source Filter Installer v1.7
  2. Extract the contents from the .zip file into a folder.
  3. Right-click the ApplyPatch.bat and run it as Administrator.
  4. Copy strmdll.dll and drmclien.dll into the game’s installation folder.
  5. Make sure to use an un-patched version of the original .exe for the music to work in the game. (or at least one that works).
  6. Launch the game.

La source indique que ce codec, qui n’est plus livré avec Windows depuis Vista, fonctionne sous Windows 10 : https://mcdebugrndmstuff.blogspot.com/2018/10/monopoly-tycoon-directsound-music-fix.html

Légalement, le reverse engineering tombe sous le coup de la loi française, et communiquer dessus encore plus. Ici, je m’appuie sur l’article L122–6–1 du Code la propriété intellectuelle qui me permet de le faire pour des raisons d’interopérabilité (et accessoirement le jeu est assez vieux donc je doute que l’éditeur essaie de poursuivre qui que ce soit de toute manière).

La définition d’« interopérabilité » retenue par la jurisprudence jusqu’ici a l’air assez restreinte (en particulier, elle insiste sur le fait que ce soit dans la réalisation d’un autre logiciel et qu’il ne s’agisse pas juste de porter des données, le sujet ayant été porté en Cour de cassation qui a essayé de faire des extrapolations d’une directive de 1991, après plusieurs décisions contradictoires d’autres juridictions…) donc ce n’est pas certain, par contre, cela tombe peut-être sous le coup du premier alinéa qui t’autorise, si ce n’est pas proscrit contractuellement, à traduire la forme de code d’un programme dans l’optique d’un processus qui vise à en corriger les erreurs.

Bonne journée

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte