Crack in France
par pifoman

 
 

Ce cours est un reflet fidèle du cours intégré au crack de ma création de Readiris Pro 10.02 fr

 

INFOS SUR LE CRACK

 

Nom du prog

Readiris Pro 10.02

Editeur

http://www.irislink.com

Téléchargeable

http://www.irislink.com

Date du prog Dimanche 13 janvier 2005
Date du crack Lundi 14 mars 2005
Réalisé parPifoman
Url sitehttp://pifoman.free.fr/pif.php
Url redirectionhttp://www.geocities.com/mitonnes/pif.htm

 

MISE A JOUR DU CRACK

 

14/03/2005-> Correction du crack du time-limit.
Les boutons de l'interface se désactivaient au dela des 30 jours d'évaluation.
-> Correction du crack du nag-screen.
La correction apportée au dessus met à jour un nouveau pb : après la numérisation la MessageBox demandant si l'on veut quitter l'application n'existe plus => impossible de fermer le programme à ce moment.
  
22/02/2005

1 ière version du crack

 

COMMENTAIRES SUR LE PROGRAMME

 

       Readiris Pro est un logiciel de Reconnaissance Optique de Caractères (OCR) puissant et très simple à utiliser qui convertit vos documents papier quotidiens tels que les lettres, les fax, les articles de magazine, des colonnes dans un journal, etc. en fichiers textes éditables, avec une très haute précision de reconnaissance.

       Readiris Pro reconnaît aussi les PDF et les fichiers images les plus répandus. Il transforme vos fichiers en texte éditable, fichier excel, pdf, xml et même html.

 

 

LIMITATIONS

 

    1 - Ecrans de harcèlement (Nag-screen) au démarrage.
    2 - Fermeture de l'application au dela de 30 jours d'utilisation
    3 - Logo au démarrage

 

LES OUTILS

 

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
Pour éditer l'exécutable et modifier certains octets dans le but de la cracker. On cherche l'offset trouvé dans Windasm 8.9 impliqué dans la protection et on utilise ce même offset dans WinHex pour effectuer physiquement la modification.

 

ASSEMBLEUR

 

Offset
 Déplacement depuis le début de la zone de code d'un programme.

EB
      Code hexadécimal correspondant en assembleur à un saut inconditionnel (jmp).
             On saute tout le temps vers un endroit du code.

90
      Code hexadécimal correspondant en assembleur à une instruction à rien (= nop = No OPeration). 

 

LE CRACK

 

         Détail des modifications readiris.exe

OctetAdresse OffsetOriginalCrackéEffet
1

004903CB

903CB

E890Suppression du nag screen.

2

004903CC

903CC

70

90

Suppression du nag screen.

3

004903CD

903CD

72

90

Suppression du nag screen.

4

004903CE

903CE

FA

90

Suppression du nag screen.

5

004903CF

903CF

FF

90

Suppression du nag screen.
6

0045FEBD

5FEBD

2900

Retrait du time limit.

7

00490469

90469

B3

D3

Retrait du logo.

8

0049046A

9046A

F1

DA

Retrait du logo.

 

ANALYSE  DU  PROGRAMME

 

        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
          :004376B9 FF1508FB6500            Call dword ptr [0065FB08]

          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
          :004376B9 FF1508FB6500            Call dword ptr [0065FB08]

         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.

 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00437659(C)
 
:004376A98B4514 mov eax, dword ptr [ebp+14]
:004376AC50 push eax
:004376AD8B4D10 mov ecx, dword ptr [ebp+10]
:004376B051 push ecx
:004376B18B550C mov edx, dword ptr [ebp+0C]
:004376B452 push edx
:004376B58B4508 mov eax, dword ptr [ebp+08]
:004376B850 push eax
 
* Reference To: USER32.MessageBoxA, Ord:01BEh
 
:004376B9FF1508FB6500 Call dword ptr [0065FB08]

 

         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

 

:0043765785C0 test eax, eax
:00437659744E je 004376A9
:0043765B8B4D10 mov ecx, dword ptr [ebp+10]
 

          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.

 

