Commencer à cracker

    Il y a plusieurs logiciels que vous pouvez utiliser pour cracker. Ils se complètent et ce serait bien si vous les aviez tous.

Visual C++ 4-6: Peu de personnes le savent, mais c'est l'un des meilleurs logiciels pour cracker. Même Micro$oft peut parfois faire de très bons programmes. Et comme la plupart des programmes ont été faits avec ce langage vous pourrez même avoir les sources de certaines parties des programmes. Il peut être utilisé pour cracker 90% des programmes 32 bits. Mais il ne peut pas débogguer ni les programmes 16 bits ni les programmes qui installent les fichiers système (comme les programmes protégés par les dongles)

Soft ICE : C'est le débogueur le plus puissant pour Windows 3.11, 95 et 98. Il peut être utilisé dans les cas où Visual C++ échoue. Il peut même aller jusqu'à déboguer les interruptions. Cependant il est beaucoup moins fiable, plus difficile à utiliser. Chez moi il ne fonctionne pas. C'est pourquoi je ne pourrai pas expliquer sont fonctionnement.

Win32 Dasm : C'est un désassembleur des programmes 32 bits. Il a tellement évolué qu'il est devenu un débogueur très puissant et convivial. Vous pouvez l'utiliser pour avoir un aperçu global des programmes, des routines, pour faire des recherches dans le code assembleur du programme ou pour extraire certaines routines (par exemple les routines d'encodage des clés afin de les analyser. Vous pouvez aussi l'utiliser si vous n'avez pas Visual C++. Chez moi il a quelques problèmes d'affichage, mais il devrait bien marcher chez vous.

    Téléchargez la version complète à l'adresse: ftp://ftp.accesscom.com/pub/users/m/mav/warez/w32dsm89.zip

Hex Workshop : Un éditeur hexadécimal plutôt bien. Mais la plupart des éditeurs hexadécimaux peuvent convenir.

Téléchargez le à l'adresse: http://www.bpsoft.com/downloads/index.html#LATEST_32

Spy++ : Petit utilitaire fourni avec Visual C++ ou Borland C. Il permet d'espionner les fenêtres et les messages transmis à ces fenêtres par Windows.

