Broken Synapse Dsactivation du brouillard de guerre dans
Broken Synapse Désactivation du brouillard de guerre dans un jeu de stratégie en ligne
Frozen Synapse • Sorti en 2011 • Jeu de stratégie compétitif en tour par tour • Objectif : désactiver le brouillard de guerre
Idée #1 : Wireshark • Récupération des données d’une partie • Client : textcom command select. MT [game ID] • Serveur : blob. gz 0000 h: 06 00 00 00. . ˆ1321834. mul 0010 h: 74 69 74 75 titurn. caffinato 0020 h: 72 09 32 09 r. 2. 4. 0. Matchmad 0030 h: 65 09 30 09 e. 0. 1. 0. Sniper. Zw 0040 h: 6 F 6 C 66 09 0050 h: 36 32 09 36 0060 h: 31 38 38 09 188. 129. caffi 0070 h: 6 E 61 74 6 F nator. Sniper. Zwol 0080 h: 66 09 2 D 34 0090 h: 00 08 00 00. . . machi 88 31 33 32 31 38 33 34 09 6 D 75 6 C 72 6 E 09 63 61 66 66 69 6 E 61 74 6 F Header 34 09 30 09 4 D 61 74 63 68 6 D 61 64 31 09 30 09 53 6 E 69 70 65 72 5 A 77 30 09 2 D 31 09 30 20 31 09 35 32 20 31 30 20 32 34 38 09 34 32 37 36 09 31 38 09 31 32 39 09 63 61 66 66 69 olf. 0. -1. 0 1. 52 62. 610 248. 4276. ? ? ? 72 09 53 6 E 69 70 65 72 5 A 77 6 F 6 C 30 2 E 30 09 30 00 00 0 D 0 A 6 D 61 63 68 69 f. -40. 0. 0. . .
Idée #2 : Olly. Dbg • Breakpoint sur recv • Boucle infinie (? ) dans un switch-case géant • Jeu bâti sur le moteur Torque Game Engine • Langage de script « maison » • Fichiers. cs. dso dans le répertoire du jeu
Idée #3 : Décompiler les. cs. dso • Code du Torque Game Engine publié en 2013 • Lecture moteur pour comprendre : • Structure des fichiers. cs. dso • Rappelle les. class de Java • Présence de tables qui contiennent valeurs immédiates / noms de variables • Fonctionnement de l’interpréteur • Pas de registres • Trois piles • Aucune optimisation
Idée #3 : Décompiler les. cs. dso • Ecriture d’un émulateur/décompilateur en Python OP_LOADIMMED_FLT OP_SETCURVAR OP_ADD [%var] [2] [5] OP_SAVEVAR_FLT Opcode 5 5 27 2 "5 + 2" Torque VM (floats) Emulateur (floats) p. Current. Variable = p. Current. Variable->set. Value(stack. top()); curvar = "%var" lookup_local("var"); Code source : %var = 5 + 2;
Idée #3 : Décompiler les. cs. dso • Structures de contrôle plus compliquées à gérer : Bytecode Emulateur [test] OP_JMPIFNOT if ? while ? / Ajout de META_ENDIF if ? while ? [branche « True » ] Où est-ce que je referme l’accolade ? OK, ici ! META_ENDIF [suite du code] • Fingerprinting pour détecter le type de structure • Avoir un décompilateur qui marche
Idée #3 bis : Décompiler les. cs. dso • Nouvelle mission : identifier les évolutions du bytecode • IDA Pro • Pro tip : version GNU/Linux de Frozen Synapse non strippée : ) • Indices dans le code du moteur • …mais premier commit seulement en février 2013 • Différences découvertes : • Liste des opcodes décalée à deux endroits • Taille des offsets : 4 octets au lieu de 8 • Adaptation du décompilateur
Idée #3 bis : Avec un décompilateur • Possibilité de lire le code source du jeu • Si un. cs plus récent est détecté dans le répertoire, Torque le recompile et l’utilise • Désactivation du brouillard de guerre • Acquisition de succès Steam • Modding ? • Démonstration
Conclusion • Données « sensibles » masquées mais transmises • Décompilateur et scripts disponibles sur Git. Hub • https: //github. com/Justice. Rage/Broken. Synapse • Tricher c’est mal • Writeup et slides sur mon blog : • https: //blog. kwiatkowski. fr/? q=fr/brokensynapse • Frozen Synapse 2 annoncé pour 2016 • Même moteur ? Même décompilateur ? • Des questions ?
- Slides: 10