TUR-ROX-👁 Post-creationem-challengem

Heeey !

J’ai terminĂ© la rĂ©alisation de mon challenge de hacking pour la THCON. Je l’ai soumis aux personnes qui organisent l’Ă©vĂ©nement. Je ne sais pas encore s’il sera acceptĂ©. Dans tous les cas, je ne peux rien vous rĂ©vĂ©ler avant la fin du Capture The Flag, qui aura lieu entre le 16 et le 17 avril.

Cependant, ça me dĂ©mange de ne pas pouvoir vous parler de mon Ɠuvre, alors je vais vous rĂ©vĂ©ler son contexte et tout ce qui m’est passĂ© dans la tĂȘte durant sa crĂ©ation. Ça ne devrait rien spoiler, je ne dĂ©cris pas les Ă©nigmes en elle-mĂȘme.

Le contexte

J’en ai dĂ©jĂ  parlĂ© un peu Ă  la fin de cet article.

Il s’agit du jeu vidĂ©o Eye Of The Beholder, dont j’ai modifiĂ© les plans des niveaux et les Ă©vĂ©nements Ă  l’aide de l’outil All-Seeing Eye et de son Ă©diteur.

Pour résoudre le challenge, il faut jouer à la version modifiée tout en inspectant son contenu avec All-Seeing Eye. Il faut analyser les scripts et en déduire les actions à faire dans le jeu, pour obtenir le code secret permettant de valider le challenge. Je ne vous en dis pas plus.

Ce challenge, ainsi que les deux autres créés pour la prĂ©cĂ©dente THCON, s’inscrivent dans un objectif plus global : l’instauration d’une nouvelle catĂ©gorie de challenge de hacking, que j’ai sybillinement baptisĂ© « TUR-ROX ». Ça signifie « TURing-appROXi-complete video games ». C’est mĂȘme pas un vrai sigle, c’est pas du tout les initiales des mots, mais j’m’en fous total, j’suis un ouf’ rebelle malade.

Principe des challenges de type TUR-ROX

Le principe consiste Ă  trouver un jeu vidĂ©o comportant un systĂšme de script intĂ©grĂ©, Ă  le modifier dans le but d’y implĂ©menter un algorithme plus ou moins simple, et Ă  faire en sorte que le flag ne puisse ĂȘtre dĂ©couvert que lorsque cet algorithme est compris.

L’inspection et la modification du jeu peuvent ĂȘtre effectuĂ©es par un outil « officiel » (comme l’Ă©diteur de ZZT), ou bien par un outil ne provenant pas des personnes ayant créé le jeu (comme All-Seeing Eye). Le systĂšme de script peut ĂȘtre plus ou moins Ă©laborĂ©. Au minimum, il doit pouvoir accĂ©der Ă  certains Ă©lĂ©ments du jeu. S’il comporte quelques structures algorithmiques de base, (if, while, 
), c’est dĂ©jĂ  bien.

En général, on fournira cet outil avec le challenge, afin de donner tous les moyens nécessaires à sa résolution. Mais on pourrait faire exception à cette rÚgle.