* Referenced by a CALL at Addresses:
|:00402CE3 , :0040301B , :00404DDF , :00406689 , :004068DE
|:0040716B , :0040CB13 , :0040CDDF , :00412500 , :0041E03C
|:0041E5B5 , :0041EF0B , :0041F91D , :0041F9CD , :004385E9
|:00438740 , :00451B64 , :00451CA1 , :004549E4 , :004549FF
|:0045F3D5 , :0045F69E , :0045F985 , :0045FBFA , :0045FC94
|:0046AACE , :0046AB62 , :00484039 , :00485A67 , :00487329
|:00487565 , :00489DC9 , :0048B4A1 , :0048B60A , :0048C0B8
|:0048C17F , :0048CF40 , :0048D4FE , :0048DE08 , :0048E161
|:004903CB , :004904B0 , :0049050A , :0049055F , :00490D8E
|:0049152A , :004917D2 , :004919FD , :004920E2 , :00492210
|:004922FE , :004923AA , :004928F6 , :00492C9A , :00493A17
|:00493E1B , :0049512D , :00495517 , :00496DB2 , :00496E8A
|:004989E4 , :00499184 , :004994AB , :00499860 , :00499A1B
|:0049A729 , :0049AAC3 , :0049BA58 , :0049D2DF , :0049D2F9
|:0049D313 , :0049D32D , :0049D51F , :0049D572 , :0049D58C
|:0049E63B , :004A0C0E , :004A1103 , :004A88CA , :004B739C
|:004B7ACB
 
:0043764055 push ebp
:004376418BEC mov ebp, esp
:0043764383EC48 sub esp, 00000048
:0043764653 push ebx
:0043764756 push esi
:0043764857 push edi
:00437649C745FC00000000 mov [ebp-04], 00000000
:004376500FBE0514DE6400 movsx eax, byte ptr [0064DE14]
:0043765785C0 test eax, eax
:00437659744E je 004376A9
...
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00437659(C)
 
:004376A98B4514 mov eax, dword ptr [ebp+14]
...
* Reference To: USER32.MessageBoxA, Ord:01BEh
 
:004376B9FF1508FB6500 Call dword ptr [0065FB08]
...
:004376CBC3 ret

 

          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
          :004903D0 83C410                       add esp, 00000010

          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
          remplacé par
          :004903CB 90                                nop
          :004903CC 90                                nop
          :004903CD 90                                nop
          :004903CE 90                                nop
          :004903CF 90                                nop

          Remarque : l'adresse 004903CB où commence le call 00437640 est bien dans la liste des 81 adresses trouvées.

          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

 

* Reference To: USER32.ShowWindow, Ord:026Ah
 
:004902DCFF15A8FB6500 Call dword ptr [0065FBA8]
...
 
* Reference To: USER32.UpdateWindow, Ord:0291h
...
:0049030BE8F0F6FCFF call 0045FA00
:0049031083C408 add esp, 00000008
:0049031385C0 test eax, eax
:004903157507 jne 0049031E
:0049031733C0 xor eax, eax
:00490319E9A9040000 jmp 004907C7
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00490315(C)
 
:0049031EE86DFBFCFF call 0045FE90
:0049032385C0 test eax, eax
:004903257558 jne 0049037F
...
:004903426A1E push 0000001E
:004903448D85F4FAFFFF lea eax, dword ptr [ebp+FFFFFAF4]
:0049034A50 push eax
:0049034B8D8DF0FBFFFF lea ecx, dword ptr [ebp+FFFFFBF0]
:0049035151 push ecx
 
* Reference To: USER32.wsprintfA, Ord:02ACh
 
:00490352FF15F8FB6500 Call dword ptr [0065FBF8]
...
* Reference To: USER32.GetFocus, Ord:0107h
 
:00490369FF15ACFB6500 Call dword ptr [0065FBAC]
:0049036F50 push eax
:00490370E86B73FAFF call 004376E0
:0049037583C410 add esp, 00000010
:0049037833C0 xor eax, eax
:0049037AE948040000 jmp 004907C7
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00490325(C)
 
:0049037F68FA000000 push 000000FA
...
 
* Reference To: KERNEL32.FindClose, Ord:0090h
:004907A9FF15F8F36500 Call dword ptr [0065F3F8]
...
 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048FBB8(U), :0048FBEE(U), :0048FFF1(U), :0049011F(U), :00490319(U)
:0049037A(U),:004904BF(U), :00490514(U), :00490569(U)
 
