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) :

  1. var RtlSubAuthoritySid
  2. var WinHttpCrackUrl
  3. var sid
  4. var url
  5.  
  6. eob breakp
  7.  
  8. gpa "RtlSubAuthoritySid" , "ntdll.dll"
  9. mov RtlSubAuthoritySid , $RESULT
  10.  
  11. gpa "WinHttpCrackUrl" , "winhttp.dll"
  12. mov WinHttpCrackUrl , $RESULT
  13.  
  14. bp RtlSubAuthoritySid
  15. bp WinHttpCrackUrl
  16. bp ADDRINSTALLDATE
  17.  
  18. run
  19. ret
  20.  
  21. breakp:
  22. cmp eip , RtlSubAuthoritySid
  23. je ok
  24. cmp eip , WinHttpCrackUrl
  25. je WinHttpCrackUrlLOL
  26. cmp eip , ADDRINSTALLDATE
  27. je lolilol
  28. cob
  29. bc ADDRINSTALLDATE
  30. bc RtlSubAuthoritySid
  31. bc WinHttpCrackUrl
  32.  
  33. ret
  34. ok:
  35. mov sid , esp
  36. add sid , 4
  37. mov sid , [sid]
  38. add sid , 8
  39. mov [sid] , ID1 // vous croyez quand meme pas que je vais laisser l'ID de mon beauf ;)
  40. add sid , 4
  41. mov [sid] , ID2
  42. add sid , 4
  43. mov [sid] , ID3
  44. add sid , 4
  45. mov [sid] , ID4
  46. eob breakp
  47. run
  48.  
  49. WinHttpCrackUrlLOL:
  50. mov url , esp
  51. add url , 4
  52. mov url , [url]
  53. add url , 8
  54. mov [url] , 004E004E
  55. add url , 4
  56. mov [url] , 004E004E
  57. add url , 4
  58. mov [url] , 004E004E
  59. add url , 4
  60. mov [url] , 004E004E
  61. add url , 4
  62. mov [url] , 004E004E
  63. add url , 4
  64. mov [url] , 004E004E
  65. eob breakp
  66. run
  67.  
  68. lolilol:
  69. // modification de la date d'installation renvoyée par RegQueryValueExW
  70. mov ecx , 1234567
  71. mov url , esp
  72. add url , 28
  73. mov [url] , ecx
  74. eob breakp
  75. 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 :

  1. 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é.
  2. 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
  3. 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 !)
  4. préparation au lancement : l'exe est loadé en mémoire, dans une page allouée et ses imports sont résolus
  5. 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 ;)