|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de Readiris Pro 10.02 fr
Windasm 8.9 Pour désassembler le progamme (transformation en langage d'assemblage) et pour trouver les string data references nécessaires pour élaborer le crack. WinHex 10.2
Offset Déplacement depuis le début de la zone de code d'un programme. EB 90
Détail des modifications readiris.exe
Readiris.exe
Avant propos Le logiciel comporte une limitation au niveau du temps d'utilisation qui est fixé à 30 jours. Si vous avancez d'un an la date du système en utilisant l'horloge en bas à droite de votre écran le logiciel ne se lancera plus.Normal vous me direz le logiciel est limité à 30 jours d'utilisation ! On se dit alors qu'en le ramenant à la date d'aujourd'hui le programme va à nouveau se lancer (c'est le cas par exemple pour certains logiciels comme paint shop pro). Le problème c'est que le logiciel est définitivement verrouillé (en apparence du moins parceque nous on va passer par là :)). On réfléchit. Si le logiciel sait que la date d'utilisation a expiré c'est que cette information il l'a enregistrée au préalable quelque part. Ce quelque part dans une grosse majorité des cas c'est le registre (la registry pour les anglophones). Pour ceux qui ne connaissent pas le registre c'est la table de paramétrages des systèmes windows et des applications qui y sont installées.On y accède via l'utilitaire regedit.exe à partir de démarrer->exécuter->regedit.exe. La question se pose alors comment retouver cette information dans le registre ; information qui est examinée par readiris.exe pour savoir s'il doit se lancer ou se fermer (passé les 30 jours d'utilisation il se ferme). 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. Vous le lancez et comme on veut surveiller l'activité du processus readiris.exe avec le registre vous tapez dans la case include readiris.exe.Vous avancez la date du système de 1 an (après avoir ouvert readiris.exe une première fois pour initialiser le repère de temps) et vous lancez ensuite readiris.exe. Là le logiciel readiris.exe cherche à se fermer : laissez le faire. Ensuite revenez à Regmon.exe.Vous avez alors à l'écran une colonne process avec explorer.exe et readiris.exe. Sur les lignes où apparaissent readiris.exe vous en avez plusieurs qui font référence à la clé HKCR\CLSID\{178e49f9-55e3-40f5-b10d-c254ea8a7d71}\ClassData\rua01y Sur cette même ligne vous avez les paramètres result = success et other = un nombre (chez moi 3402535061). Ca c'est très intéressant.Quand un programme interroge la clé HKCR\CLSID (HKCR pour HKEY_CLASSES_ROOT et CLSID pour Class Identifier) vous pouvez être sûr que dans beaucoup de cas l'identifiant de classe qui succède le CLSID (ici {178e49f9-55e3-40f5-b10d-c254ea8a7d71}) est impliqué dans la protection temporelle. C'est le cas ici. De plus le nombre dans la colonne other ça ressemble à un timestamp c'est à dire un nombre qui après calcul donne une date (date d'expiration sûrement). Allons dans le registre et effaçons cette clé de nom rua01y et relançons readiris.exe .Eh là bien que nous ayons fait un saut dans le temps de 1 an le logiciel se lance comme si c'était la première utilisation ! Bon voila la protection est découverte.On pourrait s'arrêter là mais nous ce qu'on veut c'est que le logiciel à chaque lancement croit que c'est la première utilisation.On va donc le craquer (en supprimant pendant qu'on y est le nag à chaque démarrage).
Analyse du programme
1/Retirer nag-screen (écran de harcèlement)
On désassemble readiris.exe dans w32dasm par la commande Disassembler -> Open File to Disassemble -> readiris.exe. On inspecte ensuite les string data référence dans w32dasm comme d'habitude. On clique pour cela sur le bouton dans la barre de boutons nommé Strn Ref et ensuite on clique sur le bouton Copy All dans la fenêtre qui apparaît.On colle le tout avec CTRL V dans l'éditeur de texte wordpad.exe (accessible par démarrer -> exécuter -> wordpad). On cherche une chaîne que nous parle de register (par exemple regist). L'avantage de cherche regist c'est que vous trouvez à la fois registered et enregistré (si les messages sont en français). On cherche mais on ne trouve rien d'intéressant. On va donc utiliser une de mes techniques préférées celle du point d'arrêt (et pas celle du point d'arrête comme j'ai souvent l'habitude d'écrire en tapant trop vite au clavier) sur la fonction MessageBox de l'API user32.dll (c'est cette fonction qui appelle les nags screen en général). On y va. On charge readiris.exe en mémoire depuis w32dasm par CTRL L (L pour load en anglais).Ensuite on se met au début de la zone de code de readiris.exe par CTRL S et on met un point d'arrêt sur chaque ligne ou apparaît MessageBox. Pour mettre le point d'arrêt vous faites search -> find text -> MessageBox ,vous sélectionnez la ligne de code qui précède le MessageBox et vous faites F2. Le premier bp (breakpoint ou encore point d'arrêt) par exemple est mis sur la ligne de code d'adresse 004376B9 * Reference To: USER32.MessageBoxA, Ord:01BEh Un carré jaune apparaît alors à gauche du bp posé.Vous faites F3 pour passer à l'occurence suivante et vous alternez ainsi les F2 et les F3.Vous avez à poser au total 7 bp (par exemple sur les adresses suivantes 004376B9, 0049D26A, 0049D5F0, 0049D608, 004E2AAA, 00507B9E, 005220F9). Cette liste de bp apparaît dans la grande fenêtre du debuggeur à droite où c'est marqué Bpts (Bpts = breakpoints). Rappel : la grande fenêtre du debuggeur c'est la fenêtre qui est apparue quand on avait fait CTRL L.Une fois tous ces bp posés on lance le programme avec F9. Attention je me place dans la configuration du programme où il est encore évaluable (regardez l'avant-propos plus haut qui dit comment revenir au premier jour d'utilisation si vous avez avancé la pendule de plus d'un mois). w32dasm break alors sur la ligne de code d'adresse 004376B9 * Reference To: USER32.MessageBoxA, Ord:01BEh Si vous cliquez sur le bouton OK dans la boîte de dialogue "Cette version fonctionnera seulement pendant 30 jours" de readiris.exe et que vous faites F9 le programme est lancé. Il n'y a donc qu'un seul appel à la fonction MessageBox sur les 7 potentiels dans le listing de désassemblage qui est impliqué dans le nag à l'ouverture de programme (c'est normal vous me direz puisqu'il n'y a qu'un seul nag-screen à apparaître).Terminons la session de debugging par CTRL T (T pour terminate) et regardons comment on est arrivé à exécuter cette fonction.
Je crois que c'est clair : la seule manière d'arriver ici en 004376B9 c'est par l'adresse 00437659 (le C indique que le saut depuis 00437659 s'est fait de façon conditionnelle ie c'est un je ou un jne qui nous a amené en 004376A9).Allons en 00437659 par shift F12 -> 00437659. On voit alors ça
On va donc annuler le saut en 00437659 en remplaçant copie de readiris.exe ouvert dans winhex (ALT G -> 37659) le code hexadécimal 744E par 7400, comme ça le programme sautera en 0043765B au lieu de sauter en 004376A9 et évitera ainsi de nous afficher le nag-screen. Ca c'était ma réflexion avant de refaire ce tutorial.En effet il s'avère que si vous effacez tous les breakpoints posés précédemment (clic sur le bouton clear dans la grande fenêtre du debugger à droite de Bpts) et que vous relancez une nouvelle session de debugging avec CTRL T puis CTRL L puis que vous posez un bp sur l'adresse 00437659 dans w32dasm suivi de deux F9 vous voyez si vous êtes toujours dans la période d'évaluation de 30 jours qu'un clic sur le lien Numériser dans l'interface de readiris.exe et un scan de fichier suivi de la commande fichier -> quitter dans la barre de menu de readiris.exe provoque un arrêt dans w32dasm sur l'adresse 00437659. Qu'est ce que ça veut dire ? Eh bien ça veut dire que si l'on se contente d'annuler le saut 00437659 ; le programme va en plus de nous supprimer le message "Cette version fonctionnera seulement pendant 30 jours" nous supprimer également le message "Ces pages numérisées n'ont pas encore été reconnues.Voulez-vous quand même quitter l'application ?" qui s'affiche quand on quitte le programme après une numérisation sans faire reconnaître + enregistrer.Ce n'est pas du tout ce qu'on veut ! On veut seulement supprimer le 1 ier message (l'annulation du second message empêche le fermeture de l'application après un scan de fichier en ne proposant plus la boîte de dialogue contenant le deuxième message).Remontons dans le code pour voir comment on est arrivé ici.
On est arrivé à exécuter le saut en 00437659 par un saut depuis l'une des 81 adresses suivantes 00402CE3 , 0040301B, 00404DDF, 00406689, 004068DE, 0040716B ... Relançons une nouvelle session de debugging dans w32dasm => CTRL T puis CTRL L et comme tout à l'heure cliquez sur le bouton clear dans la grande fenêtre du debugger pour annuler tous les points d'arrêts (breakpoints) posés.On se place au début de la zone de code de readiris.exe avec CTRL S dans w32dasm .Ce qu'on pourrait faire pour trouver cette fameuse adresse parmi les 81 c'est faire SHIFT F12 -> adresse suivi de F2 (pour poser un bp) avec adresse valant successivement l'une des 81 adresses suivantes : 00402CE3 , 0040301B, 00404DDF, 00406689, 004068DE, 0040716B ... Comme c'est trop fastidieux à faire et que la solution la plus simple est toujours la meilleure il suffit de se dire que l'arrivée dans cette zone de code (qui commence à l'adresse 00437640 et se termine à l'adresse 004376CB par un ret) est certainement provoquée par une instruction asm call.Ce que l'on va faire c'est dans w32dasm mettre un bp sur 00437659 puis F9.Ensuite avec des F8 (exécution ligne de code par ligne de code sans entrer dans les call mais en les exécutant quand même) vous arrivez sur 004376B9 qui affiche le message "Cette version fonctionnera seulement pendant 30 jours".Faites OK dans cette boîte de dialogue puis retournez à w32dasm et faites des F8.Arrivé sur 004376CB un F8 nous fait arriver ici en 004903D0. :004903CB E87072FAFF call 00437640 On était donc dans le call à l'adresse 004903CB.Pour supprimer définitivement le nag-screen "Cette version fonctionnera seulement pendant 30 jours" sans toucher aux autres messages de l'application il faut donc nopper le call en 004903CB ie remplacer le code en rouge suivant dans copie de readiris.exe ouvert dans winhex à l'offset 903CB (ALT G -> 903CB). :004903CB E87072FAFF call 00437640 Enregistrez et lancer cette copie. Le nag-screen " Cette version ne fonctionnera que pendant 30 jours" a disparu. Si vous avancez d'un an la pendule de windows le nag disant que "La période d'évaluation de 30 jours est terminée.Veuillez contacter votre revendeur" n'est cependant pas retiré. On va le retirer en s'attaquant au time limit qui passé 30 jours ferme le programme.
2/ Retirer le time-limit
Quand on lance le programme il nous affiche le nag et ensuite il reste ouvert ou se ferme si on a dépassé les 30 jours. Nous ce que l'on va chercher à faire maintenant c'est maintenir la fenêtre ouverte tout le temps (avant et après les 30 jours). Pour cela il faut un peu de connaissances sur les API windows en particulier sur la fonction ShowWindow de l'API USER32.dll. Comme son nom l'indique ShowWindow est la fonction qui est appelée dans de nombreux cas pour afficher une fenêtre. Les paramètres de cette même fenêtre comme ses dimensions (position du coin supérieur gauche, largeur, hauteur) sont positionnés au préalable avec par exemple la fonction CreateWindow.Je vous invite à ce sujet à regarder mon article sur le code source de mes cracks en C++ disponible sur mon site dans la rubrique http://pifoman.free.fr/cours_cracking/cours_pif_source_C2.htm. Vous verrez à la fin du code un appel à la fonction ShowWindow. C'est une fonction indispensable au programme sinon rien ne s'affiche même si vous avez fait votre CreateWindow au préalable. Cette règle on va l'appliquer dans le cas de readiris.exe. Ce que l'on va faire c'est d'abord avancer la pendule de 1 an et mettre un point d'arrêt sur tous les appels à cette fonction ShowWindow.Pour cela faites CTRL T (pour terminer la session courante de debugging) CTRL L puis effacez les breakpoints existants dans la grande fenêtre du debugger qui vient d'apparaître en cliquant sur le bouton clear à droite de la zone Bpts. Ensuite plaçez vous au début de la zone de code de readiris.exe par CTRL S et mettez avec F2 un breakpoint (bp) sur toutes les occurences de ShowWindow trouvées avec search -> find text -> ShowWindow (F3 pour passer aux occurences suivantes). J'en ai posé 65. Les 4 premiers bp sont sur les adresses 00408866, 00408877, 00408B79, 00408CA9 et ainsi de suite jusqu'à la fin. Le dernier est mis sur l'adresse 00540A7A. Ensuite on démarre avec F9 le programme avec le debugger. Et là w32dasm break et est arrêté sur l'adresse 0048599F. Faites F9 pour continuer l'exécution et w32dasm break alors sur 004902DC. Faites encore F9 et là le programme est lancé. On a donc l'adresse de l'appel du ShowWindow qui va afficher la fenêtre au démarrage c'est celle de dernier break à savoir 004902DC. On fait CTRL T et on relance une nouvelle session de debugging avec CTRL L (on efface tous les bp posés comme précédemment) et on pose un bp sur l'adresse 004902DC (SHIFT F12 -> 004902DC -> F2). On démarre ensuite le programme avec F9 et dès que w32dasm break sur 004902DC on fait des step over avec F8 (F8 exécute le programme ligne de code par ligne de code en ne rentrant pas dans les call mais en les exécutant quand même). Vous avez alors des fenêtres dont le titre est W32dasm API details qui apparaissent à l'écran. Regardez ce qui apparaît dedans ça va nous aider. On a le listing de désassemblage suivant
Les W32dasm API details qui apparaissent successivement à l'écran nous indiquent que -> En 00490352 la chaîne "Période d'évaluation de %i jours terminée.Veuillez contacter votre revendeur" est chargée via la fonction USER32.wsprintfA et le %i prend la valeur 30 en cliquant sur le bouton GET API RESULT de la fenêtre W32dasm API details qui vient d'apparaître. On réfléchit à la vue de ces éléments et on se dit qu'il nous faut absolument éviter ces messages d'erreurs. Comment faire ? Remontons dans le code pour voir si on peut éviter de passer sur cette zone qui provoque la fermeture de la fenêtre. On voit que cette zone peut être évitée si on annule le saut en 00490325 (en remplaçant dans winhex à l'offset 90325 le code 7558 par EB58) comme je l'avais suggéré dans mon précédent tutorial sur Readiris pro 10.02.Malheureusement il s'avère après vérification que l'annulation du saut ne suffit pas à retirer complètement le time-limit car si vous avancez la pendule de windows de 1 an et que vous relancez Readiris pro 10.02 vous constaterez que la fenêtre principale de Readiris pro 10.02 reste bien ouverte au dela des 30 jours mais que les boutons (en particulier Numériser) ne sont plus cliquables !. Conclusion : la vérification si les 30 jours d'évaluation sont passés ou non se fait avant dans le call au dessus à l'adresse 0049031E.Descendons dans le call qui est à cette adresse.On arrive ici.
Ce qu'on va faire c'est relançer une nouvelle session de debugging dans w32dasm par CTRL T puis CTRL L et comme tout à l'heure annuler tous les points d'arrêts (breakpoints) posés en cliquant sur le bouton clear dans la grande fenêtre du debugger. Ensuite vérifiez que vous êtes bien en dehors de la période d'évaluation de 30 jours (normalement vous devez avoir avancé la pendule de windows de 1 an si vous avez lu ce qui précède).Posez un bp sur la ligne d'adresse 0045FE90 (SHIFT F12 -> 0045FE90 -> F2).Puis lancez le logiciel avec F9 puis poursuivez avec des F8 après le break de w32dasm.Vous voyez que le programme saute une fois arrivé en 0045FEBC et arrivé au ret en 00460041 le registre eax (valeur prise pour le test en 00490323) vaut 00000000.Si vous relancez une nouvelle session de debugging en repassant en période d'évaluation vous voyez que le programme ne saute pas arrivé en 0045FEBC.Eh bien voila il suffit d'annuler le saut en 0045FEBC et le tour est joué pour le time-limit (cette fois-ci les boutons dans l'interface seront actifs au dela des 30 jours); eax valant 1 arrivé au ret en 00460041. Rappel : pour effectuer physiquement la modification (ie 7529 remplacé par 7500) allez dans winhex ,ouvrez copie de readiris.exe et faites ALT G -> 5FEBC. Remplacez 29 par 00. Enregistrez, avancez la pendule d'un an et lancez le programme. Il tourne correctement au dela des 30 jours. Remarque 1 : le message disant "Période d'évaluation de 30 jours terminée.Veuillez contacter votre revendeur." n'apparaîtra donc plus puisque le programme n'expire plus (une pierre 2 coups !). Remarque 2 : pour redémarrer la période d'évaluation au premier jour il faut effacer dans le registre la clé
3/ Retirer le logo de démarrage
A chaque chaque chargement de readiris.exe un logo se charge nous obligeant à cliquer sur celui-ci pour afficher l'interface du logiciel.A la longue c'est pénible.On va l'enlever.Pour cela on fait appel à l'artillerie lourde : softice.Je suppose que vous savez installer ce logiciel sinon consultez mon cours sur photoimpact 8.5 fr de présentation et d'installation de softice.Avant de commencer 2 choses importantes -> On va travailler avec readiris.exe patché (nag screen de la partie 1 et time-limit de la partie 2 retirés). On passe donc sous softice et on va lui demander de s'arrêter dès que readiris.exe exécute le chargement du logo.Pour cela on sélectionne readiris.exe sans le lancer et on passe sous softice avec CTRL D puis on tape dans la zone de commande de softice en bas bpx showwindow Cette commande signifie breakpoint on execution (bpx) on showwindow function.En français dès que readiris exécute la fonction User32.showwindow (showwindow est codée dans C:\WINDOWS\system32\User32.dll) softice va stopper (à cause du breakpoint = point d'arrêt en français) l'exécution de readiris et nous l'indiquer.On repasse sous windows en tapant CTRL D puis on lance readiris.exe avec la touche entrée du clavier. A ce moment softice surgit.On atterrit dans user32 (il y a marqué user32!.text sur la dernière ligne en vert à doite en partant du bas de la fenêtre de softice).Ca ne nous intéresse pas puisque cette dll appartient au système windows et pas au programme.On fait F12 pour remonter à l'endroit de l'appel de user32.Cette fois ci on est dans readiris (readiris!.text sur la dernière ligne en vert à doite en partant du bas de la fenêtre de softice). On commence à tracer le programme en mode pas à pas en appuyant sur F10 plusieurs fois et l'on voit l'interface de readiris.exe qui se construit progressivement (faites F12 plusieurs fois si nécessaire dès que vous êtes ailleurs que dans readiris puis des F10 dès que vous êtes revenu dans readiris). Tapez F4 pour voir ce qui se passe sous windows et F4 pour revenir sous softice.Si vous avez un pb d'affichage de softice à cause de l'interface de readiris qui se construit tapez 2 fois F4 dan softice et votre affichage dans softice redeviendra correct.A un moment donnée le logo apparaît.Relevez sur un papier l'adresse de la ligne de code. :0048F653 FF1548FB6500 Call dword ptr [0065FB48] Tapez bc* suivi de entrée dans softice puis CTRL D et désassemblez readiris.exe patché (partie 1 + partie 2) dans w32dasm.Dès que le désassemblage est terminé faites SHIFT F12 -> 0048F653 pour voir ce qu'on a en 0048F653.
Le logo est donc affiché avec la fonction CreateDialogParamA.On arrive à l'adresse par 2 adresses 0048DF93 , 00490468.Tiens comme par hasard l'adresse 00490468 se trouve dans la zone du showwindow qui affiche la fenêtre de départ dans readiris (remontez de quelques lignes dans w32dasm et vous retouverez le listing de la partie 2).
Et en 0048DF93 qu'est ce qu'il y a d'intéressant ?
A priori rien d'intéressant ! Mettons quand même un bp sur l'adresse 0048DF40 (CTRL L -> SHIFT F12 -> 0048DF40 -> F2) pour voir comment est ce qu'on arrive ici.Puis lançons readiris.exe et là en cliquant sur le logo w32dasm break sur 0048DF40.Ensuite avec des F8 on fois l'interface qui se charge complètement arrivé en 0048E029 E8B27B0200 call 004B5BE0 C'est ce qu'on veut non ! Une interface complètement chargée avec la barre de boutons verticale à droite.Ce que nous allons faire c'est faire sauter readiris.exe depuis l'adresse 00490468 vers 0048DF40 où l'on charge complètement l'interface :00490468 E8B3F1FFFF call 0048F620 Dans w32dasm l'offset associé à l'adresse 00490468 est 90468.Fermez w32dasm et ouvrez votre readiris.exe patché puis ALT G -> 90468 et remplacez le code hexédécimal en rouge par sa nouvelle valeur (à savoir E8B3F1FFFF remplacé par E8D3DAFFFF).Lancez et voila toutes les protections sont retirées.Le cours est terminé et le programme est complètement craqué.
Remarque : comment ai-je calculé le code D3DAFFFF correspondant à l'adresse 0048DF40 ? Adresse de la prochaine instruction à exécuter après 00490468 = 0049046D
Dans ce cours j'ai retravaillé la partie 1 et 2 de mon précédent tutorial sur readiris pro 10.02.En effet une personne m'a indiqué un pb sur le crack de readiris pro 10.02 que je n'avais pas diagnostiqué pendant mes phases de tests.Le pb se situait au niveau du crackage du time-limit.En effet les boutons de l'interface se désactivaient au dela des 30 jours même si l'application craquée affichait bien la fenêtre principale.La correction apportée sur le time limit m'a donné l'occasion de corriger aussi un léger effet de bord.Quand je cliquais sur le lien numériser et qu'ensuite je cherchais à fermer l'application par fichier -> quitter la MessageBox demandant si l'on veut quitter l'application ne s'affichait plus ce qui m'empêchait de sortir du programme à ce moment.J'ai dû donc revoir la suppression du nag (il ne fallait plus annuler un saut mais nopper un call). Sinon je rappelle que ce cours par rapport aux précédents sur le même programme (version 9 et 10) est l'occasion d'apprendre à supprimer l'affichage d'un logo au démarrage. En conclusion vous avez appris dans cette leçon à localiser un nag-screen grâce à la fonction messageBox de l'API User32.dll puis à retirer un time limit.Enfin dans la dernière partie à l'aide de softice vous avez pu localiser l'endroit où est crée la fenêtre contenant le logo de démarrage en posant un point d'arrêt sur la fonction showwindow.
Bonne soirée à tous.
![]()
|