|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de FlashGet 1.65 fr.
w32dasm 8.9 Pour désassembler le progamme (transformation en langage d'assemblage) Pour trouver les string data references nécessaires pour élaborer le crack. WinHex 10.2 Resource Hacker 3.4.0.79
Offset Déplacement depuis le début de la zone de code d'un programme. EB 90
Détail des modifications flashget.exe
Détail des modifications flashget.exe
flashget.exe
Aujourd'hui on s'attaque à un logiciel très connu dans le monde des gestionnaires de téléchargement. Comme d'habitude lorsque l'on commence le craquage d'un programme on commence par le désassembler et ensuite le débugguer pour y repérer les failles qui nous serviront à élaborer par la suite le crack. Le désassembleur / débuggueur que j'ai l'habitude d'utiliser et dont on va se servir c'est w32dasm. Cette introduction faite nous pouvons commencer. On ouvre flashget.exe dans le désassembleur w32dasm par la commande Disassembler -> Open File to disassemble -> flashget.exe. Après quelques instants le listing de désassemblage s'affiche dans w32dasm. Avant de commencer notre étude du programme nous allons mettre systématiquement le logiciel en version anglaise (afficher -> language -> english). Cela présente en effet de nombreux avantages puisque le logiciel comme beaucoup d'autres a été conçu en langue anglaise (menus, interfaces, boîte de dialogue). La version française n'est qu'une traduction du code écrit en anglais. Par ailleurs dans ce cours j'expose 2 méthodes de cracking différentes qui aboutissent au même résultat : patcher la variable qui permet de lancer le logiciel en mode enregistré. J'en ai ajouté une troisième et dernière (différente des 2 premières) qui consiste à craquer le routine qui vérifie la validité du serial stocké en base de registre.
1/ Les variables d'enregistrement a/ Tentative d'enregistrement Si vous lancez le logiciel vous voyez apparaître dans le dernier menu (le menu help) l'élément "Remove Banner...". En cliquant dessus une fenêtre d'enregistrement apparaît avec 3 champs "Name", "E-Mail" et "Registration Code". Mettons les valeurs suivantes "Name" = Pifoman Appuyez ensuite sur le bouton OK. Une fenêtre apparaît ensuite en affichant "Thank you for registering FlashGet. Please restart the program. If you have typed your registration data correctly, the banners will be removed.". Cela signifie en français que le programme a besoin d'être redémarré pour prendre en compte les modications et que si les informations d'enregistrement sont correctes la bannière qui apparaît en haut de la fenêtre de FlashGet disparaîtra. Notons le message et allons dans w32dasm pour voir où est appelé ce message. Faîtes CTRL S pour vous placer au début de la zone de code de FlashGet puis Search -> Find Text -> Thank you for registering FlashGet. Vous arrivez alors à un seul endroit.
Le message "Thank you for registering FlashGet. Please restart the program. If you have typed your registration data correctly, the banners will be removed." est donc appelé en 0041DFAD. Si vous remontez dans le code vous voyez 3 appels à des chaînes RegName, RegPass et RegDisp suivis à chaque fois d'un appel à General. 3 ça ne vous rappelle rien ? Il y avait 3 champs dans la fenêtre d'enregistrement ! Le problème maintenant est de savoir la correspondance entre ces 3 variables qui seront intégrées au registre et les champs de la boîte d'enregistrement.
b/ Localiser les variables d'enregistrement dans le registre. La question se pose alors comment retouver ces 4 informations (RegName, RegPass, RegDisp et General) dans le registre ; informations qui seront examinées par flashget.exe pour savoir s'il doit démarrer en mode enregistré ou non. Pour cela il suffit d'utiliser un petit utilitaire gratuit qui s'appelle Regmon.exe (Regmon = Registry monitoring -> en français surveillance du registre). Il est disponible an anglais sur http://www.sysinternals.com . Il est très petit (seulement 188 ko pour la version 6.06). Comment allons nous l'utiliser ? En fait c'est assez simple. Je suppose d'abord que flashget.exe est toujours ouvert et que vous êtes à nouveau dans la boîte d'enregistrement de flashget.exe avec les 3 valeurs suivantes remplies "Name" = Pifoman Ensuite vous lancez Regmon.exe et comme on veut surveiller l'activité du processus flashget.exe avec le registre vous tapez flashget.exe dans la case include puis OK.Vous cliquez ensuite sur le bouton OK de la boîte d'enregistrement et dès que le message "Thank you for registering FlashGet. Please restart the program. If you have typed your registration data correctly, the banners will be removed." apparaît faîtes File -> Save As ... -> Regmon.LOG dans Regmon.exe. Ouvrez ensuite Regmon.LOG. Vous voyez apparaître les informations recherchées. 8 2.27 flashget.exe:2796 SetValue HKCU\software\JetCar\JetCar\General\RegName SUCCESS "pifoman@yahoo.com" On en déduit que FlashGet sauvegarde dans le registre nos 3 champs d'enregistrement sous la clé General qui se trouve dans le chemin HKEY_CURRENT_USER\software\JetCar\JetCar. RegName = pifoman@yahoo.com Les variables d'enregistrement sont donc RegName, RegPass, RegDisp.
2/ Méthode de cracking n°1
Elle consiste à trouver et forcer la variable d'enregistrement en étudiant le menu Help -> About FlashGet... a/ Localiser dans w32dasm le message d'évaluation du menu "A propos de". En parcourant les menus de flashget.exe on voit le menu Help -> About FlashGet... qui nous affiche une fenêtre à l'intérieur de laquelle on peut lire : This copy of FlashGet is licensed to : Unregistered. Juste en dessous de cette phrase on lit Our thanks to:. Ce que l'on va faire maintenant c'est voir où le programme fait sa vérification d'enregistrement parcequ'il nous affiche Unregistered. On va pour cela dans le listing de désassemblage de flashget.exe et on cherche la chaîne Our thanks to:.On arrive à cet endroit
b/ Débugging avant l'affichage du message d'évaluation du menu "A propos de". On va maintenant débugguer flashget.exe à partir de l'adresse 0041A2F0 (adresse du premier byte de Our thanks to:) pour localiser la variable dans le code de flashget.exe qui est impliquée dans l'enregistrement de flashget.exe. Pour cela on commence par charger le programme en mémoire par la commande CTRL L de w32dasm. Ensuite on lance le programme via le debugger avec F9. On pose alors un breakpoint sur l'adresse 0041A2F0 qui appelle le Our thanks to: (SHIFT F12 -> 0041A2F0 -> OK -> F2) et direction le menu Help -> About FlashGet. A ce moment là w32dasm resurgit. Il a breaké (s'est arrêté) sur l'adresse 0041A2F0 (vous avez entendu un bing). Faîtes ensuite des F8 successifs (F8 = exécution ligne de code par ligne de code du programme sans entrer dans les calls mais en les exécutant quand même). Vous arrivez ici
Si vous faîtes F8 arrivé en 0041A378 vous constatez que le programme saute par dessus le RegisteredOwner appelé en 0041A429. Nous on veut s'enregistrer donc il nous faut absolument annuler ce saut en 0041A378. Comment faire ? En 0041A376 flashget.exe fait un test eax, eax qui équivaut à un and eax, eax. Si eax est différent de 00000000 le test rend un résultat non nul ce qui implique que le je 0041A46C (jump if equal to zéro dans le dernier test) ne saute pas (on n'a pas obtenu zéro). Il faut donc sorti du call 0041E0E0 en 0041A371 que eax soit différent de 00000000.Voyons ce qui se passe à l'adresse 0041E0E0 (faîtes F7 dès que vous êtes arrivé avec le debugger sur l'adresse 0041A371).
Vous arrivez en 0041E0E0. Notez la valeur de eax en haut à gauche dans la grande fenêtre du debugger (celle qui s'était ouverte quand vous aviez fait CTRL L dans w32dasm). Vous voyez eax = 0053C9a0. Ensuite si vous faîtes F8 le contenu sur 4 bytes (c'est le dword ptr) de l'adresse ecx + 00000284 est mis dans le registre eax (eax passe alors à 00000000).Et bien il suffit de teminer prématurément l'exécution du call 0041E0E0 en mettant un ret en 0041E0E0. Comme ça eax gardera la valeur non nulle qu'il avait avant de passer dans le call 0041E0E0.
c/ Vérifications des conséquences provoquées par le patch. Avant d'effectuer physiquement la modification il faut s'assurer que notre patch ne perturbe pas l'exécution du programme (par exemple un crash). En effet on a modifié l'instruction en 0041E0E0. Le problème c'est que cette instruction est appelée par 10 adresses au total qui sont 0041A371 (celle de notre patch), 00425306, 0042700F, 0042728D, 0042CFB4, 00451F64, 00462AEA, 00464FA0, 004703EC, 00475DD8. On va en vérifier une (les autres on supposera que c'est OK en lançant le programme modifié et en constatant qu'il ne crashe pas et qu'il fait ce qu'on attend de lui c'est à dire démarrer en mode enregistré). Laquelle choisir ? Réponse : 00425306. Pourquoi ? Pour la raison suivante. Le menu "A propos de" de flashget.exe fait appel à cette adresse (voir le listing du paragraphe 2-a) : :0041A385 E846AF0000 call 004252D0 Pour vous en convaincre terminez la session de debugging courante par CTRL T puis relancez en une par CTRL L puis posez un bp sur l'adresse 0041A378 (SHIFT F12 -> 0041A378 -> OK -> F2). En 0041A378 on saute par dessus le RegisteredOwner (cf paragraphe 2-b). Faîtes F9 puis allez dans le menu Help -> About FlashGet... de flashget.exe. w32dasm apparaît arrêté sur l'adresse 0041A378.
On va annuler le saut en 0041A378 pour pouvoir atteindre ensuite l'adresse 0041A385. Pour cela cliquez sur le bouton Modify Data dans la grande fenêtre du debugger en bas à gauche puis dans la fenêtre qui s'ouvre cliquez sur le 1 en dessous de la lettre Z en haut puis cliquez sur les boutons Modify puis Close. Faîtes ensuite des F8 pour arriver en 0041A385. Une fois sur cette adresse descendez dans le call 004252D0 en appuyant sur F7.
En 0042530B le programme refait un test eax, eax après avoir appelé notre fameux call 0041E0E0. On voit que si le call 0041E0E0 n'a pas été modifié on a encore une remise à zéro de eax (il valait 0053a194 avant de passer sur le call 0041E0E0). Cela provoque encore un saut par dessus une instruction intéressante : le push 0052F598 en 00425314 qui est chargée de récupérer la chaîne RegDisp = "Pifoman" dans le registre pour l'afficher ensuite à la place du Unregistered dans le menu Help -> About FlashGet... de flashget.exe. On a donc bien la confirmation encore une fois qu'il faut empêcher la remise à zéro de eax dans le call 0041E0E0. Remarque : si le programme avait sauté le RegDisp il aurait à la place de Unregistered dans le menu Help -> About FlashGet... de flashget.exe mis la valeur de RegisteredOwner qui se trouve dans la clef HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. En effet si vous reprenez le listing du paragraphe 2-a en 0041A3AD vous voyez que le programme teste la valeur de ecx qui est la longueur du RegDisp lu en base de registre. Si la lecture du RegDisp n'a pu être faîte ecx = 00000000 et le programme saute vers la lecture de la clef ci-dessus.
d/ Enregistrement de la modification -> Dans le code du programme Ce que nous allons faire c'est annuler physiquement ma mise à zéro de eax en 0041E0E0. Pour cela on ouvre une copie vierge de flashget.exe dans winhex et on remplace par la commande ALT G -> 1E0E0 (1E0E0 c'est l'offset donné dans w32dasm dans la barre de statut de w32dasm quand vous sélectionnez l'adresse 0041E0E0) le code hexadécimal suivant en blanc et rouge (le blanc c'est ce qui est effectivement à changer) :
:0041E0E0 8B8184020000 mov eax, dword ptr [ecx+00000284] Le fait de mettre C3 sans changer le code qui le suit est ici sans influence sur l'exécution du programme grâce aux nop d'origine qui suivent le C3 à partir de l'adresse 0041E0E7. En effet si vous modifiez l'offset 1E0E0 dans une copie de flashget.exe en y mettant C3, que vous enregistrer la modification et que vous désassemblez cette copie modifiée dans w32dasm vous voyez dans les 2 listings de désassemblage (flashget.exe non modifié et flashget.exe modifié) que la prochaine ligne de code est située en 0041E0F0 : :0041E0F0 6AFF push FFFFFFFF -> Dans le registre de windows Cela est effectué par le crack qui met à jour le contenu de la valeur RegDisp présente sous la clé HKEY_CURRENT_USER\software\JetCar\JetCar\General (c'est la commande /nom=pifoman dans la zone de texte du crack).Vous pouvez faire manuellement cette opération (une fois le programme patché) en adaptant ce code qui doit être collé dans un fichier texte nommé enregistrer_flashget.reg : REGEDIT4 [HKEY_CURRENT_USER\software\JetCar\JetCar\General]
3/ Méthode de cracking n°2
Elle consiste à trouver l'endroit où est retiré le menu Help -> Remove Banner... lors de l'enregistrement. a/ Etude des menus avec Resource Hacker. Comme on peut le vérifier en appliquant la méthode de cracking n°1 le menu Help -> Remove Banner... disparaît quand on est enregistré. Logique ! On ne peut pas proposer de retirer la bannière publicitaire (Remove Banner...) à un utilisateur enregistré. On va donc chercher l'endroit où le programme retire ce menu. Pour étudier les menus de flashget.exe j'ai choisi l'éditeur de resources Resource Hacker. Ouvrons flashget.exe dans Resource Hacker. A gauche vous avez une structure arborescente qui liste les différents composants de l'application : vous avez de haut en bas les avis, les cursors, les bitmaps, les icons, les menus, les dialogs, la string table, les accelerators, les cursors groups, les icons groups, le version info et une ressource numérotée 241. On va descendre dans le chemin Menu -> 128 -> 1033. Pourquoi ? Parceque si vous cliquez sur ce 1033 une mini fenêtre contenant les menus de flashget.exe apparaît. Si elle n'apparaît pas cliquez sur le bouton Monter en haut dans la partie droite de Resource Hacker. Déroulez ensuite l'ascenseur à droite au maximum pour retrouver le menu HELP.Voici ce que vous devez trouver. POPUP "Sea&rch" POPUP "&Help"
Comment interpréter ce code.Le mot-clef POPUP déclare l'existence d'un menu de nom HELP.Le & devant le HELP c'est pour le raccourci clavier (dans flashget.exe les touches ALT et h pressées en même temps déroule le menu help). Chaque élément du menu est précédé du mot-clef MENUITEM puis suivi du nom qui sera affiché dans flashget.exe et enfin d'un identifiant). Le mot-clef SEPARATOR trace une ligne horizontale ente 2 éléments sucessifs du menu (par exemple User &Manual et &Register...). Dans le menu HELP on voit tout de suite que l'élement &Register... existe mais n'est jamais affiché (mode enregistré ou non). C'est sûrement un reste d'un précédent flashget qui a été gardé pour conserver la compatibilité ascendante entre les versions sucessives de flashget. Par ailleurs le menu Sea&rch existe aussi mais n'est jamais affiché (mode enregistré ou non). Pourquoi ? Parceque le service internet de recherche de http://www.amazesoft.com/ n'est plus implémenté. Si vous réactivez ce menu (je vous monterais comment faire plus bas) flashget.exe lancera une requête sur un serveur web sans rien donner comme résultat (à part des signes cabalistiques incompréhensibles).
b/ Trouver l'endroit où est appelé l'élément de menu Remove Banner... L'élément de menu qui nous intéresse c'est le MENUITEM "&Remove Banner...", 32846. En hexadécimal 32846 donne 804E (démarrer -> exécuter -> calc -> 32846 -> clic sur le bouton hex). Revenons à flashget.exe désassemblé dans w32dasm et cherchons où est appelé cet élement de menu par CTRL S ; Search -> Find Text -> 0000804E -> OK.
La routine de masquage de l'élément de menu &Remove Banner... est longue mais je ne peux pas la simplifier plus au risque de vous égarer. Si vous démarrez une session de debugging avec CTRL L puis que posez un breakpoint sur l'adresse 00464FA7 après notre fameux call 0041E0E0 (qui teste l'enregistrement de flashget) et que vous faîtes F9 le débugger va s'arrêter sur l'adresse 00464FA7. Après une série de F8 jusqu'au ret en 00465077 voici le détail de ce qui se passe. 00464FA7 : saut vers 00464FFC.
Conclusion : on supprime l'élement de menu &Register... mais pas le &Remove Banner....Si on annule le saut en 00464FA7 (équivaut à patcher le call 0041E0E0 comme précédemment en empêchant la remise à zéro de eax) voici ce qui se passe :
00464FA7 : on ne saute pas vers 00464FFC.
Conclusion : on supprime les élements de menu &Remove Banner... et &Register....C'est ce qu'on voulait.
c/ Enregistrement de la modification C'est exactement pareil que dans le paragraphe 2-d.
4/ Patchs supplémentaires des méthodes de cracking n°1 et 2
-> Le patch inutile Chose promise chose dûe. Je vous avais promis de faire réapparaître le menu caché Search de flashget.exe. Je ne l'afficherais pas dans mon crack car le service de recherche comme je l'ai dit précédemment chez http://www.amazesoft.com/ n'est plus implémenté. J'expose juste la démarche à suivre pour réaliser ce tour de passe-passe. Vous avez remarqué (cf paragraphe 3-b) que dans les 2 cas (mode enregistré ou mode non enregistré) on appelle en 0046505F l'API USER32.RemoveMenu pour supprimer le menu numéro 6 (c'est le numéro correspondant au menu Search). Eh bien pour faire réapparaître ce menu il suffit d'annuler l'appel à cette fonction. Par exemple on peut remplacer à l'offset 65044 dans winhex le code hexadécimal suivant en rouge :
:00465044 8B4B1C mov ecx, dword ptr [ebx+1C]
-> Le patch utile Une fois enregistré vous voyez le menu help -> Ordering Information (en français Aide -> Formulaire d'achat). Ca fait un peu désordre sachant qu'on est enregistré et que l'on a normalement déja payé une licence. On ne va pas quand même en payer une une deuxième fois :(! Bon voici ce qu'on va faire c'est effacer cet élément de menu en utilisant ce qu'on a fait auparavant. Comme on est enregistré on ne saute pas en 00464FA7. Souvenez vous en mode non enregistré on invoquait l'API USER32.DeleteMenu en 0046503E. L'identifiant de &Ordering Information (cf Resource Hacker) c'est 32917 <=> 8095 en hexadécimal. Eh bien il suffit de remplacer à l'offset 64FFA dans winhex le code hexadécimal suivant en blanc et rouge (le blanc c'est ce qui est effectivement à changer) :
:00464FFA EB48 jmp 00465044
5/ Méthode de cracking n°3
Elle consiste à forcer la procédure qui vérifie la validité du serial stocké en base de registre. a/ Pose des breakpoints On sait que c'est la valeur du paramètre RegPass de la clé HKEY_CURRENT_USER\software\JetCar\JetCar\General qui est vérifiée au démarrage par flashget.exe pour savoir s'il doit démarrer en mode enregistré ou non. Ce qu'on va faire c'est d'abord lancer une nouvelle session de debugging dans w32dasm (flashget.exe a été au préalable désassemblé dedans) avec la commande CTRL L de w32dasm. Puis faîtes CTRL S et Search -> Find Text -> RegPass -> F2. Alternez les F3 (occurence suivante) avec les F2. Vous avez mis alors 2 breakpoints. Un sur l'adresse 0041DF81 et un sur l'adresse 0041E156. On démarre le débugging avec F9 et on break ici
J'ai retiré la routine de vérification du serial du listing qui est entre les adresses 0041E248 et 0041E2DD. J'ai juste gardé les tests de validité qui font que le serial (contenu de la variable RegPass) sera toujours bon sorti de la boucle de vérification. 0041E1CC : on vérifie que pifoman@yahoo.com contient un @ sinon on saute vers la sortie en 0041E2EB.
b/ Le patch de la routine de vérification du serial On a l'embarras du choix. Voici une solution parmi d'autres. Elle consite à sauter vers la bonne sortie 0041E300 depuis 0041E2EB. Cela fonctionne quelque soit les caratères contenus dans RegPass (RegPass peut même être vide). Ouvrons une copie vierge de flashget.exe dans winhex et remplaçons par la commande ALT G -> 1E2EB (1E2EB c'est l'offset donné dans w32dasm dans la barre de statut quand vous sélectionnez l'adresse 0041E2EB) le code hexadécimal suivant en rouge :
:0041E2EB 5F pop edi
Enregistrons et lançons le programme modifié. On est enregistré. Vous remarquez que l'on a pas besoin de remplir les champs du menu help -> Remove Banner... ni de modifier les 3 valeurs du registre (RegName, RegPass, RegDisp) car on est directement enregistré avec ce patch.
Dans ce cours vous avez appris dans un premier temps à localiser les variables d'enregistrement du programme flashget.exe en exploitant un message d'erreur dans w32dasm et en utilisant l'utilitaire Regmon. Par la suite je vous ai présenté 2 méthodes pour craquer FlashGet à partir de 2 analyses différentes conduisant au même résultat : l'enregistrement du logiciel à votre nom. La première méthode consiste à étudier le menu Aide -> "A propos de". Il s'agit en particulier de retouver l'endroit dans w32dasm où le programme appelle le message Our thanks to: .C'est en effet à la suite de cette expression que le nom du propriétaire du logiciel est affiché. Unregistered par défaut ou une autre valeur notamment celle de la variable RegDisp stockée dans le registre lors de la tentative d'enregistrement par le menu aide -> "Remove Banner". La seconde méthode consiste quant à elle à chercher l'endroit dans w32dasm où est appelé l'élément de menu "Remove Banner...". En effet ce dernier n'apparaît pas dans la version enregistrée du programme. Pour mener à bien notre analyse on a récupéré l'identifiant de cet élément de menu via l'éditeur de ressources nommé Resource Hacker puis cherché dans w32dasm cet identifiant sous forme hexadécimale. Nous sommes tombé comme dans la première méthode sur la variable d'enregistrement qui permettait le retrait de "Remove Banner...". Dans une 4 ième partie je vous ai montré 2 endroits où l'on peut patcher (un pour faire réapparaître le menu caché Search et un pour retirer le menu help -> Ordering Information qui reste malgré l'enregistrement). Enfin dans une 5 ième partie je vous expose la technique pour craquer la procédure qui teste la validité du serial entré.
Bonne nuit à tous. ![]()
|