:004907C75F pop edi
...
:004907CDC3 ret
 

         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.
         -> En 00490370 affichage dans une messageBox du message "Période d'évaluation de 30 jours terminée.Veuillez contacter votre revendeur".

         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.

 

* Referenced by a CALL at Addresses:
|:00465A9D , :00485A74 , :004869BF , :0049031E
 
:0045FE9055 push ebp
...
:0045FEB283C404 add esp, 00000004
:0045FEB58945F0 mov dword ptr [ebp-10], eax
:0045FEB8837DF000 cmp dword ptr [ebp-10], 00000000
:0045FEBC7529 jne 0045FEE7
...
:0045FECD50 push eax
:0045FECE6A01 push 00000001
:0045FED0E8DBDDFFFF call 0045DCB0
...
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045FEBC(C)
 
:0045FEE7837DF00A cmp dword ptr [ebp-10], 0000000A
...
:00460002E819030000 call 00460320
:0046000783C40C add esp, 0000000C
:0046000A85C0 test eax, eax
:0046000C7C07 jl 00460015
:0046000EB801000000 mov eax, 00000001
:00460013EB26 jmp 0046003B
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0046000C(C)
 
:00460015C645DC30 mov [ebp-24], 30
...
:0046003933C0 xor eax, eax
 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0045FEEF(U), :0045FF28(U), :0045FF48(U), :0045FF58(U), :0045FF68(U)
:0045FF78(U),:0045FF8F(U), :00460013(U)
 
:0046003B5F pop edi
:0046003C5E pop esi
:0046003D5B pop ebx
:0046003E8BE5 mov esp, ebp
:004600405D pop ebp
:00460041C3 ret

 

         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é
        HKCR\CLSID\{178e49f9-55e3-40f5-b10d-c254ea8a7d71}\ClassData\rua01y

 

        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).
        -> La fonction showwindow sur laquelle on va poser des breakpoints sous softice est une fonction très utilisée par windows.Si vous ne voulez par être harcelé toutes les secondes par softice qui break sur showwindow tapez dans la barre de commande de softice la commande bc* pour annuler tous les breakpoints posé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.

 

* Referenced by a CALL at Addresses:
|:0048DF93 , :00490468
 
:0048F62055 push ebp
...
 
* Reference To: USER32.CreateDialogParamA, Ord:004Fh
 
:0048F653FF1548FB6500 Call dword ptr [0065FB48]
...
:0048F664C3 ret

 

       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).

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049045F(C)
 
:00490468E8B3F1FFFF call 0048F620
 

       Et en 0048DF93 qu'est ce qu'il y a d'intéressant ?

 

* Referenced by a CALL at Addresses:
|:00401468 , :00402197 , :0040884B , :00408928 , :0040992F
|:00410594 , :0045343E , :004535A9 , :004567BC , :0045744C
|:0047CDE1 , :0047DA99 , :00485BF0 , :00490CE6 , :00490DB6
|:00491164 , :004A2558 , :004A3A28
 
:0048DF4055 push ebp
...
 
* Reference To: USER32.DestroyWindow, Ord:008Eh
 
:0048DF7AFF15E8FB6500 Call dword ptr [0065FBE8]
:0048DF80C705C87D650000000000 mov dword ptr [00657DC8], 00000000
:0048DF8A833D747F650000 cmp dword ptr [00657F74], 00000000
:0048DF91740A je 0048DF9D
:0048DF93E888160000 call 0048F620
 

       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
       
devient
       :00490468   E8D3DAFFFF            call 0048DF40

       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 ?
    
  Voici le calcul  :

      Adresse de la prochaine instruction à exécuter après 00490468 = 0049046D
      0049046D - 0048DF40 = 252D (adresse début - adresse arrivée car adresse arrivée < adresse début)
      FFFFFFFF - 252D + 1 = FFFFDAD3
      Ensuite on renverse tous les bytes FF,FF,DA,D3 cela donne D3DAFFFF.
      Ce code D3DAFFFF signifie simplement que l'on fait un saut de 252D bytes en arrière depuis 0049046D.

 

 

CONCLUSION

 

         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.
Et à bientôt pour de nouveaux cours.
Pifoman

 



pifoman




Nombre de visites depuis le 26/02/2005