Ce que vous devez savoir

    Pour réussir à faire quelque chose d'intéressant vous devez avoir un minimum de connaissances:

  1. Bien connaître le langage C:


  2.     Presque tous les programmes sont faits en langage C. Pour déplomber il faut souvent essayer de deviner comment le programmeur a fait sa protection pour essayer de la désactiver. Vous devez donc être capable de faire les petits programmes qui saisissent un code, qui le contrôlent et qui affichent un message.

  3. Avoir quelques connaissances en assembleur:


  4.    Vous ne pouvez voir que le listing désassemblé des programmes. Et les commandes comme mov dword ptr [ebp-4],0 ne doivent pas vous faire peur. Ne soyez pas effrayés, il n'y a pas besoin d'être un as de programmation assembleur. Il suffit de connaître les bases.

  5. Savoir programmer sous Windows:


  6.    Souvent il faut espionner les boites de dialogue ou le contenu des fenêtres. Pour faire ça il faut savoir au minimum qu'il existe une fonction WinMain par classe de fenêtre qui traite les messages transmis par Windows etc. Si vous avez fait quelques programmes avec Visual Basic vous pourrez apprendre beaucoup plus facilement la programmation en C sous Windows.
       Il est également souhaitable de savoir utiliser les MFC car il y a de plus en plus de programmes qui les utilisent. Mais c'est

  7. facultatif.

    Tout d'abord il faut réussir à voir le code du programme et pouvoir le déboguer. Avec Visual C++ 5 (Visual C++ 4 ou 6 sont un peu différents mais les étapes sont les mêmes) vous devez passer par les étapes suivantes:

  1. Créer un nouveau projet:
       

  2. Cliquer File, New.
        Dans l'onglet Projects sélectionner
    Win 32 Application,
        Donner un nom quelconque au projet puis valider.

  3. Indiquer où se trouve le fichier exécutable à déplomber:
       

  4. Cliquer Project, Settings.
        Sélectionner l'onglet Debug de la boite des paramètres du projet.
        Indiquer le chemin de l'exécutable à déplomber dans la zone "Executable for debug session", puis valider les paramètres.

  5. Commencer le déboggage:

  6.  Sélectionner le menu Build, Start debug, Step Into (ou la touche F11).
        Si Visual C++ vous indique que votre fichier ne contient pas d'informations de déboggage désactivez ce message et continuez quand           même. Vous pouvez avoir plusieurs autres messages. Ignorez-les, désactivez-les, mais continuez coûte que coûte
    .

  7. Déboguer:


  8.     C'est magique! Maintenant vous avez le code désassemblé du programme et vous pouvez en faire ce que vous voulez. Les commandes les plus importantes sont:
        F10, Step Over: exécuter un pas sans entrer dans les CALL
        F11, Step Into: exécuter un pas en entrant dans les CALL
        F5, Go: exécuter le programme sans l'arrêter
        Set Next Statement (bouton droit de la souris sur l'instruction): Forcer le programme à s'exécuter à partir de la position cliquée. Par exemple pour contourner le test de la validité du code.
        Vous pouvez aussi afficher les fenêtres des registres, de la mémoire, créer les variables à surveiller.

  9. Les méthodes pour cracker

    Sous Windows c'est assez facile. Il suffit de connaître un peu d'assembleur et le langage C. Les programme les plus faciles à cracker sont fait en langage C pour Windows 95. En général ils vérifient un code de validation dans un fichier ou dans la base des registres ou si la date est valide.

Maintenant il ne reste plus qu'à déboguer le sous-programme et à remplacer quelques instructions par celles qui nous plaisent le plus (c'est à dire celles qui   Et voici quelques unes des méthodes que j'ai réussi à appliquer avec succès (de la plus simple à la plus compliquée):

  1. Si le programme stocke le nombre de lancement restants dans un fichier:


  2.     Vous pouvez créer une copie de sauvegarde de ce fichier et remplacer le fichier original par le fichier sauvegardé avant chaque lancement du programme (grâce à un petit programme). Le nombre de lancement restants ne diminuera jamais. Cette méthode marche avec la version lite d'Omnipage.

  3. Si le programme stocke la date d'installation dans un fichier .ini ou dans la base de registres:


  4.     Vous pouvez essayer de supprimer la date d'installation. Souvent les programmes la recréent automatiquement et vous disposerez de nouveau de toute la période d'utilisation. Si ça ne marche pas vous pouvez créer un petit programme que remplace la date par la date système d'aujourd'hui. Cette méthode marche avec Visual Planning (avec quelques adaptations).

  5. Si le programme vérifie la date pendant son lancement:


  6.     Vous pouvez créer un programme qui modifie la date au moment du lancement pendant quelques secondes jusqu'à l'apparition de la fenêtre du programme (grâce à la fonction FindWindow) puis la remet après le lancement du programme. Cette méthode marche avec LFN.

  7. Si le programme affiche les boites de dialogue embêtantes:


  8.     Vous pouvez faire un programme qui surveille les fenêtres (grâce à FindWindow) et ferme immédiatement la fenêtre indésirable (grâce à SendMessage). Pour savoir quelle fenêtre doit être surveillée et quel message doit être envoyé vous pouvez utiliser Spy++. Cette méthode pourrait marcher avec Paint Shop Pro (mais pas parfaitement).

  9. Le programme demande un code d'enregistrement et affiche une boite de dialogue standard indiquant que le code n'est pas valide:


  10.     La boite de dialogue s'affiche généralement juste après le test du code d'enregistrement. Vous pouvez faire un Break au moment où la boite de dialogue est affichée. Comme Visual C++ ne sait pas déboguer le code système le programme s'arrêtera juste après le click sur OK à l'instruction qui suit le "call [boite de dialogue]". Si vous regardez quelques lignes devant ce call vous verrez sûrement un "call [vérification du code saisi]" suivi de l'instruction jne (ou je, ja, jbe, jb, jl). Le saut se fait (ou ne se fait pas) si le code est valide. Vous pouvez mettre un point d'arrêt à cette adresse et regarder ce qui se passe en cas de saisie d'un code non valide. Saisissez de nouveau un code et essayez d'aller à l'adresse qui ne serait pas exécutée normalement (avec Set Next Statement). Si vous voyez un message du genre "Merci pour votre enregistrement ;-)" vous avez trouvé le bon endroit. Maintenant vous pouvez ouvrir un éditeur Hexa, rechercher l'emplacement de l'instruction trouvée et remplacer pas son contraire. Le code sera toujours accepté.
        Cette méthode (enfin presque) marche avec WebExpert

  11. Le programme affiche un message à chaque démarrage:


  12.     Vous pouvez l'exécuter pas-à-pas jusqu'à trouver le call qui affiche le message. Pour trouver plus vite vous pouvez commencer à déboguer les grandes étapes, sans entrer dans les call (touche F10) jusqu'à l'apparition du message. Repérez le call qui a conduit à l'affichage du message et mettez un point d'arrêt à cet endroit. Relancez le programme et exécutez-le jusqu'au call repéré. Entrez dans ce call (touche F11) puis continuez jusqu'au nouvel affichage du message. Répétez la même opération jusqu'à trouver le dernier call conduisant à l'affichage du message.
        Exécutez le programme jusqu'au dernier call trouvé. Essayez de voir ce qui se passe si ce call n'est pas appelé: faites Set Next Statement pour positionner le pointeur d'instruction à l'adresse qui suit le call (faites attention pour que les paramètres passés au sous-programme ne restent pas sur la pile lorsqu'il n'est pas appelé. Ca conduirait  au plantage).
        Si tout se passe bien, ça ne plante pas et le message n'est pas affiché, vous pouvez désactiver le call trouvé ainsi que tous ses paramètres: Ouvrez l'éditeur Hexa. Retrouvez les instructions repérées. Remplacez-les par autant de NOP (aucune opération) que nécessaire (code de NOP 0x90).
        Une variante serait de remplacer la sous-routine d'affichage du message par RET. Il faut quand même ne pas oublier de dépiler les paramètres.
        Cette méthode a marché avec AX Disk Catalog 2.1

  13. Aucune des méthodes précédentes n'a abouti:


  14.    
    Il y a pas mal d'autres méthodes (presque une par logiciel). Par exemple vous pouvez surveiller WinMain de la fenêtre de validation du code. Mais ça devient vraiment compliqué. Peut être je décrirai tout ça une autre fois.

  15. Quelques astuces:
        Pour reconnaître le début d'une fonction vous pouvez chercher les instructions du genre:
    push ebp
    push edx
    add esp,0FFFFFEF8h
    (plusieurs push, manipulation d'esp, ebp).


  16. Le début d'une fonction est souvent précédé de ret de la fonction précédente.

        Si vous voyez beaucoup d'instructions identiques comme:

  17. add byte ptr [eax],al
    add byte ptr [eax],al

  18. C'est plutôt une zone des données.

        Vous pouvez définir les espions sur tous les registres pour voir les chaînes de caractères sur lesquelles ils pointent. Par exemple: (char*)eax
    Ainsi vous pourrez voir facilement les messages du genre "Code incorrect" pendant l'exécution. Ca vous aidera à faire les bonnes déductions.

Trouver un code personnalisé pour Web Expert 3

    Web Expert 3 est un excellent éditeur html.


    Il devra plaire à ceux qui veulent éditer les pages en mode textuel (avec les tags) pour profiter au mieux de la puissance d'html. Il contient plein d'applets Java prêts à l'utilisation, des Java Scripts etc. En plus il contient la documentation HTML, JavaScript et CGI.

   Si vous n'avez pas encore Web Expert 3 téléchargez le à l'adresse: http://www.visic.com/webexpert/download.html.

    Sur la page Cracks & Programmes Crackés vous trouverez quelques codes qui fonctionnent avec Web Expert 3 mais si vous souhaitez avoir un code d'enregistrement à votre nom lisez la suite. En plus c'est un excellent moyen d'apprendre à cracker les logiciels.

 

    Au démarrage Web Expert appelle un routine qui teste si le code (lu dans la base de registre) est valide (la 1ère idée qui vient en tête c'est de saboter la routie de test du code). S'il n'est pas valide, une boite de dialogue est affichée. Lorsqu'on clique sur le bouton enregistrer, la boite de dialogue d'enregistrement est affichée.
    Le click sur le bouton OK de la boite de dialogue d'enregistrement active une routine qui génère (on peut modifier la routine de génération du code) le code d'enregistrement à partir du nom (c'est à ce moment qu'on peut trouver un numéro de série personnel). Ensuite le code généré est comparé au code saisi. Si le code saisi n'est pas le même, un message d'erreur est affiché.

 

  1. Commencez le déboggage:
    Normalement vous devez voir la première instruction: push ebp à l'adresse 00626A28 (Les adresses sont valides pour la version 3.0 beta 1)

  2. A un certain moment Web Expert génère un code pour le comparer. Presque toutes les opérations doivent passer par le registre EAX y compris ce code. Définissez un espion de EAX:
    Affichez la fenêtre Watch.
    Saisissez la variable à espionner:
    (char*)eax

  3. Lancez l'exécution du programme (touche F5).
    Une fenêtre d'insultes ;-) doit apparaître

  4. Cliquez sur le bouton Enregistrer pour afficher la boite de dialogue d'enregistrement.

  5. Tapez votre nom et un code quelconque dans cette boite de dialogue. Cliquez OK.

  6. Encore une insulte s'affiche: "Mauvais numéro d'enregistrement". Mais il ce programme va être puni pour ses insultes car cette boite de dialogue est le meilleur point de départ pour  le déplombage.

  7. Cliquez sur le menu Debug, Break. Alors ? Rien ne se passe. C'est normal. La boite de dialogue qui est affichée est une boite de dialogue système. Or Visual C++ ne sait pas déboguer le système. Le programme ne s'arrêtera que lorsque la boite de dialogue sera fermée. En plus il s'arrêtera sûrement à quelques instructions du test du code d'enregistrement.

  8. Cliquez sur OK de la boite de dialogue "Mauvais numéro d'enregistrement". Le programme s'arrête. Vous devez voir

  9. mov dword ptr [ebp-8],eax
    et juste avant call 00407A40
    (celui qui affiche la boite de dialogue)( les adresses peuvent être différentes)

  10. Maintenant il faut avoir un peu de flair et un peu de chance. Affichez la fenêtre Call Stack. Vous voyez tous les appels:
    =>WEXPERT3! 00452e63()

         WEXPERT3! 0050ab6e()
         WEXPERT3! 004370d0()
         WEXPERT3! 0042e5c9()


  11. Ces appels signifient qu'il y a 4 call imbriqués. On peut se douter que la routine dans laquelle on se trouve (WEXPERT3! 00452e63()) est une routine d'affichage du message "Mauvais numéro ...". Donc cette boite de dialogue a été appelée par le 2ème call (WEXPERT3! 0050ab6e()). Ca veut dire que test de la validité a été fait un peu avant l'adresse WEXPERT3! 0050ab6e()(si vous n'avez pas tout a fait la même adresse utilisez la vôtre).

  12. Double cliquez sur le 2ème call (WEXPERT3! 0050ab6e()) pour trouver l'adresse qui suit l'appel de la routine qui affiche le message d'erreur. C'est dans cette routine que se trouve le test de la validité du code.

  13. Recherchez où se trouve le début de la routine de test. Vous pouvez le repérer grâce à un grand nombre (de 4 à 10) de push ECX; push ECX; push EBX .... Normalement il doit se trouver environ 80 lignes plus haut. Mettez un point d'arrêt à cet endroit.

  14. Laissez le programme s'exécuter (touche F5 - Go)

  15. Saisissez de nouveau votre nom et un numéro quelconque. Puis cliquez sur OK.
    Normalement le programme doit s'arrêter juste au moment du click. Si ce n'est pas le cas relisez tout et réessayez en faisant un peu plus attention.

  16. Maintenant vous pouvez exécuter pas à pas toute la routine. Comme à un moment elle fait une comparaison entre le code saisi et le code généré vous aurez l'occasion de voir le code d'enregistrement.

  17. Faites une trentaine de pas avec la touche F10. Vous verrez que l'espion (char*)eax va changer et à un certain moment il affichera une valeur du genre 0x01d654c4 "G9KN-LEQH-TSND-54B1"
    C'est votre code personnel !!! Notez le.

  18. Relancez Web Expert.

  19. Enregistrez-vous avec votre nom et le code que vous avez trouve. Il sera accepté et vous aurez une version complète.

  20. C'est tout !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 aniligne.gif (4535 octets)

Décrypter les fichiers Word 97 et Word 95

    Vous avez déjà vu les fichiers Word soigneusement protégés par des gens malhonnêtes qui veulent toujours cacher quelque chose (pas comme nous qui ne cachons rien ;-) ). Ca ne vous donne pas envie de voir ce qui est écrit dedans ?

    Pour l'instant je vous donne seulement une méthode pour décrypter les fichiers à la main. Mais dans quelques semaines (ou mois :-(   ) je ferai un programme qui fera automatiquement tout ce que j'ai décrit. Il faut juste comprendre le format des fichiers de Word 97 (la description occupe 100 pages).

    J'ai essayé de trouver un moyen pour le faire et j'ai trouvé pas mal de choses intéressantes.

    Lorsque vous protégez un fichier par un mot de passe, Word génère un code de 32 bits correspondant au mot de passe que vous avez saisi. Ce code est stocké dans le fichier protégé. Il sert à tester si le mot de passe que vous allez saisir est valide.
    Simultanément un deuxième code de 16 octets est généré à partir du même mot de passe. Ce code sert à crypter les données.
    Les données sont cryptées en faisant un "ou exclusif" (XOR) entre le code et les données. Cette opération est répétée par block de 16 octets autant de fois que nécessaire pour encrypter tout le fichier.
    Les données cryptées ne peuvent pas être affichées par les éditeurs de textes. Vous devez utiliser un éditeur hex
adécimal pour les visualiser.

    Je suppose que les explications ci-dessus vous ont inspiré quelques mauvaises idées ;-) . Le moyen le plus rapide serait de trouver le 2ème code de 16 octets puis de décrypter tout le fichier avec ce code. Or le décryptage des données codées par XOR est très simple. Il suffit de répéter la même opération entre les données cryptées et le code. Vous pouvez faire cette opération avec la calculatrice de Windows.
    La formule du cryptage est:     crypté=donnée XOR code
    La formule du décryptage est:
