------------------------------------------------------------------------------------------- III. Crypto : Penelope par Androgyne ------------------------------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++ +++ Fichier Joint : penelope.zip +++ ++++++++++++++++++++++++++++++++++++ [ Sommaire ] Introduction Généralités - FAQ Comment ça marche ? Pourquoi l'avoir fait ? Pourquoi ce nom ? Quel est le cryptage utilisé ? La base de registre Hiérarchie HKEY_LOCAL_MACHINE\Software Application Les autres points de Penelope Boîtes de dialogue Le générateur de nombre pseudo-aléatoire Le file mapping Comment avoir de l'ordre en asm... Conclusion [ Introduction ] Penelope est un programme de cryptage... Mais ce n'est pas la fonction de cryptage qui est intéressante ici, j'ai utilisé un simple cryptage xor sur 32 bits. Ce qui va faire l'objet de cette article, c'est toutes les choses que j'ai apprises en programmant Penelope. C'est un article un peu fourre tout mais il est fondamentalement lié à Penelope. [ Généralités - FAQ ] *** Comment ça marche ? *** J'ai essayé de faire une interface la plus simple possible. Je crois qu'on ne peut pas faire moins... L'interface se présente avec une boîte de dialogue. Là, vous pouvez entrer le nom du fichier que vous voulez crypter (il doit être dans le même répertoire que Penelope), et vous appuyez sur 'Cipher'. Penelope génère alors un fichier ayant pour nom nomentierdufichier.xor, qui est la forme cryptée. Pour décrypter le fichier, on fait la même chose en appuyant sur 'Decipher'. Si le nom du fichier termine par .xor, Penelope va générer le nouveau fichier en enlevant l'extension xor, sinon, une boîte de dialogue apparaît pour vous demander le nom du fichier une fois décrypté. Il y a quelques petits plus amusants : vous pouvez associer l'extension xor avec Penelope (dans 'Options'), et alors, dès que vous cliquez sur un fichier ayant l'extension xor, Penelope est lancée automatiquement et initialise le nom du fichier. Vous pouvez également faire un fichier de configuration qui enregistrera des données très précieuses (voir plus loin)... *** Pourquoi l'avoir fait ? *** J'en sais rien... Pour m'amuser. Certains vont dire "Pourquoi se faire chier à le faire en asm alors qu'il serait plus facile de le faire en C++ ou en Delphi ?"... Oui, c'est vrai mais je préfère l'asm et c'est mon choix . Tout met plus de temps à faire en asm mais je trouve ça tellement plus excitant... *** Pourquoi ce nom ? *** Pourquoi pas ce nom... Je trouve que donner des prénoms aux programmes les rend un peu plus vivants. Alors, cette fois, c'est Penelope, une autre fois, ce sera un autre prénom :) Si vous avez des préférences, écrivez moi (prénom féminin uniquement). *** Quel est le cryptage utilisé ? *** C'est un simple cryptage xor (agrémenté de quelques autres instructions du style rol/ror) avec plusieurs clés, toutes 32 bits. Ce n'est pas très secure mais ce n'est pas le but (un jour si j'ai le temps, j'implémenterai un codage RSA). En fait, il y a trois clés : la clé du programme, c'est une clé fixe dans le programme ; la clé de l'utilisateur, elle est tirée au hasard à la première utilisation de Penelope ; la clé du fichier, elle est tirée au hasard pour chaque fichier. Comment ces clés sont-elles utilisées ? L'idée, c'est qu'on ne va pas mettre la clé du fichier directement avec le fichier donc, on la crypte avec la clé de l'utilisateur et on la met avec le fichier... Voilà pourquoi la clé de l'utilisateur est choisie une fois pour toute au début. Et voilà à quoi sert le fichier de configuration... Elle sert à stocker la clé de l'utilisateur. Mais là encore, on ne la stocke pas telle quel, on la crypte avec la clé du programme qui elle est fixe... Vous me direz "Si on connait la clé du programme, on peut avoir la clé de l'utilisateur et alors, on décrypte tous les fichiers...". Bien sûr mais vous ai-je dit que ce programme n'était pas très puissant pour le cryptage ? [ La base de registre ] J'ai abondamment utilisé la base de registre dans ce programme, ce qui m'a permis d'en apprendre un peu plus sur cet élément Windowsien un peu obscur pour le commun des utilisateurs moyens... Un peu d'histoire tout d'abord : au début, à l'ère préhistorique du DOS, pour pouvoir garder des configurations d'utilisateurs, on avait des fichiers de configuration (les fichiers INI). Remarquez que ces fichiers existent toujours et que l'on peut toujours s'en servir (voir article sur les INI dans hccc#6 [http://www.multimania.com/hccc]). Mais l'arrivée de Windows 3.1 a marqué l'arrivée de la base de registre (registry en anglais) pour remplacer les fichiers INI. Au départ, on ne pouvait pas stocker beaucoup de choses dans le registre, uniquement des chaînes de caractères, c'était un peu la misère... Puis avec les Win9x, on a pu faire plus de choses avec le registre et son utilisation s'est généralisée. La documentation de Windows incite d'ailleurs à abandonner l'utilisation des INI pour lui préférer celle du registre. *** Hiérarchie *** Le registre marche avec un système de clé et une hiérarchie en répertoire... Vous pouvez avoir un aperçu de cette hiérarchie en tapant regedit dans 'Executer...'. regedit est l'éditeur de registre, vous pouvez modifier le registre directement à partir de là. Mais attention !!! Des modifications à tout va peuvent causer des dommages irréversibles sur ce pauvre Windows qui a déjà bien du mal à fonctionner tout seul :) . Dans cette hiérarchie, il y a principalement 4 clés à la racine : - HKEY_CLASS_ROOT : c'est un raccourci pour la clé HKEY_LOCAL_MACHINE\Software\Classes, on va y revenir longuement dans la suite... - HKEY_CURRENT_USER : c'est un raccourci pour HKEY_USERS\... - HKEY_LOCAL_MACHINE : cette clé contient pleins d'informations sur la machine sur laquelle est installé Windows. On va s'intéresser plus précisément à la sous clé Software dans la suite... - HKEY_USERS : c'est la clé où sont stocké les configurations de tous les utilisateurs de la machine. Ces 4 clés sont ouvertes en permanence. On peut donc y accéder quand on veut. Pour pouvoir accéder à des sous clés, il faut ouvrir ces sous clés (fonction RegOpenKey). Chaque clé peut contenir elle même une valeur (appelée default dans regedit) ou contenir des autres valeurs associées à des noms plus précis. Je me suis particulièrement intéressée à la sous clé Software de HKEY_LOCAL_MACHINE... *** HKEY_LOCAL_MACHINE\Software *** Là, on a deux types de sous clés. Tout d'abord, il y a les sous clés créé par la plupart des logiciels installés sur votre PC. Généralement, la sous clé contient le nom de la société qui produit le logiciel (Exemples : Adobe, Netscape, Microsoft, Logitech...), et cette sous clé contient des sous clés avec le nom des logiciels de cette société (Exemple pour Adobe : Acrobat Reader, Photoshop). C'est ici que sont stockés les numéros de version, la configuration, etc... des logiciels de votre PC. Vous pouvez fouillez un peu la dedans, c'est parfois très instructif :) Le deuxième type de clé est la clé Classes. On peut y accéder directement dès la racine par HKEY_CLASS_ROOT. Ici sont définis les types et classes de documents existant sur votre PC. Là encore, il y a deux types de sous clé : - les clés extensions : elles se trouvent toutes au début et ont la forme '.ext'. Ces clés définissent à quelle classe appartiennent les fichiers portant l'extension 'ext' (Exemple : '.zip' appartient à la classe Winzip, '.txt' à la classe txtfile) - les clés classes : Ces clés servent à définir les fichiers de cette classe. La valeur de ces clés est une description du type du fichier (Exemple pour txtfile : 'Document texte'), c'est l'information qu'on peut voir en faisant 'Propriétés' en face de type. Chaque clé classe contient généralement une sous clé 'Shell' qui donne des informations sur l'application qui interprète les fichiers de cette classe ; 'Shell' contient généralement deux sous clés 'open' et 'print' qui ont la même structure, une sous clé 'command' qui a pour valeur la ligne de commande à envoyer quand on clique sur ce type de fichier (%1 remplace comme en batch le premier argument, c'est à dire ici le fichier sur lequel on a cliqué). Exemple : "C:\WINDOWS\NOTEPAD.EXE %1". La clé classe à parfois une sous clé 'DefaultIcon' qui contient un chemin jusqu'à l'icône utilisée pour ce type de document. Donc, résumons : HKEY_LOCAL_MACHINE\Software + CompanyName1 | + ProductName1 | + ProductName2 + CompanyName2 | + ProductName1 + RtC | + Penelope | | [Owner Key] -> xxxxxxxx | . [Rand Seed 1] -> xxxxxxxx . [Rand Seed 2] -> xxxxxxxx . | + Classes | + .txt -> txtfile | + .xor -> xorfile | + | . | . | + txtfile -> "Document Texte" | | + shell | | | + open | | | | + command -> "C:\WINDOWS\NOTEPAD.EXE %1" | | | + print | | | + command -> "C:\LINUX\NOTEPAD.EXE /p %1" | | + DefaultIcon -> "......" | + xorfile -> "Fichier XOR" | | + shell | | | + open | | | + command -> "....\penelope.exe %1" | | + DefaultIcon -> "....\penelope.exe,1" . . etc... Je n'ai pas mis .xor et xorfile par hasard car c'est de cette façon que je déclare Penelope en tant qu'interpréteur de fichiers xor. J'en profite pour déclarer l'icône associée au type de fichier xor (vous avez vu, je me suis éclatée sur les icônes). J'ajoute également la valeur AlwaysShowExt dans la clé xorfile pour toujours voir l'extension même quand on a coché l'option 'Cacher les extensions des fichiers dont le type est connu', ce qui a valu à un célèbre ver de se propager avec amour sur les 3/4 de la planète :) *** Application *** Pour manipuler des clés et des sous clés dans le registre, on utilise des fonctions de l'API Windows. Toutes ces fonctions commencent par Reg. Allez voir dans les sources de Penelope pour voir plus précisément un exemple d'application. Les descriptions de ces fonctions sont dans tous les win32.hlp qui se respectent. Vous pourrez y trouver aussi des informations complémentaires sur le registre. On m'a également parlé, il y a peu, d'un virus très astucieux qui utilisait le registre. Il se copiait dans le répertoire Recycled (c'est la corbeille) et se déclarait en tant qu'interpréteur de fichiers exécutables... Conséquence : si on l'efface, impossible d'exécuter quoi que ce soit. Il en profitait pour infecter tous les exécutables sans aucun effort de recherche... Conclusion : Le registre de Windows est une idée qui pour une fois n'est pas dénuée de bon sens. Mais le registre est à mon avis un point faible de Windows. Rien n'empêche quelqu'un de tout supprimer dans le registre et alors, bonjour les dégâts... [ Les autres points de Penelope ] *** Boîtes de dialogue *** Pour faire des boîtes de dialogues, c'est tout simple. Je vous renvoie ici à l'article que j'ai écrit dans hccc#6 (voir adresse plus haut) pour avoir une démarche détaillée. *** Le générateur de nombre pseudo-aléatoire *** Là encore, je vous renvoie à l'article 'GNPA' paru dans RtCmag#3 et reparu dans 'RtCmag at the end of the universe'. Je veux juste dire que j'ai mis une version totalement 32 bits utilisant une récurrence linéaire d'ordre 2 congruentielle. Je stocke les valeurs de rand_seed1 et rand_seed2 dans le registre dans la clé 'HKEY_LOCAL_MACHINE\Software\RtC\Penelope'. *** Le file mapping *** Je n'ai rien à dire là non plus, je vous renvoie à l'article de Doxtor L. 'Infection Win32 Part 2 : Manipulation de fichier en asm' qui est très bien fait et qui est paru dans 'RtCmag at the end of the universe'. Dans le cas de Penelope, je rajoute au fichier crypté un entête contenant une signature ('XOR',0) et la clé du fichier crypté avec la clé de l'utilisateur. La signature permet de savoir si oui ou non on a à faire à un fichier crypté avec Penelope, c'est un procédé classique (Exemple : 'PK' pour les zip, 'PE' pour les executables Win32, ...). [ Comment avoir de l'ordre en asm... ] C'est un point que j'aimerais aborder parce que je ne l'ai vu abordé nul part et il me semble important. Il est en effet très facile d'avoir un code qui ne ressemble à rien en asm. Cette particularité vient du fait qu'il n'existe aucun éditeur de texte dédié à l'assembleur contrairement à tous les macrolangages. Pour ma part, j'utilise UltraEdit 8.00 que je trouve excellent à tout point de vue : coloration syntaxique très complète, transformation Tabulations en Espace, indentation automatique. Je le conseille à tout le monde... La deuxième différence principale est la compilation. Avec un macrolangage, on a un joli raccourci clavier sur l'éditeur et voilà ! En assembleur, on y va à la main. Heureusement, on peut automatiser la compilation un minimum en utilisant des batch de compilation... Mais il ne faut pas accuser le manque de matériel. Savoir présenter un code en asm est beaucoup plus important que dans tout autre langage. Et quand je dis présenter, je parle aussi bien des sauts de lignes opportuns que du nommage des variables, constantes... Un code mal présenté n'est pas agréable à lire. Pour ma part, j'essaie de respecter des règles qui me sont propres. J'espère que mes codes sont lisibles par le plus grand nombre. J'y accorde beaucoup d'importance alors dites moi si des choses ne vous paraissent pas claires. Pour finir, je voudrais lancer un appel aux extrémistes des debugger. Je voudrais insister sur le fait que le meilleur debugger, c'est votre cerveau. Il ne faut pas devenir dépendant des debuggers, souvent, il suffit juste de réfléchir un peu, de regarder son code droit dans les yeux et l'erreur apparaît ! Parfois, c'est un peu plus compliqué, elle est devant vous et vous ne la voyez pas... Ça m'est déjà arrivé, une pauvre erreur qui m'a résisté pendant un mois et demi. Quand c'est comme ça, laissez tombez, passez à autre chose, et revenez sur votre code plus tard, avec des idées neuves, ça aide ; vous n'avez personne derrière vous avec une kalashnikov pour vous imposer des délais alors prenez votre temps ; à force, vous n'aurez même plus besoin de débugguer vos codes. [ Conclusion ] Je ne vous force pas à utiliser ce logiciel (je vous conseille même fortement de ne pas l'utiliser :) ). Mais si vous avez le temps de l'essayer au moins, et de me dire les bugs qu'il comporte, ce serait cool. J'en ai déjà repéré quelques uns, mais je suis sûre qu'il y en a d'autres... Merci d'avance. Sinon, si vous voulez effacer toute présence de Penelope dans la base de registre après l'avoir essayé, vous pouvez utiliser le programme 'Clean' qui est spécialement fait pour ça. Voilà, c'est fini ! EOF