|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de Ulead PhotoImpact 8.5 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 Softice Regmon 6.0.6 Filemon 6.0.7
Offset Déplacement depuis le début de la zone de code d'un programme. EB 90
Détail des modifications de u32Cfg.dll
Détail des modifications de u32Prod.dll
Avant de commencer à étudier les protections de Ulead Photoimpact 8.5 fr je vais vous faire une présentation des fonctionnalités du célèbre débugger softice. Ce qu'il faut savoir c'est que de ce logiciel en quelques lignes : -> C'est un outil très puissant et très utilisé par les crackers.
1/Installation sous windows XP Il faut récupérer la version 4.05 pour les systèmes windows NT (5.94 Mo) qui est compatible avec windows XP sur le site et procéder comme suit pour l'installation. -> Entrez votre nom et votre compagnie avec un numéro de série (par exemple 5109-0122DF-FF). -> Dans le fichier de configuration de Softice C:\WINDOWS\system32\drivers\Winice.dat * Remplacez la ligne INIT actuelle par INIT="X;CODE ON;DATA;R;" pour demander à chaque lancement de softice l'affichage de la zone de commande,du code assembleur, de la zone de données et de la zone de registres. -> Installer le pach pour softice XP en copiant les 3 fichiers de nticexp.zip qui sont ntice.sys, siwsym.sys, siwvid.sys dans C:\windows\system32\drivers.
2/Les commandes de softice Elles sont consignées dans le fichier C:\Program Files\NuMega\SoftIceNT\SoftICE Command Reference.pdf. Les plus utiles pour le debugging seront les suivantes : -> CTRL D : passer de windows à softice et vice versa Commandes liées à l'affichage de la fenêtre de softice : -> F4 : passer du debugger à l'écran de windows et vice versa. Remarque : taper 2 fois la même commande d'affichage dans softice revient dans la plupart des cas à provoquer l'effet contraire (affichage -> masquage).
3/L'interface de softice
L'interface de softice se décompose en 4 zones séparées pas des lignes vertes.De haut en bas on a -> La zone des registres (contrôle de l'affichage de cette zone par la commande wr). Remarques :
u32Cfg.dll
Aujourd'hui on s'attaque à un logiciel très connu dans le monde de la retouche d'image. Comme d'habitude lorsque l'on commence le craquage d'un programme on commence par le désassembler et ensuite le débugger 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 donc le logiciel Iedit.exe dans le désassembleur w32dasm par la commande Disassembler -> Open File to disassemble -> Iedit.exe. On s'attend comme d'habitude à trouver un listing de désassemblage avec un suite de lignes de code en assembleur.C'est le cas.Seulement on ne trouve pas de référence à des expressions du type evaluation, trial, registered ou enregistré quand on regarde les string data références en cliquant sur le Strn Ref. On va donc changer de technique en faisant appel à la bête noire de tous les programmeurs d'applications : Softice.
1/Retirer le time limit
Quand on lance Photoimpact 8.5 on voit apparaître un nag-screen nous disant que le logiciel est évaluable 30 jours.On réfléchit et on se dit que si le programme est capable de calculer la période d'évaluation restante c'est qu'il a dû au préalable récupérer la date courante du système puis la comparer à la date d'installation du programme. Pour cela sous windows les programmes ont en général recours à l'une des 3 API (Application Programming Interface) suivantes : Kernel32.GetLocalTime, Kernel32.GetSystemTime, Kernel32.GetFileTime. On va donc pour cela utiliser softice et mettre un point d'arrêt sur la première API à savoir Kernel32.GetLocalTime comme ça si le programme fait appel à cette fonction système softice va arrêter l'exécution du programme et nous l'indiquer. Pour poser le breakpoint (point d'arrêt) sur Kernel32.GetLocalTime on affiche softice par CTRL D puis dans la zone de saisie en bas de softice on écrit suivi de entrée la commande bpx GetLocalTime.Ensuite on repasse sous windows en faisant CTRL D et on double clique sur Iedit.exe pour lancer photoimpact.A ce moment là softice resurgit en nous affichant dans la zone de saisie "Break due to GetLocalTime".On annule alors tous les breakpoints posés avec la commande bc* (bc = breakpoints clear).On regarde ensuite la ligne verte au dessus de la zone de saisie.Elle affiche Kernel32!.text.Ca veut dire que l'on est dans la dll système Kernel32.dll.Nous c'est l'adresse d'appel de Kernel32.GetLocalTime qui nous intéresse (on veut savoir quel module de notre programme a appelé cette fonction).On fait alors F12 dans softice pour sortir de kernel32.dll et on arrive dans u32Cfg (la ligne verte en bas de softice affiche u32Cfg!.text).On en déduit que c'est le fichier u32Cfg qui est impliqué dans le time-limit.Si on fait une recherche de la chaîne u32Cfg dans le répertoire d'installation on trouve le fichier u32Cfg.dll. A partir de ce moment là on commence l'examen de la protection de 30 jours embarquée dans le logiciel. -> On avance la pendule de windows 30 jours por en expirer son utilisation.
1 ière occurrence
2 ième occurrence
Quelle est la l'occurence de "La période d'essai de %d jours a expiré. Veuillez effectuer" impliquée dans le time limit ? Pour le savoir il suffirait de mettre un point d'arrêt sur les adresses 4EB04B83 et 4EB07EA5.Cela donnerait dans softice (faites CTRL D pour l'afficher) les commandes suivantes (chacune suivie de entrée) : bpx 4EB04B83 Mais si on repasse sous windows avec CTRL D et qu'on lance Iedit.exe rien ne se passe.Softice devrait pourtant s'arrêter sur une des deux adresses.On regarde alors le fichier d'aide de softice C:\Program Files\NuMega\SoftIceNT\Using SoftICE.pdf pour voir si l'on peut remédier au problème.A partir de la page 113 il nous est dit que dans certains cas, suivant le contexte d'exécution les bpx ne sont pas actifs mais on ne nous en dit pas plus sur la manière de les activer ! Rien non plus sur le net. C'est pas grave on va le faire manuellement en exécutant le programme ligne par ligne avec la touche F10 depuis l'appel à l'API Kernel32.GetLocalTime.Pourquoi simplement parceque le programme utilise d'abord l'API Kernel32.GetLocalTime avant d'afficher la phrase relative à l'expiration (ce qu'on cherche à craquer). On regarde dans softice la liste des points d'arrêt que l'on a posé en tapant la commande bl (bl=breakpoints list).Rien ne s'affiche (je suppose que vous n'avez pas tapé les 2 bpx).Nous n'avons donc posé aucun breakpoint (normal on les a tous effacés tout à l'heure avec la commande bc*).Donc on remet notre bpx GetLocalTime dans softice.On repasse sous windows avec CTRL D puis on lance Iedit.exe.A ce moment là softice réapparaît en nous affichant comme tout à l'heure dans la zone de saisie "Break due to GetLocalTime".On fait F12 pour sortir de Kernel32.dll et arriver dans u32Cfg.dll. Ensuite on appuie plusieurs fois sur F10 jusqu'à tomber sur l'une des 2 adresses 4EB04B83 et 4EB07EA5 (voir plus haut ; ce sont les adresses par où le programme doit passer pour afficher "La période d'essai de %d jours a expiré. Veuillez effectuer").Au bout de 66 pressions sur F10 vous arrivez à cette adresse : :4EB07DAB 0F84F4000000 je 4EB07EA5 A partir de là si vous continez à faire des F10 le nag-screen s'affiche avec le message d'expiration.On en conclut que c'est la deuxième occurence de "La période d'essai de %d jours a expiré. Veuillez effectuer" qui est impliquée dans le time limit. Pour retirer le time limit il suffit d'annuler les sauts qui mènent à l'adresse 4EB07EA5. Il y en a 4 qui sont aux adresses 4EB07DAB, 4EB07DBB, 4EB07E3D, 4EB07E4E (regardez plus haut le listing de désassemblage de la 2 ième occurence où il y a marqué Referenced by).Ce que l'on doit faire c'est sélectionner dans copie de u32Cfg.dll désassemblé dans w32dasm chacune des lignes de code contenant l'adresse impliquée (par exemple 4EB07DAB) et relever dans la barre de tâche de w32dasm l'offset à droite de @offset. Puis ensuite on ouvre u32Cfg.dll dans winhex et on se positionne par la commande ALT G -> "offset trouvé" sur chacun des 4 offsets trouvés et on modifie le code hexadécimal (ici en rouge) par le nouveau code consigné dans le tableau ci-dessous : Adresse Offset Signification code hexadécimal / assembleur 4EB07DAB 7DAB 0F84F4000000 je 4EB07EA5 devient 0F8400000000 je 4EB07DB1 On enregistre les modifications avec CTRL S et on relance Iedit.exe.Le logiciel n'expire plus malgré la pendule avancée de 30 jours.Le time-limit est donc retiré.
Remarques: Si l'on repasse en version d'évaluation en annulant les changements qu'on vient de faire (fermez PhotoImpact et renommez copie de u32Cfg.dll en u32Cfg.dll) on constate que le programme reste expiré! A partir du moment où l'on dépasse les 30 jours d'évaluation le programme reste définitivement expiré.Pour le forcer à repasser en version d'évaluation 30 jours on fait appel au petit utilitaire Regmon 6.0.6 (188 ko) pour surveiller les échanges entre Iedit.exe et le registre de windows (le registre de windows que l'on édite avec regedit.exe dans démarrer -> exécuter -> regedit est une table contenant tous les paramétrages des applications installées sur votre système).Ce qu'il faut savoir c'est qu'un programme au démarrage examine en général certaines clef spécifiques dans le registre pour savoir comment il doit démarrer.Dans notre cas le programme va vérifier dans le registre si la version est expirée ou non et agir en conséquence. Démarrez Regmon et prenez comme filtre Iedit.exe puis lancez ensuite Iedit.exe et examinez les clefs du registre interrogées par notre application.Vous en avez plusieurs très intéressantes qui commencent par HKCU\CLSID.C'est dans cette clef que sont en général situés les marqueurs de temps pour les applications en mode shareware.Celle impliquée dans les 30 jours d'évaluation est celle-ci : HKCU\CLSIDHKCU\CLSID\{98A158C2-8F80-11D4-A54A-0000E88D2305}\Shell\Open A cet endroit vous avez une clef "InProcSysID" qui vaut "D999999-L999999".Si vous effacez l'identifiant de classe (en abrégé CLSID=CLasS IDentifier) à savoir {98A158C2-8F80-11D4-A54A-0000E88D2305}vous retrouvez vos 30 jours d'évaluation dans Photoimpact.Donc on l'efface. Si le logiciel ne repasse toujours pas en version d'évaluation 30 jours combinez ce que vous venez juste de faire sur {98A158C2-8F80-11D4-A54A-0000E88D2305}avec cette fois-ci un autre petit utilitaire : Filemon 6.0.7 (180 ko) avant de lancer Iedit.exe.Prenez comme précédemment le même filtre soit Iedit.exe et regardez dans la liste générée par Filemon les fichiers examinés par le programme Iedit.exe lors de son lancement.Vous en verrez un qui après vérification s'avère être impliqué dans la version d'évaluation 30 jours.Il s'agit de C:\WINDOWS\kpe.dat. L'effacer ne rétablit pas les 30 jours.Il suffit de lui enlever l'attribut caché (clic droit dessus -> propriétés -> caché) , l'éditer dans wordpad (démarrer -> exécuter -> wordpad) et de modifier les lignes BEGIN=2005017 en BEGIN=2005018 (2005018 = date d'aujourd'hui sur la pendule de windows = année courante suivie n° du jour dans l'année sur 3 chiffres = 18 janvier 2005; 2005017 = date d'installation de photoimpact) et USED=0000031 en USED=0000001 et le tour est joué ! Attention : le logiciel vérifie la cohérence des données de kpe.dat.Si on a installé photoimpact le 18 janvier 2005 ie BEGIN=2005018 et USED!=0000001 => détection manipulation kpe.dat => logiciel expiré. De même si la clé HKCU\CLSIDHKCU\CLSID\{98A158C2-8F80-11D4-A54A-0000E88D2305}n'existe pas et que USED!=0000001 => détection manipulation kpe.dat => logiciel expiré (en effet le logiciel ne peut pas avoir été utilisé USED!=00000001 et ne pas avoir de clé {98A158C2-8F80-11D4-A54A-0000E88D2305}.Ils se cassent bien la tête chez ulead pour pas grand chose ... On en conclut que pour repasser à tous les coups en version d'évaluation 30 jours il faut faire en même temps la suppression de la clef {98A158C2-8F80-11D4-A54A-0000E88D2305} dans le registre puis mettre dans kpe.dat en plus des 2 premières lignes existantes BEGIN=AJ (où A= année courante = 2005 et J = n° du jour dans l'année sur 3 chiffres dans l'année = 018) et USED=0000001.Pour ceux qui n'ont toujours pas compris si on est le 1ier février 2005 (à la pendule de windows en bas à droite de votre écran) BEGIN=2005032 (31 jours en janvier + 1 en février = 32). Attention quand même aux pièges du style le 1ier mars 2004, BEGIN=2004061 (31 jours en janvier + 29 en février + 1 en mars = 61) : c'est une année bissextile de 366 jours ...
2/Retirer l'image du photographe
A chaque lancement du logiciel après un clic sur le bouton "Essayez davantage" du nag-screen on voit appaître l'image d'un photographe.A la longue cela devient ennuyeux.On va donc supprimer cette photo qui en plus ne sert à rien ! On garde la pendule de windows avancée de 30 jours et on modifie les octets trouvés dans le paragraphe 1/ pour que le logiciel n'expire plus.On revient au code désassemblé de copie de u32Cfg.dll dans w32dasm et on clique sur le bouton Exp Fn qui nous donne la liste des fonctions exportées.On en remarque une dont le nom est particulièrement significatif Exported fn(): ulcDispLogo - Ord:0008h En réfléchissant un peu on devine que ulcDispLogo c'est l'abbréviation de Ulead Create Display Logo (en français Ulead Créer l'affichage du Logo).Examinons le code de cette fonction
En 4EB021A9 on voit qu'un saut nous mène en 4EB021B8 et traverse u32Cfg.ulcGetInfo.Comment est ce que je sais ça ? Et bien il suffit de modifier le fichier de configuration de softice C:\WINDOWS\system32\drivers\Winice.dat ,de lui ajouter la ligne suivante EXP=C:\Program Files\Ulead Systems\Ulead PhotoImpact XL\u32Cfg.dll (sans mettre de point virgule devant) et de rédémarrer la machine. Cette action nous permettra de mettre ensuite un point d'arrêt directement sur la fonction ulcDispLogo dans softice.Une fois la machine redémarrée on passe sous softice par CTRL D puis on tape bpx ulcDispLogo suivi de entrée.On repasse sous windows avec CTRL D et on lance Iedit.exe. En appuyant plusieurs fois sur F10 (9 fois exactement) on voit arrivé en 4EB021A9 que le programme veut sauter vers 4EB021B8 (vous voyez le mot jump avec une flèche vers le bas à côté de cette ligne de code dans softice). Annulons le saut pour voir comment le programme se comporte en tapant dans la zone de saisie de softice r fl z (abbréviation de reverse flag zero) suivi de entrée.Le flag zero c'est un bit pour dire si on doit sauter ou pas.Le fait de taper r fl z tranforme notre ZF=0 en ZF=1 (ZF pour Zero Flag) et annule notre jne (les jne (jump if not equal to zero) ne sautent que si ZF=0 ie quand on obtenu un résultat != 0 dans la dernière instructions exécutée -> ici l'instruction asm test).En faisant F5 pour continuer l'exécution du programme on voit que le programme n'affiche plus le logo au démarrage.On en conclut que c'est bien ce saut qu'il faut annuler pour supprimer le logo.L'offset correspondant à l'adresse 4EB021A9 dans w32dasm est 21A9 (sélectionnez cette ligne dans w32dasm et regardez la barre de statut à droite de @offset).Ensuite par la commande ALT G -> 21A9 faites le changement suivant (ne changez que le code hexadécimal en rouge) dans u32Cfg.dll ouvert dans winhex : :4EB021A9 750D jne 4EB021B8
Remarques: Vous vous demandez certainement très justement comment j'aurais fait pour trouver ce saut impliqué dans l'affichage du logo si je n'avais pas eu l'idée ni de regarder dans u32cfg.dll ni de chercher un nom de fonction explicite.Encore une fois softice nous aurait mis sur la voie.Avant de cliquer sur le bouton "Essayez davantage" une fois que vous avez lancé Iedit.exe vous passez sous softice par CTRL D et vous mettez un breakpoint sur l'API User32.createwindowExA en tapant cette commande suivie de entrée bpx createwindowExA.Ce qu'il savoir c'est que le logo même si elle ne se voit pas est affiché via une fenêtre windows et vous l'aurez compris l'API createwindowExA sert à créer des fenêtres.Une fois repassé sous windows avec CTRL D et que vous cliquez sur le bouton "Essayez davantage" de photoimpact , softice resurgit en nous disant qu'il a breaké sur createwindowExA.A ce moment là un F12 nous permet de savoir quel fichier a appelé User32.createwindowExA : c'est u32cfg.dll.Si on fait encore un F12 on tombe juste après l'adresse qui a appelé u32cfg.dll soit l'adresse 004F75A2 dans Iedit.exe.Voici ce que softice nous affiche après les deux F12 précédents : 001B : 004F759D E8F82D3500 call u32cfg!ulcDisplogo Pour ceux qui n'ont pas compris ce que signifie le code asm à l'adresse 004F759D.Pour créer et afficher le logo le programme Iedit.exe a appelé (en anglais call) la fonction ulcDisplogo qui se trouve dans le fichier de nom u32cfg (c'est ce qui est écrit sous le code u32cfg!ulcDisplogo).La suite vous la connaissez c'est ce qu'on vient de dire avant la remarque de ce même paragraphe.
3/Retirer le nag-screen
Pourquoi ai-je fait cette digression sur le registre dans le pragraphe 1/ ? Parceque on va s'en servir maintenant ! Souvenez vous de ce que je viens de dire : le programme examine le registre pour savoir comment il doit démarrer.Eh bien nous on va poser dans softice un point d'arrêt sur l'API ADVAPI32.RegOpenKeyA.Cette API permet d'ouvrir une clef dans le registre de windows. Le pb c'est que cette advapi32.dll n'est pas enregistrée dans les exports du fichier de configuration de softice C:\WINDOWS\system32\drivers\Winice.dat.On fait comme tout à l'heure dans le 2/ en ajoutant dans Winice.dat la ligne suivante EXP=\SystemRoot\System32\advapi32.dll (sans mettre de point virgule devant) et en rédémarrant la machine.Une fois la machine redémarrée; comme tous les breakpoints posés précédemment ont été annulés par le redémarrage on n'a pas besoin de taper dans softice la commande bc* pour les retirer.On tape alors simplement sous softice bpx RegOpenKeyA et on lance Iedit.exe.Après une longue série de F12 (51 fois) dans softice vous arrivez dans u32Cfg.dll. Pourquoi est-ce que je sais d'avance que le programme va utiliser (plus précisément importer) la fonction RegOpenKeyA dans u32Cfg.dll ? Parceque dans le listing de désassemblage de u32Cfg.dll obtenu avec w32dasm vous avez 6 occurences de la clef du registre trouvée plus haut à savoir InProcSysID. Je reviens sur softice.Si vous tracez le code de u32Cfg.dll pas à pas (on dit encore ligne par ligne) avec des F10 (après la longue série de F12 précédente) vous arrivez sur la ligne d'adresse 4EB07E87.A ce moment là une pression sur F10 conduit à l'apparition du nag.
On en conclut qu'il faut empêcher le programme d'arriver sur l'adresse 4EB07E87.Si vous regardez 2 lignes au dessus vous avez un saut en 4EB07E7B.Il suffit de le forcer pour supprimer le nag-screen.L'offset correspondant à l'adresse 4EB07E7B est 7E7B (sélectionnez cette ligne dans w32dasm et regardez la barre de statut à droite de @offset).Ensuite par la commande ALT G -> 7E7B faites le changement suivant (ne changez que le code hexadéimal en rouge) dans u32Cfg.dll ouvert dans winhex : :4EB07E7B 7518 jne 4EB07E95 Enregistrez les modifications dans u32Cfg.dll avec la commande CTRL S de winhex et redémarrez Iedit.exe.Et voila plus de nag-screen.
Remarques: a/ Si vous descendez dans le call en 4EB07E87 (sélectionnez dans w32dasm la ligne d'adresse 4EB07E87 puis pressez la flèche droite du clavier) vous arrivez ici
L'affichage du nag-screen est en fait provoqué par l'appel de l'API USER32.DialogBoxParamA. b/ On aurait très bien pu au lieu de mettre un breakpoint sur RegOpenKeyA en mettre un GetActiveWindow.A ce moment là softice aurait breaké sur GetActiveWindow et avec un F12 on serait arrivé à l'adresse 4EB0620D et il aurait suffit d'examiner u32Cfg.dll à cette adresse pour voir comment on est arrivé à cette adresse 4EB0620D .La référence à l'adresse 4EB07E87 en haut du listing du dessus nous aurait permis de trouver l'appel au nag.
4/Retirer le mot TRIAL dans le menu A Propos de Photoimpact
On regarde encore dans u32cfg.dll.On voit un nom de module importé de nom particulièrement significatif u32Prod.dll.La mention prod nous indique que très certainement ce fichier va contenir des informations sur le produit.En faisant une recherche de l'expression TRIAL avec CTRL F (option jeu de caractère unicode cochée) dans u32Prod.dll ouvert dans winhex on trouve une occurrence de cette expression offset B7A8E.Pour effacer le mot TRIAL du menu A propos de photoimpact il suffit de remplacer à l'offset B7A8E le code 54 correspondant à la lettre T de TRIAL par 00.Le code 00 indique en effet au programme que la fin de la chaîne est atteinte pour la lecture.
Ce cours est mon premier du genre sur softice.D'ordinaire l'utilisation du désassembleur/débugger w32dasm suffit à conduire une analyse sur le programme en vue de le craquer.Ici w32dasm n'est pas très adapaté à une analyse de type cracking sur les string data references car ces dernières ne contiennent pas de mot-clef sur l'enregistrement du logiciel. Ce cours a été l'occasion pour moi de vous présenter softice, de décrire sa procédure d'installation sous windows XP qui n'est pas forcément naturelle et de décrire son interface graphique. Vous avez aussi appris dans ce cours à poser des points d'arrêt (commande bpx de softice) sur des fonctions système (on les appelle les API) par exemple Kernel32.GetLocalTime pour détecter l'endroit où est situé le time-limit de 30 jours, ADVAPI32.RegOpenKeyA pour surveiller les ouverture de clef dans le registre de windows et trouver l'adresse d'appel du nag-screen. Enfin vous avez assimilé grâce à ce cours la notion d'export dans le fichier de configuration de softice : Winice.dat qui nous permet de breaker sur des dll précises non ajoutées dans ce fichier initialament comme par exemple u32cfg.dll ou advapi32.dll. En conclusion les 2 outils indispensables pour un cracker sont dans cet ordre softice et w32dasm.Ils sont complémentaires et chacun d'eux travaillent sur des plans différents. Le premier travaille sur n'importe quel programme windows en cours d'exécution et le deuxième sur un programme spécifique.Bien qu'il soit difficile à appréhender Softice est un logiciel d'une efficacité redoutable à tel point que de nombreux programmeurs d'applications concients de sa puissance prévoient des routines de détection de softice et empêchent leur application de démarrer tant que softice est chargé en mémoire centrale.Avec de l'expérience et une bonne maîtrise de softice aucune protection même la plus élaborée ne vous resistera ... Ce qu'il faut retenir de softice c'est que c'est l'arme absolue du cracker et qu'on ne l'utilise que lorsque tous les autres logiciels de cracking ont échoués ...
Bonne nuit à tous. ![]()
|