donnée=crypté XOR code
Par exemple si la lettre 'a' (ascii = 41h en hexadécimal) a été cryptée avec le code 58 h vous obtiendrez le caractère crypté: 41h XOR 58h = 19h. Pour le décrypter il faut faire 19h XOR 58h = 41h. Or 41h c'est le code ascii de la lettre 'a' .

    Maintenant vous savez comment on peut décrypter les données lorsqu'on a le code. Mais il faut encore trouver ce code. Ce n'est pas très compliqué non plus. Si vous essayez plusieurs codes différents vous verrez que seuls quelques-uns conduisent aux caractères valides. Par exemple si, par erreur, vous utilisez le code B2h pour décrypter le caractère crypté 19h de l'exemple précédent vous obtiendrez : 19h XOR B2h = ABh. Le caractère obtenu est a pour code ascii ABh (171 en décimal). C'est '½'. Vous pouvez facilement vous douter que ce caractère ne peut pas se trouver dans le texte et éliminer le code que vous avez utilisé. De cette façon vous pouvez retrouver le code exact. Vous pouvez aussi utiliser quelques particularités statistiques. Par exemple tous les textes contiennent beaucoup d'espaces. Si vous tombez sur un code qui produit beaucoup d'espaces vous avez de fortes chances qu'il soit bon.

    Pour repérer où se trouvent les données cryptées vous devez avoir pas mal de flair. Généralement elles sont composées d'un block de caractères incompréhensibles. Ce block se trouve après une longue suite de caractères 00 (nuls). Ma version de Word 97 place les données à partir de l'offset 600h à partir du début de fichier (mais ça peut varier fortement).


    Comme le code fait 16 octets, il est répété tous les 16 caractères. Faites 16 colonnes pour vous faciliter le décryptage. Dans chaque colonne notez les caractères cryptés, le code que vous testez pour cette colonne et les caractères décryptés.