Beaucoup de jeux actuels sont fortement moddables et scriptables. Les gens qui les dĂ©veloppent ont rĂ©flĂ©chi deux secondes et se sont dit qu’il serait bon de profiter des expĂ©riences du passĂ©. Les scripts s’appuient maintenant sur des langages de programmations standards, multi-usages et documentĂ©s. Par exemple : Roblox utilise le Lua, Twine utilise du JavaScript, les gros moteurs de jeux comme Unity autorisent plusieurs langages (python, C#, …).

C’est la meilleure dĂ©marche possible, ça facilite les liens entre les personnes qui veulent crĂ©er des jeux vidĂ©os et qui ne savent pas (encore) coder, et les personnes qui codent sans crĂ©er de jeux.

Mais ce n’est pas avec ça que je peux faire des chouettes challenges TUR-ROX. Du code Ă  rĂ©tro-ingĂ©nierer dans un langage connu, c’est trop facile. Un foisonnement de documentation, d’outils d’analyse et de debugging sont Ă  portĂ©e de clavier. Une solution serait de faire exprĂšs d’Ă©crire du code le plus incomprĂ©hensible possible, mais serait alors un challenge de type obfuscation, et non plus un TUR-ROX. Il existe dĂ©jĂ  une foule de gens capable de crĂ©er des challenges d’obfuscation, et ce mieux que moi.

Un TUR-ROX est un mix entre un jeu vidĂ©o et du code source Ă  dĂ©cortiquer, le systĂšme de script doit donc ĂȘtre spĂ©cifique au jeu. En revanche, il peut ĂȘtre obscur et mal documentĂ©, ça fait partie du challenge de le comprendre avec les moyens disponibles. C’est pour ça que je prĂ©fĂšre utiliser des jeux anciens ou exotiques. On est obligĂ© de se plonger dans leur histoire, de retrouver comment pensaient les concepteurtrices de jeux Ă  une Ă©poque oĂč il y avait moins de standards.

Et cette annĂ©e, j’ai choisi Eye Of The Beholder. Mais pourquoi donc ?

Attention : Turok ≠ TUR-ROX

Eye Of The Beholder, parce que nostalgie

Ce n’est pas la premiĂšre fois que j’Ă©cris un article sur ce jeu. Il a marquĂ© mon enfance. Je l’ai commencĂ© alors que j’Ă©tais en sixiĂšme, en explorant un peu au hasard. Une solution a Ă©tĂ© publiĂ©e dans un magazine Tilt, j’ai demandĂ© Ă  mon frĂšre de la photocopier. On a commencĂ© Ă  s’en servir avec mon autre frĂšre, on est allĂ© jusqu’au niveau 7. Ensuite, notre intĂ©rĂȘt pour le jeu a diminuĂ©. De plus, ce niveau est graphiquement plus inquiĂ©tant que les prĂ©cĂ©dents (trĂšs sombre, des symboles d’araignĂ©s omniprĂ©sents), et il commence par un difficile combat contre un groupe d’elfes noirs. J’ai doutĂ© de mes capacitĂ©s Ă  en venir Ă  bout, j’ai laissĂ© tomber.

Moustache ! moustache !

Je me suis fait engueuler par mon frĂšre, qui m’a reprochĂ© que les photocopies avaient Ă©tĂ© faites pour rien puisque je n’Ă©tais mĂȘme pas foutu de les utiliser entiĂšrement.

Quelques annĂ©es plus tard, j’ai recommencĂ© le jeu seul. J’ai pris le temps d’Ă©laborer une Ă©quipe bien Ă©quilibrĂ©e, couvrant le plus de classes possibles. J’ai tuĂ© tous ces tocards d’elfes noirs et je suis arrivĂ© au niveau 10. Il comporte un gĂ©nĂ©rateur de Mantis Warrior. J’avais rĂ©ussi Ă  faire abstraction du gĂ©nĂ©rateur d’araignĂ©e gĂ©ante prĂ©sent au niveau 4, mais celui des Mantis m’a psychologiquement bloquĂ©.

Ce que j’aime dans ce jeu, c’est le sentiment de « nettoyer » les souterrains. On explore partout, on tue tous les monstres qu’on rencontre et on prend tous les objets. À chaque fois qu’on finit un niveau, on peut se dire : « VoilĂ , il n’y a plus aucun danger. Je pourrais revenir me promener dans ce niveau sans aucune crainte ». ConcrĂštement, on n’a pas besoin d’y revenir, mais j’aimais Ă©prouver cette sĂ©curitĂ© et cette impression de rendre le monde meilleur. Or, les gĂ©nĂ©rateurs de monstres enlĂšvent complĂštement ce sentiment.

Encore une ou deux annĂ©es plus tard, je me dis que c’est quand mĂȘme dommage d’ĂȘtre allĂ© aussi loin dans le jeu sans le finir. Je dĂ©truis 4 Mantis Warrior Ă  la suite dans le niveau 10. Je parviens Ă  me faire une raison : les prochains seront gĂ©nĂ©rĂ©s dans longtemps, je peux toujours Ă©prouver un sentiment de nettoyage mĂȘme provisoire, et si il faut vraiment sĂ©curiser entiĂšrement les souterrains, eh bien les notables de la ville de WaterDeep n’auront qu’Ă  envoyer des magiciens destructeurs de gĂ©nĂ©rateurs de monstres !

J’Ă©cume les derniers niveaux, je bute Xanathar Ă  la bourrin (je possĂ©dais le « Wand of Silvias », mais je n’avais pas compris qu’on pouvait s’en servir pour le faire reculer jusque dans des pics oĂč il se plante stupidement). Mon frĂšre revient Ă  la maison pour des vacances. Je lui annonce que j’ai terminĂ© le jeu. Il est heureux pour moi, mais ne s’excuse pas de m’avoir engueulĂ© des annĂ©es auparavant. Il ne se souvenait certainement pas de ce passage de sa vie.

Maintenant que j’y pense, ce mĂȘme frĂšre m’avait soutenu lorsque je suis allĂ© rapporter Ă  la FNAC un jeu qui ne marchait pas. On a pu obtenir un avoir, ce qui n’Ă©tait pas gagnĂ© d’avance, et je crois que je ne l’ai jamais remerciĂ© pour ça.

D’autres annĂ©es plus tard, je commence un tout petit peu Eye Of The Beholder 2, mais je ne prends pas le temps de me lancer vraiment dedans. J’essayerais peut-ĂȘtre de le faire un jour, en live sur Twitch, avec vous.

Pour finir, j’ai nĂ©gationnĂ© mes deux frĂšres et je me sens mieux. Je ne dĂ©taille pas plus, je ne veux pas vous embĂȘter avec des histoires idiotes.

Aujourd’hui, j’ai retrouvĂ© la solution, sans faire de photocopies. Merci au site abandonware-magazine !

Eye Of The Beholder, parce que script

Je me souvenais d’Ă©nigmes et d’Ă©vĂ©nements tellement Ă©tranges que ça laissait supposer la prĂ©sence d’un systĂšme de script relativement gĂ©nĂ©rique. Quelques exemples :

  • Vous avancez dans un couloir et automatiquement vous faites un demi-tour, sans ĂȘtre prĂ©venu.
  • Vous posez certains objets Ă  certains endroits, ça dĂ©clenche l’apparition d’un monstre et/ou d’autres objets.
  • Vous entrez dans une piĂšce, vous ramassez une potion, vous sortez, vous re-rentrez par une autre entrĂ©e, une deuxiĂšme potion est apparue, vous la ramassez, ainsi de suite jusqu’Ă  4 potions.
  • Des rencontres avec des PNJ dĂ©clenchant des dialogues, des ajouts de nouveaux personnages, des attaques, etc.
  • Des tĂ©lĂ©porteurs, des murs qui disparaissent quand on appuie sur un bouton, des plaques de pression qui dĂ©clenchent des ouvertures/fermetures de portes, etc etc.

J’ai cherchĂ© un Ă©diteur de niveau et je suis trĂšs vite tombĂ© sur « All-Seeing Eye », créé par Joonas Hirvonen (je sais pas qui c’est). Il permet de modifier beaucoup de choses, y compris les scripts.

Au bout de quelques soirĂ©es et quelques week-ends, j’avais assez bien apprĂ©hendĂ© le « EOB-script » (appelons-le comme ça) et j’avais une idĂ©e assez prĂ©cise des Ă©nigmes que je pouvais crĂ©er.

J’ai Ă©tĂ© impressionnĂ©. Ça date de 1991 et c’est une machine virtuelle fonctionnant avec du bytecode. Son langage, comme dirait les Inconnus, est « souple et solide Ă  la fois ».

Voici les fonctionnalitĂ©s de l’EOB-script qui m’ont beaucoup plues.

  • 32 variables boolĂ©ennes locales Ă  chaque niveau + 32 variables boolĂ©ennes globales.
  • OpĂ©rations boolĂ©ennes complexes Ă  l’aide de la notation postfixe .
  • Beaucoup de fonctions pour analyser l’Ă©tat du jeu : prĂ©sence de monstre Ă  un endroit, type de mur d’une case spĂ©cifique, prĂ©sence d’un type d’objet sur une case, position de l’Ă©quipe de personnages, classe et race des personnages, 

  • Et aussi beaucoup de fonctions pour agir sur le jeu : crĂ©er/supprimer des objets/murs/monstres, lancer un sort, Ă©mettre un son, infliger des dĂ©gĂąts, 

  • Branchement conditionnel (if – goto), mais aussi sous-fonctions grĂące aux instructions gosub et return, dont j’ai grandement profitĂ© !
  • Gestion d’Ă©vĂ©nements couvrant un large spectre : on peut exĂ©cuter un script sur une rĂ©cupĂ©ration ou un dĂ©pĂŽt d’objet, une arrivĂ©e ou une sortie sur une case, un clic dans la zone rĂ©active d’un mur (manette, serrure, rune, 
).
  • CohĂ©rence dans la gestion d’Ă©vĂ©nements : une tĂ©lĂ©portation dĂ©clenchera le « on_enter » de la case d’arrivĂ©e, un lancer d’objet dĂ©clenchera le « on_put_item » de la case sur laquelle l’objet atterrit.
  • Robustesse : sur un seul Ă©vĂ©nement, il est possible de dĂ©placer des dizaines d’objets, modifier des dizaines de murs, exĂ©cuter des dizaines d’instructions, Ă©crire des dizaines de messages (mĂȘme si seuls les trois derniers sont visibles), tout ça sans problĂšme, sans plantage, sans ralentissement.

En revanche, All-Seeing Eye n’est pas toujours Ă  la hauteur de la magnificence de l’EOB-script. En particulier, on ne peut pas changer les dialogues et les Ă©vĂ©nements des rencontres avec les PNJ. Je ne sais pas si c’est dĂ» Ă  un simple manque de motivation ou Ă  une impossibilitĂ© technique. Je ne sais pas si ces Ă©vĂ©nements sont Ă©crits en EOB-script ou codĂ©s en dur. Je ne sais pas non plus oĂč ils sont stockĂ©es, (pas forcĂ©ment dans les fichiers EOBDATA.PAK).

J’ai beaucoup de remarques et de propositions d’amĂ©liorations, ce qui nous amĂšne au chapitre suivant.

Ils sont meugnons !

Review de All-Seeing Eye (Pour plus tard)

Je vais faire un petit don de 20 euros sur le Paypal de Zorbus.net. C’est amplement mĂ©ritĂ©. S’ils n’avaient pas créé All-Seeing Eye, je n’aurais jamais pu crĂ©er ce challenge de hacking dont je suis assez fier.

Comme j’ai bien utilisĂ© et explorĂ© leur outil pendant plusieurs semaines, et que j’ai un peu galĂ©rĂ© Ă  cause de certains bugs, j’ai souhaitĂ© rassembler mes remarques dans un mĂȘme document, que je leur transmettrais.

Et comme j’aime bien rentabiliser les textes que j’Ă©cris, je mettrais ces remarques aussi dans ce blog. Mais pas tout de suite, ce sera l’objet du prochain-prochain article. Il sera en anglais, mais vous vous dĂ©brouillerez bien.

Je vous laisse avec des yeux tatoués sur des seins. Je trouve ça trÚs rigolo.

4 réponses à “TUR-ROX-👁 Post-creationem-challengem

  1. Pingback: Et paf les stats + Ludum Dare | RéchÚr : le Grand Tout

  2. Pingback: Bug et propositions d’amĂ©liorations pour l’outil All-Seeing Eye | RĂ©chĂšr : le Grand Tout

  3. Sur le forum de gog.com, y’a quelqu’un qui parle de All-Seeing Eye (paladin3333), et qui est en train d’essayer un tas de bidouilles pour changer le jeu !

    MĂȘme que Joonas Hirvonen lui a rĂ©pondu. Et il a mis un lien vers mon autre article de blog. Youpi !

    Les dates des messages sont super proches de la THCON. Je me demande si la personne qui fait ces bidouilles n’a pas dĂ©couvert tout ça grĂące Ă  mon challenge. En plus c’est Ă©crit qu’elle vient de France.

    Ha ha, si c’est le cas, ce serait super pour mon Ă©go.

    Bon allez, je me remets à mes trucs. À bientît.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icÎne pour vous connecter:

Logo WordPress.com

Vous commentez Ă  l’aide de votre compte WordPress.com. DĂ©connexion /  Changer )

Image Twitter

Vous commentez Ă  l’aide de votre compte Twitter. DĂ©connexion /  Changer )

Photo Facebook

Vous commentez Ă  l’aide de votre compte Facebook. DĂ©connexion /  Changer )

Connexion Ă  %s