dimanche 9 septembre 2012

Rétroingénierie sur un "abandonware"

Nous y voilà !
En tout amateur que je suis... quelques pistes pour appliquer les techniques de rétroingénierie à un vieux jeu DOS (.COM) pour lequel j'ai essayé de nombreuses triches il y a 20 ans.    :)



Même en le ralentissant avec un .PIF sur mon PC XT, ou avec la célèbre DOSBox qui permet de le faire tourner sur les OS actuels (et d'en contrôler sa vitesse), je n'en voyais pas la fin !!



Tout mon énervement venait de cette base... qui grandissait au fil des niveaux. Allais-je voir des ET's tout verts aux immondes couleurs CGA de l'époque ? Qu'y avait-il à l'intérieur du bâtiment ?

Passionné par l'analyse de malware's, ayant étudié l'assembleur il y a quelques années, je me suis dit : "Pourquoi pas ?"

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

En 1984, SEGA ne protégeait pas ses programmes. Pas de Themida, Armadillo, ou autre aPLib  compression / packer qui font pleurer (même pas essayer en fait  :p) les débutants de mon genre...    :)

En revanche, les systèmes NT (2000, XP, Vista, 7, ...) utilisent une machine virtuelle lorsqu'on leur donne ces vieilleries. L'exécutable responsable, "ntvdm.exe", m'a immédiatement dérangé et dégouté de W32Dasm ou même d'OllyDbg ! On ajoute à cela le fait qu'un "INT 10" nous change la résolution puis force l'affichage en plein écran, le choix était fait ; on change d'outil (merci Baboon) !




Très fièrement et plein d'entrain, je choisis le "dark side" : l'utilitaire "Debugx" en ligne de commande après avoir monté le dossier dans la DOSBox !


J'ai enfin ce que je cherche, des adresses, les opcodes et... les instructions !
Si vous reproduisez ce genre de travail, une visite guidée sur le format .COM ne sera pas superflue. Génial, je peux même comprendre les instructions et "dumper" certaines zones...



Il reste des soucis : je ne peux rechercher aucune chaine de caractère (il y a sûrement une commande) et surtout, la compréhension globale du code va être... ardue !   :D

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Je change donc d'outil, il me faut savoir ce qu'il y a après...
IDA, encore lui, dans sa version gratuite, va m'être de la plus grande utilité !


==> Parfait, il me propose le bon format d'emblée, il ne reste qu'à lui demander d'afficher la base...   :p



==> En plus, il me confirme ce que j'avais déjà compris en ligne de commande : "INT 10" est responsable de l'affichage !

Vite, je déchante, les parties analysées du code sont... presque toutes absentes...


... et au niveau des chaînes de caractères, j'obtiens :

"Low fuel"
"Entering sector", puis ceci :




On est loin des appels aux api's Windows que j'ai l'habitude de voir !

Grâce à l'aide reçue sur FC, j'apprends que la touche "C" me permettra de retrouver la fonction "Analysis" sous Olly.

~ Pour ce qui est des chaînes de caractères, il n'y a d'autre solution que de... comprendre le code et commenter moi-même...


Heureusement, je trouve vite la boucle principale du jeu, celle qui appelle plein de fonctions et qui ne s'arrête... qu'à la mort...



IDA est doté d'une impressionnante fonctionnalité, celle de générer des graphes !
Après avoir fait quelques essais, j'ai assez vite compris que le "call" en 019A s'occupait des collisions. J'ai d'abord tenté, comme pour le "fuel" de l'éditer en "nop" ; mais les projectiles n'atteignaient plus aucun ennemi...   #fail

Il allait donc falloir creuser et... comprendre... ceci :


Avec de meilleures compétences et une analyse plus approfondie, j'aurais pu analyser chaque registre / variable / appel. Compte-tenu de mon objectif, j'ai travaillé en "mode bébé", avec "IDA-View" et "Hex-View" et joué à l'apprenti sorcier un bon moment en "patchant" les appels susceptibles de me faire rater.



Petit-à-petit, j'ai donc pu nommer ces "call" et arriver à trouver les instructions responsables de ce que j'ai appelé "le BOUM".    :)



 En parallèle, il est assez facile via IDA de récupérer les adresses :



Il ne restait plus qu'à modifier un saut, le bon...   :)

==> Ce n'est pas celui-là !    ;)

Conclusion :

Il est assez facile de modifier ce type de fichier, même si on est débutant en la matière. Le manque de références (documentation, chaines de caractères, projets du style) est largement compensé par la simplicité d'un code n'ayant subi aucun chiffrement, pas d'obfuscation !

Pour ceux qui comme moi auraient la folie d'être intéressés par l'issue du jeu, je vous laisse le découvrir ici : 

Merci d'avoir pris le temps de me lire, n'hésitez pas à laisser des commentaires...
:)


Aucun commentaire:

Enregistrer un commentaire