Votre éditeur hexa affiche les lignes suivantes (quelque part au milieu du fichier):
00000600 0F 52 AF C6 9E 11 EA B7 E6 50 DB 26 09 30 C4 F9
00000610 2C 1D B6 D0 CD 50 FA BB FF 18 D6 AA 11 A3 C4 D8
00000620 36 4F BE 95 CD 1F F5 B5 F2 15 CA BC 06 BD 81 E1


    J'ai fait cette partie il y a assez longtemps. Elle n'est plus tout à fait à jour. Mais vous pouvez trouver quelques informations utiles. C'est pourquoi je l'ai laissée ici.

   Le code qui indique si le fichier a été crypté est en fait un nombre représentant le système de cryptage. Il vaut 12 (en hexa) si le fichier n'a pas été crypté ou 0x93 si le fichier a été crypté avec un système de codage standard (version française de Word 97). Si vous créez un nouveau fichier et vous le protégez par un mot de passe vous pourrez retrouver ce code à l'adresse 0x20B à partir de début de fichier. Mais s'il ne se trouve pas à cet endroit vous pouvez faire une recherche de la chaîne 0x00000093.
    Un fois que vous avez repéré le code du cryptage vous pourrez retrouver le mot de passe codé. Ce mot de passe se trouve 2 octets plus loin et occupe 4 octets (Ah! C'est une faille de sécurité! ce n'est pas très long!). Vous pouvez vérifier si c'est bien le mot de passe avec une astuce très simple: Changez le mot de passe puis ouvrez le fichier modifié de nouveau. Si les octets que vous avez repéré ont changé, vous ne vous êtes pas trompé.

 

