Impulse ou la poudre aux yeux de l'activation par internet
Par Baboon le dimanche, novembre 8 2009, 16:35 - Lien permanent
Je sais que ca fait longtemps que je n'ai rien posté, les études, la flemme etc.
Pour me rattraper je vais essayer de faire une petite série de posts, si ils n'arrivent pas n'hésitez pas à me gueuler dessus ca me motivera (pas toi over, toi t'es pas venu pour mon anniversaire donc ch'te cause plus)
Au programme donc dans les prochains posts (pas forcément dans l'ordre ...) :
- Impulse ou la poudre aux yeux de l'activation par internet
- l'ARM c'est rigolo
- Hack.lu et challenges
- HITB WMD CTF
- Armadillo 6.X
On commence donc aujourd'hui par Impulse ...
Impulse est un framework de crypto associé à un packer permettant d'après l'éditeur de réduire le piratage :
Impulse Reactor’s Game Object Obfuscation (Goo) lets developers encrypt their program EXE to reduce piracy. Unlike other systems, Goo requires no changes to your source code. Instead, we apply Goo to your standard EXE.
Les arguments de l'éditeur sont plutôt axés sur la facilité à protéger un programme, le moindre impact sur le confort de l'utilisateur, la gestion intelligente des licence - comprendre qu'un sérial n'est pas utilisable uniquement X fois mais plutôt qu'il ne peut pas être diffusé sur internet, en cas d'un trop grand nombre d'activation en des points éloignés et en espace de temps réduit la clef est blacklistée-.
Il n'est donc pas particulièrement fait l'apologie du système de protection à l'aide de termes qui font "bien" : VM, encryption de partout, redirection d'import "warlordz styled" mais on était en droit de penser qu'il y aurait quand même quelques joyeusetés.
En effet le niveau de tout système de protection se mesure par son maillon le plus faible ainsi si l'on a une application sur-protégée mais sans possibilité de black listage de sérial sera releasée dans les 2 jours de sa sortie, même topo pour :
- une application avec force crypto dans la vérification du sérial mais se terminant par un "je goodboy" sans hiddenchecks
- un jeux bien protégé mais dont on peut copier / émuler le cd facilement (starforce l'a bien compris)
- et enfin : un jeux nécessitant une activation par internet avec force crypto mais sans aucune protection (ou si peu) contre le reverse.
C'est ici le cas de notre programme (dont bien sur je tairait le nom ;), trop récent, pas envie d'avoir des emmerdes).
Nous allons maintenant expliquer comment se fait l'activation par internet, comment à partir d'une activation utiliser le programme sur n'importe quel autre PC et enfin comment enlever toute trace de protection.
Activation ...
L'activation peut se faire soit lors de l'installation, soit lors du premier lancement du jeu si aucune connexion à internet n'a été détectée lors de l'installation.
Dans tous les cas il est impossible de jouer sans avoir activé le jeu (nonon même pas 30 minutes).
Lors de l'activation, un serial est demandé, il est ensuite envoyé à un serveur qui renvoie un fichier sig.bin, ce fichier est stocké ensuite dans le dossier "All Users\Application Data\nom du jeu".
Le jeu appartenant à mon beauf un peu parano, il n'a pas voulu que j'utilise sont sérial pour activer le jeu sur mon pc il a donc fallut trouver une ruse pour pouvoir lancer le jeu depuis mon PC ce qui nous amène à notre prochaine partie ...
Youhouuu regarde ! je suis une fille !!!
Bien entendu le fait de copier le fichier sig.bin de mon beauf ne permet pas de jouer au jeux depuis mon pc, il va donc falloir commencer à mettre les mains dans le cambouis !
Après étude du binaire qui n'est protégé que par des timers, on se rend compte que le fichier sig.bin contient une string en héxa qui va être déchiffré à l'aide d'un algorithme à clef publique (j'aurai envie de dire RSA mais je n'en suis pas sur) le résultat obtenu est : le sérial que l'on avait entré, une chaine qui après analyse se révèlera être un identifiant de la machine sur laquelle a été activé le jeu et enfin une autre chaine en héxa. D'après ce que j'ai pu voir le programme utilise la librairie cryptlib pour ces calculs, j'ai essayé de la compiler pour pouvoir générer un .sig avec flair mais je n'ai rien eu de convaincant ...
(à tout ceux qui voudrait faire un bot pour voler des sérials, il est nécessaire d'entrer la même adresse mail que celle de la première activation pour pouvoir activer le jeu et elle n'est pas contenu dans le fichier )
Il faut donc pour que la clef soit accepté que les identifiants des 2 pc soient les mêmes, après un petit peu d'analyse, on se rend compte que l'identifiant n'est calculé qu'à partir de 2 paramètres :
- les valeurs renvoyées par GetSidSubAuthority
- le nom du pc
- une clef registre contenant la date d'installation du jeu
Pour le nom du PC je ne me suis pas trop embêté, j'ai juste modifié le nom de ... mon PC pour ce qui est des valeurs renvoyées par GetSidSubAuthority j'ai créé un petit olly script qui s'en charge tout en empéchant le programme de se connecter à internet et en corrigeant la date d'installation du jeu (désolé pour les noms des labels, je suis rarement inspiré quand je fais des ollyscripts) :
var RtlSubAuthoritySid var WinHttpCrackUrl var sid var url eob breakp gpa "RtlSubAuthoritySid" , "ntdll.dll" mov RtlSubAuthoritySid , $RESULT gpa "WinHttpCrackUrl" , "winhttp.dll" mov WinHttpCrackUrl , $RESULT bp RtlSubAuthoritySid bp WinHttpCrackUrl bp ADDRINSTALLDATE run ret breakp: cmp eip , RtlSubAuthoritySid je ok cmp eip , WinHttpCrackUrl je WinHttpCrackUrlLOL cmp eip , ADDRINSTALLDATE je lolilol cob bc ADDRINSTALLDATE bc RtlSubAuthoritySid bc WinHttpCrackUrl ret ok: mov sid , esp add sid , 4 mov sid , [sid] add sid , 8 mov [sid] , ID1 // vous croyez quand meme pas que je vais laisser l'ID de mon beauf ;) add sid , 4 mov [sid] , ID2 add sid , 4 mov [sid] , ID3 add sid , 4 mov [sid] , ID4 eob breakp run WinHttpCrackUrlLOL: mov url , esp add url , 4 mov url , [url] add url , 8 mov [url] , 004E004E add url , 4 mov [url] , 004E004E add url , 4 mov [url] , 004E004E add url , 4 mov [url] , 004E004E add url , 4 mov [url] , 004E004E add url , 4 mov [url] , 004E004E eob breakp run lolilol: // modification de la date d'installation renvoyée par RegQueryValueExW mov ecx , 1234567 mov url , esp add url , 28 mov [url] , ecx eob breakp run
On essaie maintenant de lancer le jeu sous olly avec le ollyscript et le nom du pc modifié et .... ca marche ! youpi !
Bon ce n'est quand même pas super super pratique ... Nous allons donc maintenant voir comment le jeu est concrètement lancé et comment le dumper pour s'affranchir de toute activation / modification / script.
Quoua ?! Juste ca ?!
Après une étude rapide du reste du code du packer et quelques exécutions, on se rends rapidement compte que la 3ème chaine stockée dans le sig.bin va servir à déchiffrer le code du jeux à proprement parlé après plusieurs étapes :
- extraction du code du jeu chiffré : le jeu chiffré est en faite stocké dans l'exécutable packé mais non loadé en mémoire, il est situé juste après la dernière section en dur, il suffit donc au packer de lire le fichier après la dernière section et il récupère le code chiffré.
- création de la clef de déchiffrement à partir de la 3ème chaine du fichier sig.bin déchiffré et des identifiants du PC ainsi que de la date d'installation
- déchiffrement du code du jeu (on se rend compte alors qu'aucune modification n'a été faite sur l'exe du jeu, il est stocké telquel ! même zylom fait mieux !)
- préparation au lancement : l'exe est loadé en mémoire, dans une page allouée et ses imports sont résolus
- lancement du jeux (alors là c'est du barbarisme à l'état pur, il lance avec CreateProcessA le jeux protégé, unload TOUTES ses sections (ainsi que le PE) avec l'API ZwUnmapViewOfSection et les remplace par celles du jeux déchiffrées et loadées à l'aide des API VirtualAllocEx et WriteProcessMemory, si vous avez déja vu un truc aussi barbare, dites le moi)
Donc au final pour dumper le jeu et avoir un exe (presque) fonctionnel il suffit de récupérer avec lordpe l'exe du jeux une fois déchiffré en mémoire avant qu'il ne soit loadé, on à alors un joli .exe qu'il suffit de patcher rapidement pour enlever un CRC sur l'exe en dur.
Voila voila :D
J'espère avoir été relativement clair et montré que l'activation par internet est loin d'être la panacée en matière de protection contre le piratage si elle est utilisée seule, si vous avez des questions n'hésitez pas
Commentaires
Cool, du nouveau sur ton blog
Ca te fais quel âge baboon ?
Content de voir que tout mes lecteurs ne sont pas morts
Je vais essayer de faire une série de post comme dit plus haut me manque juste un peu de motivation
Sinon j'ai un an de plus par rapport à l'année dernière
Tu avais quel âge l'année dernière ?
Quelle question ...
Un an de plus qu'il y a deux ans bien sur :D
Et ça te fais 99 ans de plus par rapport 1910 ?
Tu as tout compris
Et non je n'ai pas de dreads ...
[edit] pour ceux qui n'ont pas acces aux emails, Ano avait mis comme adresse : tu_as_des_dreads_baboon@point_dinterrogation.com
Bref j'abandonne
Merci en tout cas pour tes articles