Comment trouver un mot de passe:

    Vous pouvez maintenant taper un mot de passe et voir comment il est crypté par Word. J'ai vu que le deuxième octet dépend surtout de la taille du mot de passe. Par exemple s'il vaut 0xDE le mot de passe a toutes les chances d'être composé de 6 caractères. C'est plus difficile pour les autres octets. Je n'ai pas encore trouvé de méthode précise pour retrouver le mot de passe. Mais, comme vous avez vu, le nombre de possibilités est assez réduit. Dans le pire des cas on peut avoir 4000000000 possibilités. Donc un décryptage brutal n'est pas impossible. En plus un octet représente la taille ce qui réduit de 256 fois le nombre de possibilités.

    On peut essayer de créer un programme qui teste tous les mots de passe et qui stocke les codes obtenus lorsqu'ils sont cryptés. Bien sûr il faut trouver des astuces pour réduire au minimum le nombre de tests et il faudra plusieurs jours de calcul.

    Mais si on veut quelque chose de plus performant on peut essayer d'abord de comprendre comment ces mots de passe sont cryptés. On peut modifier une seule lettre du mot de passe et voir ce qui change lorsqu'il est crypté. On peut aussi modifier la taille des mots de passe, changer un seul bit dans chaque lettre (ex @ et Ç qui ont des codes 64 et 128) etc. Après tous ces essais il sera possible de déduire la formule mathématique du codage. Comme vous avez vu, cette méthode m'a déjà permis de trouver la taille mais on peut faire beaucoup plus.

    On peut essayer de procéder autrement. Plutôt que de chercher les mots de passe brutalement, on peut analyser la routine de cryptage. Il faut déboguer l'exécution de Word jusqu'à trouver une routine qui convertit les mot de passe en un entier avec toutes les méthodes de craquage . Un bon point de départ serait la boite de dialogue qui demande de saisir un mot de passe pour ouvrir un fichier. Lorsqu'on clique sur OK elle appelle la routine de cryptage puis elle compare le mot de passe stocké avec celui qui a été saisi. Et c'est là que vous pourrez l'attraper (:-o).