Une
"Ready Made Protection"
Sales Agent
by Christal
(avec la participation de Neutral AtomX et Psyché)


Introduction

Sales Agent est une protection commerciale adoptée par plusieurs "Grands" de l'informatique comme SYMANTEC (Norton Utilities), MACROMEDIA (DreamWeaver 2, Director 7, Flash 3), et ADOBE (Image Styler, Image Ready).
Cet essai va tenter de faire un petit tour d'horizon de cette protection:

Tools
Soft Ice
W32dasm
Filemon
Regmon

Cibles
Macromedia DreamWaever 2.0
  Director 7
  FireWorks 2
  Flash 3
   
Adobe Image Ready 1.0 (French Version)
  Image Styler 1.0
   
Symantec Norton Utilities (courtesy of Goth)

URL/FTP
Macromedia http://www.macromedia.com/fr/Software/downloads
Adobe http://www.adobe.com/newsfeatures/tryadobe/main.html
Symantec http://www.symantec.com/region/fr/product/nu
SalesAgent http://www.releasesoft.com

Historique

Il semblerait qu'il y ait eu 3 versions de SalesAgent, bien que Release Software Corp, sur son site, n'en fasse mention que de 2.
SalesAgent permet de distribuer des applications en période d'essai pour une durée limitée. A la fin de la période d'essai, il y a blocage du lancement de l'application avec possibilité de procéder à un achat en ligne pour déverrouiller l'application. Tout ceci est paramétrable par la société qui veut distribuer son produit sous la forme 'Try before you buy".
La protection est faite par conversion de l'exécutable d'origine en un fichier ayant dl_ (ie director.dl_) comme extension, et qui sera décompressé lors de l'enregistrement de l'utilisateur.

Essai

Suivant les programmes protégés par SalesAgent que vous rencontrerez, vous aurez tout ou partie des cas de figure suivant:

1- mise en place d'une clé de blocage à la fin de la période d'essai
2- mise en place d'une clé de blocage en cas de mouvement de l'horloge (avant/arrière)
3- il semblerait qu'une clé de blocage supplémentaire soit mise en place si le checksum de SalesAgent a détecté une modification de son exécutable. Cette clé resterait valide, même en replaçant un exécutable non modifié dans le répertoire de l'application.
4- option d'enregistrement (Buy Now) par l'entrée d'un sérial, si l'option a été configurée
5- décompression d'un fichier dl_ en cas d'enregistrement, et transformant le Shareware en full version


1- La clé de blocage Time-limit: l'exemple de Adobe Image Ready

(Courtesy of Neutral AtomX )

Afin de savoir comment cette clé de blocage peut se mettre en place, j’ai lancé Filemon et Regmon avec pour option la capture de tous les événements. Puis j’ai procédé à l’installation du produit. Dès la fin de l’installation, j’ai sauvegardé les informations recueillies par Filemon et Regmon . (et il y en a un gros paquet !).

1) La consultation des fichiers générés par FILEMON et REGMON :
Afin de consulter facilement cette masse d’information ,j’ai importé les fichiers texte générés dans une feuille Excel, ajouté une ligne avec des en-têtes de colonne et utilisé l’option " données / Filtre / Filtre automatique ". On obtient alors une mini base de données avec des listes déroulantes qui permettent de choisir les critères de recherche d’information. Par exemple : afficher tous les événements " SetValueEx " survenus dans la base de registre par tous les process ou par un process donné, ou bien afficher tous les événements générés par le process " Imageready.exe ", etc...
A chaque fois les infos sont sauvegardées sur une feuille Excel, ce qui permet par la suite de comparer les événements en fonction des étapes ( install, lancement, time expired )

Un premier examen de ces informations permet de se faire une idée générale de qui fait quoi, et où, mais ce n’est pas suffisant.

2) Capture des événements au lancement de ImageReady.exe
Même technique : on lance Regmon et Filemon puis on ouvre ImageReady pour la première fois.
Dès qu’on arrive sur l’écran Shareware, (" il reste 30 jours ... "), on effectue la sauvegarde des infos récupérées pour les importer dans Excel. On clique sur annuler pour ne pas lancer l’application.
Un examen sur les " SetValueEx " nous permet de détecter des accès à la clé (suspecte) [HKEY_CLASSES_ROOT\ultxfile\Format\MSHA0J0V] avec 3 entrées ("xlate" ; "write" ; "open") déjà aperçue dans la première étape.
Pour Adobe Image Styler ces accès se feront dans
[HKEY_CLASSES_ROOT\ultxfile\Format\MSH0OF3E], pour Director 7 dans MSLXZWX, dans MSHLWV6 pour FireWorks 2 et pour Flash3 MSHVV33C


Une première précaution à l’aide de REGEDIT.EXE consiste à se positionner sur cette clé et la sauvegarder sous le nom suivant : utlxfile_J+0.reg. (J+0 : jour de l’installation).On pourra ainsi restaurer cette clé si nécessaire.

Changement de la date système : on avance d’un jour l’horloge. (J+0 à J+1)
On relance filemon et regmon puis ImageReady.exe. L’écran affiche " il reste 29 jours ... ".
Comme pour les fois précédentes on sauve les infos récupérées. Un examen de ces événements nous indique les mêmes accès à la base de registre.
On sauvegarde le contenu de la clé [HKEY_CLASSES_ROOT\ultxfile\Format\MSHA0J0V] sous le nom suivant : utlxfile_J+1.reg.
A l’aide de HexWorks32.exe on compare le contenu de ces deux fichiers et on s’aperçoit (comme on s’y attendait) que seulement certains octets ont été modifiés (dans l’entrée "write" = hex : .." )

3) Capture des événements à l’expiration de la période d’essai (j+31)
Changement de la date système : on avance de 31 jours l’horloge. (J+0 à J+31)
Toujours pareil, on prépare l’environnement de capture puis on lance l’application qui cette fois-ci nous indique que la période est expirée, et on n’a plus d’autre choix que de quitter.
On examine dans Excel les données importées et on repère de nouveaux accès :
filemon : action write sur le fichier C:\3l6fao30.sys (fichier caché) pour Image Ready , C:\330M0V4N.sys pour Image Styler, C:\330M0V4N.sys pour Flash3, C:\330T36E3.sys pour Director 7et C:\330T36E3.sys pour FireWork 2

Ainsi que des accès au fichier C:\windows\system\RSAPIERR.txt mais qui est toujours vide !. (du moins jusqu’à maintenant...)

4) Désinstallation de ImageReady
Cà y est, la clé de blocage est mise en place par Sales Agent !
On désinstalle ImageReady complètement et dès que c’est terminé, on regarde ce que sont devenus ces 3 suspects...
BINGO ! les trois suspects sont toujours là !
· C:\3l6fao30.sys
· C:\windows\system\RSAPIERR.txt
· [HKEY_CLASSES_ROOT\ultxfile\Format\MSHA0J0V]

Par conséquent pour pouvoir effectuer un ré-installation propre il suffit de supprimer ces trois coupables.



Time-limit Sales Agent : Pour jouer en toute sécurité avec les dates

Si vous avez l’intention de manipuler les dates dans tous les sens pour observer le comportement de la protection, voici les précautions et manipulations qui vous éviterons d’avoir à désinstaller ImageReady à chaque fois.

· Dès le premier lancement de l’application, effectuer une sauvegarde de la clé [HKEY_CLASSES_ROOT\ultxfile\Format\MSHA0J0V] vous aurez ainsi la possibilité en double cliquant sur le fichier " utlxfile_J+0.reg " de revenir à la situation normale (J+0).
· Supprimer le fichier C:\3l6fao30.sys dès que vous avez déclenché l’expiration. Il sera automatiquement recréé par Sales Agent au lancement suivant (avec les informations correctes)
· Effacer le contenu du fichier C:\windows\system\RSAPIERR.txt si celui-ci a été modifié.(cela arrive entre autre, quand la date de l’horloge est inférieure à la date de l’installation) Généralement vous êtes prévenus par une messagebox " Ressources Sécurité Altérées : l’horloge interne etc.. "

Comment Sales Agent exploite-t-il tout celà ?

La date d’installation est sauvegardée dans la clé HKEY_ .. Format\MSHA0J0V
A chaque lancement, il vérifie que la date courante est supérieure à la date d’installation et à la date du dernier lancement de l’application. Si tout est cohérent, il écrase la date du dernier lancement par la date courante.
Ce qui explique que l’on peut avancer l’horloge ex : J+10 pour visualiser le décompte des jours restant, mais qu’on ne peut plus revenir en arrière ex : J+9 sous peine de blocage par " Ressources Sécurité Altérées : l’horloge interne etc.. ".
Dans ce cas là, le bouton d’accès à l’application devient inaccessible et une erreur est décrite dans le fichier C:\windows\system\RSAPIERR.txt .
Voici un exemple de ce que l’on peut y trouver :
" func - tSystemValidityCheck() , system time - 936738923 saved time - 939503697
tUpdate() status -> RS_APP_STATUS_TAMPERED event -> RS_EVENT_SYS_T_INVALID subreason -> tSystemValidityCheck() "
Dès que l’on atteint la date d’expiration, c’est terminé, le fichier C:\3l6fao30.sys est modifié irrémédiablement pour bloquer l’ensemble.


2- Checksum et Contrôles

Toutes les versions de salesAgent n'en sont pas équipées, mais c'est le cas pour Image Styler, Image Ready, et Director (probablement la version 2 de salesAgent)
Si vous modifiez le loader Director.exe, par exemple, le checksum s'activera en affichant une boite de message "Important application files are missing or corrupted ...". Un breakpoint sur MessageBoxA va permettre de localiser les lignes suivantes:

 * Possible StringData Ref from Data Obj ->"^^L;dIZ8"
 
 :0040AB7E E86D980000              call 004143F0
 :0040AB83 83C408                  add esp, 00000008
 :0040AB86 83F801                  cmp eax, 00000001
 :0040AB89 7458                    je 0040ABE3		         > no jump
 :0040AB8B 6869010000              push 00000169
 :0040AB90 E8BB9B0000              call 00414750
 :0040AB95 83C404                  add esp, 00000004
 :0040AB98 6810200000              push 00002010
 :0040AB9D 6A00                    push 00000000
 :0040AB9F 68A4584500              push 004558A4
 :0040ABA4 6A00                    push 00000000
 :0040ABA6 FF1598224300            Call USER32.MessageBoxA  >nag 

En inversant le branchement en 0040AB89, vous passez ce premier contrôle. Le programme va ensuite effectuer un deuxième contrôle, et a nouveau faire surgir une MessageBox "important application files...":

 :0040ABE8 E833A2FFFF              call 00404E20
 :0040ABED 85C0                    test eax, eax
 :0040ABEF 7537                    jne 0040AC28		       > no jump
 :0040ABF1 6869010000              push 00000169
 :0040ABF6 E8559B0000              call 00414750
 :0040ABFB 83C404                  add esp, 00000004
 :0040ABFE 6810200000              push 00002010
 :0040AC03 6A00                    push 00000000
 :0040AC05 68A4584500              push 004558A4
 :0040AC0A 6A00                    push 00000000
 :0040AC0C FF1598224300            Call [USER32.MessageBoxA]  >nag 

En inversant le branchement en 0040ABED, vous allez provoquer un premier plantage de Director.exe, et SoftIce va apparaître en affichant "Break due to general protection fault":
Après avoir remis en place un exemplaire de Director.exe, vierge de toute modification, le programme va passer ces deux contrôles sans problème (jump). Le loader de Director va ensuite vérifier C:\windows\system\RSAXXXX.txt, et en fonction de ce qu'il y trouve, va afficher une DialogBoxParamA "Due To Security problems, your free trials...", que vous ayez ou non avancé/reculé votre horloge:

 0137:004149ED  FF15D4224300        CALL    [USER32!DialogBoxParamA]
 0137:004149F3  A1ECFF4400          MOV     EAX,[0044FFEC]
 0137:004149F8  85C0                TEST    EAX,EAX
 0137:004149FA  7443                JZ      00414A3F
 0137:004149FC  A110004500          MOV     EAX,[00450010]
 0137:00414A01  50                  PUSH    EAX 

Puis il va lancer son écran Shareware avec 2 boutons, Try et Cancel, dont le premier est grisé si l'une des clés de blocage a été mise en place.



3- Les différentes Options

L'état des lieux étant à priori fini, comment débloquer l'application?

Une première méthode, mais qui manque d'élégance, serait de replacer tous les trente jours, la clé de la base de registre " utlxfile_J+0.reg ".

Une seconde méthode, si l'option a été prévue à l'origine, serait de jouer avec la boite d'enregistrement:

Macromedia Flash 3: La boite d'enregistrement

A la fin de la période d'essai, et pour peu que vous n'ayez pas avancé/reculé votre horloge, vous verrez un troisième bouton apparaître dans l'écran shareware: "Buy Now". En cliquant sur ce bouton, vous aurez accés à la possibilité de vous enregistrer:
Cet enregistrement est en deux temps :

- Une première boite d'enregistrement gérée par Rsagnt32.dll (SalesAgent)
- Une deuxième boite d'enregistrement liée à Flash3, ou à FireWorks, les deux programmes étant sur le même principe.

RSAGNT32.Dll (525 ko) : Dead Listing

Au lancement de Flash 3, le Setup vous proposera le choix entre essayer ou acheter le logiciel. Si vous cliquez sur " Buy Now ", différents écrans vont vous être proposés : Vous aurez à entrer vos coordonnées (Nom, Prénom, Company), puis les références de votre carte de crédit. Si vous voulez vous débarrasser de cet écran, il suffit de poser un bpx MessageBoxA dans SoftIce et de cliquer sur suivant. En l'absence des informations requises, une boite de message est sensée apparaître. Softice marquera un break avant son apparition. Faites F12 pour revenir à Rsagnt32, et finissez en posant un bpx sur le saut (jz) quelques lignes plus haut. Au prochain passage, un R FL Z tapé sur la ligne de commande du débuggeur vous epargnera d'avoir à remplir cet écran.
Après désassemblage de cette Dll dans W32dasm, la boite des " String Data References " va apporter un certain nombre d'informations dont les plus intéressantes sont:

- SalesAgent Demo
- This is a demo. Unlocking
- Sorry, that unlocking code is not valid for this program
- Invalid Unlocking Code


-> il est à noter que ces informations se retrouvent, à peu de chose près, dans les différents Rsagnt, qu'il y ait ou non l'option Buy Now de paramétrée.


Par contre pas de string du genre " Thank You... "
Dans le listing qui va suivre, vous aurez l'exemple typique de la protection où toutes les informations se trouvent les unes à coté des autres. C'est à partir de ces lignes que la solution va apparaître...

* Referenced by a CALL at Address:
|:1000543B   
|
:100055A0 A170160310              mov eax, dword ptr [10031670]
:100055A5 81EC70020000            sub esp, 00000270
:100055AB 85C0                    test eax, eax
:100055AD 53                      push ebx
:100055AE 55                      push ebp
:100055AF 56                      push esi
:100055B0 57                      push edi
:100055B1 7533                    jne 100055E6  -> vers la saisie des champs de la BE
:100055B3 8B842484020000          mov eax, dword ptr [esp+00000284]
:100055BA 6A40                    push 00000040

* Possible StringData Ref from Data Obj ->"SalesAgent Demo"
* Possible StringData Ref from Data Obj ->"This is a demo. Unlocking"
* Reference To: USER32.MessageBoxA, Ord:0195h 
* Reference To: USER32.GetDlgItemTextA, Ord:00F5h -> saisie des champs
                                  |
:100055ED 8B1DB8950310            mov ebx, dword ptr [100395B8]
:100055F3 6A0B                    push 0000000B
:100055F5 68400E0310              push 10030E40
* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."
                                  |
:1000561A 6890180210              push 100

Si vous fouillez dans les calls appelés entre les adresses 100055ED et 1000561A, vous avez des chances de trouver l'écho du code de déblocage, mais il y a plus simple.
Ce call est appelé de l'offset 1000543B. Un saut conditionnel pourrait peut être éviter d'y passer, ce qui serait logique si vous étiez un utilisateur licencié…

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100053C8(C)
|
:10005436 8B742448                mov esi, dword ptr [esp+48]
:1000543A 56                      push esi
:1000543B E860010000              call 100055A0 --> call à éviter

Et il semblerait bien qu'un tel saut existe !

:100053C7 48                      dec eax
:100053C8 746C                    je 10005436 -> ici
:100053CA 48                      dec eax
:100053CB 7443                    je 10005410
:100053CD 2D44040000              sub eax, 00000444
:100053D2 0F850D010000            jne 100054E5
:100053D8 8B742448                mov esi, dword ptr [esp+48]
:100053DC 6A44                    push 00000044

Possible StringData Ref from Data Obj ->"Re-register"
Pour vérifier cette belle théorie, contrôlons avec SoftIce en posant un bpx en 100053C8.et un autre en 100055B1. A chaque break une inversion de l'état du zero-flag (R FL Z) va suffir

Voilà!
La première étape est terminée, sans même à devoir utiliser un HexEditeur.

FLASH3.exe : Live approach

A partir de maintenant, c'est Flash3 qui prend le relais. Sales Agent est Out !
En arrivant enfin à Flash3, vous allez découvrir la deuxième boite d'enregistrement : Nom, Prénom, Company, et un numéro d'enregistrement devant commencer par FLW300-

Les choses vont se compliquer un peu : Flash3 doit avoir sa propre protection contre le désassemblage.
Pas de String Data références, pas de code. Juste les Strings DialogBox, les modules importés et exportés, et " l'Entry Point " du programme commence en 00494150. Habituellement celui ci est en 00401000

Après avoir remplie la boite d'enregistrement et posé un Bpx GetWindowtextA., au break, faites F12 pour remonter à Flash3.exe. Vous serrez en 004B9490.
En traçant avec F10 dans SoftIce, vous reviendrez 5 fois à cet offset avant de voir s'afficher la boite " This macromédia product cannot run without your name and sérial number… " en 00541639.

0177:00541609  E8F2FAFFFF          CALL      00541100
0177:0054160E  83C404              ADD       ESP,04
0177:00541611  8945E8              MOV       [EBP-18],EAX
0177:00541614  85C0                TEST      EAX,EAX
0177:00541616  7531                JNZ       00541649 
0177:00541618  8D4DF0              LEA       ECX,[EBP-10]
0177:0054161B  E8E5C4F6FF          CALL      004ADB05
0177:00541620  687F020000          PUSH      0000027F
0177:00541625  8D4DF0              LEA       ECX,[EBP-10]
0177:00541628  C645FC03            MOV       BYTE PTR [EBP-04],03
0177:0054162C  E876E0F6FF          CALL      004AF6A7
0177:00541631  6A00                PUSH      00
0177:00541633  8B45F0              MOV       EAX,[EBP-10]
0177:00541636  6A30                PUSH      30
0177:00541638  50                  PUSH      EAX
0177:00541639  E8A07AF7FF          CALL      004B90DE  -> nag

En remontant de quelques lignes, le jnz 00541649 évite ce méchant call. Ce branchement est fonction d'un test eax, eax. Dans la très grande majorité des cas, c'est dans le call qui précède que la valeur de ce registre est implementée.
Posons un bpx 00541609, et sortons de Softice (F5)
A la validation suivante de la boite d'enregistrement, vous aurez sûrement la curiosité de faire un " d ecx " pour jeter un coup d'œil dans le contenu de ce registre, avant de partir à la recherche des manipulations sur eax dans le call repéré.
Ce n'est pas le bon sérial qui s'y trouve, mais notre code. Donc le call 00541100 est probablement celui qui va contrôler la validité de celui ci.

Vous allez arriver dans une toute petite procédure avec un call 0045A520

0177:0045A520  83EC20              SUB       ESP,20
0177:0045A523  8D442410            LEA       EAX,[ESP+10]
0177:0045A527  53                  PUSH      EBX
0177:0045A528  8D4C2420            LEA       ECX,[ESP+20]
0177:0045A52C  56                  PUSH      ESI
0177:0045A52D  57                  PUSH      EDI
0177:0045A52E  33F6                XOR       ESI,ESI
0177:0045A530  8D542420            LEA       EDX,[ESP+20]
0177:0045A534  50                  PUSH      EAX
0177:0045A535  8D442428            LEA       EAX,[ESP+28]
0177:0045A539  51                  PUSH      ECX
0177:0045A53A  8D4C2414            LEA       ECX,[ESP+14]
0177:0045A53E  52                  PUSH      EDX
0177:0045A53F  8B54243C            MOV       EDX,[ESP+3C]
0177:0045A543  50                  PUSH      EAX
0177:0045A544  89742424            MOV       [ESP+24],ESI
0177:0045A548  51                  PUSH      ECX
0177:0045A549  8974242C            MOV       [ESP+2C],ESI
0177:0045A54D  52                  PUSH      EDX
0177:0045A54E  E8CD000000          CALL      0045A620
0177:0045A553  83C418              ADD       ESP,18
0177:0045A556  85C0                TEST      EAX,EAX
0177:0045A558  0F84B3000000        JZ        0045A611

En traçant un peu (F10), le JZ 0045A611 va vous envoyer ici :

0177:0045A608  3BF8                CMP       EDI,EAX
0177:0045A60A  7505                JNZ       0045A611
0177:0045A60C  BE01000000          MOV       ESI,00000001
0177:0045A611  8BC6                MOV       EAX,ESI -> ici
0177:0045A613  5F                  POP       EDI
0177:0045A614  5E                  POP       ESI
0177:0045A615  5B                  POP       EBX
0177:0045A616  83C420              ADD       ESP,20
0177:0045A619  C3                  RET

A la fin de la procédure, EAX sera égale à 0
Si vous êtes impatient, vous pouvez en finir dès maintenant avec ce crack, en remplaçant JZ 0045A611 (0F84B3000000), par JZ 0045A60C (0F84AE000000). Vous forcerez ainsi EAX = 1, le saut suivant en 00541616 vous sera favorable, et vous démarrerez la décompression en version enregistrée.

Mais j'aime bien comprendre…
Et puis avec un peu de chance, trouver le bon sérial…

Sur le même principe que précédemment, je vais visiter le CALL 0045A620, à la recherche de manipulation sur EAX :

0177:0045A871  39442414            CMP       [ESP+14],EAX
0177:0045A875  7409                JZ        0045A880  (NO JUMP)
0177:0045A877  33C0                XOR       EAX,EAX
0177:0045A879  5F                  POP       EDI
0177:0045A87A  5E                  POP       ESI
0177:0045A87B  5B                  POP       EBX
0177:0045A87C  83C43C              ADD       ESP,3C
0177:0045A87F  C3                  RET

En 0045A875, le (NO JUMP) va mettre 0 dans EAX. Pas intéressant!
Et que donnerait une inversion de ce branchement ?
Et bien en traçant encore un peu, on arrive à :

0177:0045A8D0  B801000000          MOV       EAX,00000001
0177:0045A8D5  5F                  POP       EDI
0177:0045A8D6  5E                  POP       ESI
0177:0045A8D7  5B                  POP       EBX
0177:0045A8D8  83C43C              ADD       ESP,3C
0177:0045A8DB  C3                  RET

Parfait ! Celui là me plait bien. Un octet à modifier, c'est exactement ce qu'il me faut, parce que maintenant il va falloir chercher comment le modifier, l'exécutable de Flash3 !

Pour en avoir le cœur net, j'ai quand même lancé mon éditeur hexadécimal, et recherché la chaîne 740933C05F5E (pour le JZ 0045A880 à modifier en JNZ). Et je l'ai trouvé ! Puis modifié sans problème, sauvé Flash3, et au lancement suivant de l'application : tout GOOD !

J'ai quand même été surpris : des gens qui empêchent le désassemblage d'un exécutable, ne semblent pas imaginer que l'on puisse utiliser un débuggeur?
Pas de cryptage, pas d'encodage, pas même un petit checksum, dans cette version de SalesAgent?
Moi qui m'attendais à une lutte plus serrée !

Au fait, le bon sérial est FLW300-01567-53532-72983
Mais c'est une autre histoire…

Sur un schéma de protection identique, vous avez aussi DreamWeaver 2.0

Macromedia DreamWeaver 2.0

A l'installation, le Setup propose de remplir une boite d'enregistrement avec un numéro de série. Dans le cas de ces grandes compagnies, ces numéros de série ne sont pas, la plupart du temps, fonction du nom que vous aurez entré, mais d'un sérial codé quelque part.
A ce niveau, vous pouvez déjà attaquer la recherche de l'écho de ce sérial. Je m'y suis pris de cette façon la première fois, et j'ai trouvé assez rapidement. Mais il y d'autre manière bien plus facile…

Une fois installé, DreamWaever vous proposera à nouveau de rentrer un sérial. Si vous ne le faites pas, vous aurez toujours la possibilité de vous enregistrer en passant par la barre des menus.

Comment repérer le mode de protection ?

Dans ce cas précis, j'ai repéré l'usage de Rsagnt32.dll lors de ma recherche d'écho du bon sérial. C'est cette dll qui gère les boite d'enregistrement.
Après désassemblage de cette Dll dans W32dasm, la boite des " String Data References " va apporter les mêmes informations que Flash3:

- SalesAgent Demo
- This is a demo. Unlocking
- Sorry, that unlocking code is not valid for this program
- Invalid Unlocking Code

Dans le listing qui va suivre, la solution va apparaître... (le schéma de protection est identique, mais la programmation diffère legerement de celle de Flash3)

Rsagnt.dll

|:1000575B   
|
:10005AE0 A1502B0310              mov eax, dword ptr [10032B50]
:10005AE5 81EC70020000            sub esp, 00000270
:10005AEB 85C0                    test eax, eax
:10005AED 53                      push ebx
:10005AEE 55                      push ebp
:10005AEF 56                      push esi
:10005AF0 57                      push edi
:10005AF1 7533                    jne 10005B26
:10005AF3 8B842484020000          mov eax, dword ptr [esp+00000284]
:10005AFA 6A40                    push 00000040

* Possible StringData Ref from Data Obj ->"SalesAgent Demo"
                                  |
:10005AFC 68A02A0210              push 10022AA0

* Possible StringData Ref from Data Obj ->"This is a demo. Unlocking"

Il faut maintenant faire parler le papier:

1- cette routine est appelée par un call en 100057B
2- en 10005AF1, un Jump_if_not_egal branche en 10005B26
3- ce saut est conditionné par le test eax, eax un peu plus haut
4- eax est fonction du contenu d'une adresse mémoire [10032B50]

Comment analyser ces informations ?

Au vu des StringData Ref, il est possible d'imaginer que la procédure " Unlocking " valide un code exacte, et que " Sorry, that unlocking... " sanctionne un code erroné, Non ?
Le test eax, eax va déterminer l'adresse où se rendra le programme, donc en fonction du résultat de ce test, vous irez soit en " code valide ", soit en " code invalide ".
Comme l'état de eax dépend de [10032B50], il va être intéressant de savoir à quel moment cette adresse mémoire va recevoir la valeur qui déterminera la validité de votre code.
La routine que vous avez pu étudier n'est que celle qui " termine " le contrôle de votre code. La vérification de la validité a été faite plus en amont, et le programme sait déjà si notre code est bon ou pas...
Pour le moment, deux pistes se présentent: Le call 10005AE0 qui appelle la routine, et trouver toutes les occurrences liées à l'adresse mémoire, avec la fonction " search " d'un éditeur de texte.

Commençons par la procédure qui appelle celle que nous venons déjà d'étudier:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100056E8(C)
|
:10005756 8B742448                mov esi, dword ptr [esp+48]
:1000575A 56                      push esi
:1000575B E880030000              call 10005AE0
:10005760 83C404                  add esp, 00000004
:10005763 85C0                    test eax, eax
:10005765 7553                    jne 100057BA
:10005767 8B15B42C0310            mov edx, dword ptr [10032CB4]
:1000576D 50                      push eax
:1000576E 56                      push esi
:1000576F 66C742020300            mov [edx+02], 0003
:10005775 A380120310              mov dword ptr [10031280], eax

Cette procédure est appelée par un branchement conditionnel en 100056E8. Intéressant!
Allons jeter un coup d'oeil...

:100056D6 0F84B0000000            je 1000578C
:100056DC 48                      dec eax
:100056DD 0F85FF000000            jne 100057E2
:100056E3 8B442450                mov eax, dword ptr [esp+50]
:100056E7 48                      dec eax
:100056E8 746C                    je 10005756
:100056EA 48                      dec eax
:100056EB 7443                    je 10005730
:100056ED 2D44040000              sub eax, 00000444
:100056F2 0F85EA000000            jne 100057E2
:100056F8 8B742448                mov esi, dword ptr [esp+48]
:100056FC 6A44                    push 00000044

* Possible StringData Ref from Data Obj ->"Re-register"
                                  |
:100056FE 6870280210              push 10022870

* Possible StringData Ref from Data Obj ->"You will have to resubmit payment "                               ->"information.  Continue?"


Il est temps de passer du papier à la pratique. Nous avons trois breakpoints à poser:

bpx 100056E8
bpx 10005AF1
bpm 10032B50 rw

Après chargement de DreamWeaver dans le Symbol Loader de Softice, et remplissage de tous les champs des différentes boites de dialogue, quel va être l'effet de ces points d'arrêt?

POP!

1er break, comme attendu, en 100056E8
Inversion du Zéro Flag, puis F5, et vous arriverez au deuxième breakpoint. Inversez à nouveau le drapeau (R FL Z), relancez par F5, et voilà, le programme est déverrouillé.
Comme Flash 3, Dreamweaver 2 est équipé d’une seconde boite de dialogue. La recherche du code à entrer dans celle ci ne pose pas beaucoup de problèmes :
Il existe des petits outils très pratiques, comme Super Snooper, qui va " lire " toutes les chaînes alphanumériques contenues dans un exécutable, et éviter une laborieuse recherche avec un éditeur hexadécimal

Super Snooper sur DreamWeaver.exe
Selected Browser
DWW200-05987-98274-58597
Receive Error: %d.
CWindowDC32
CPaintDC32

Le code est en toute lettre, non codé, dans l'exécutable. A défaut de Super Snooper, un désassemblage de DreamWaever.exe avec Wdasm me donne ce sérial dans l'une des " String data references " !
Comme quoi...



Adobe Image Styler et Adobe Image Ready: réactivation d'une option désactivée

L'accès à une boite d'enregistrement n'est pas prévue pour ces deux programmes.

Voici les Strings Data références que j'ai relevées en premier:
Adobe Image ready Adobe Image Styler
00405FF3	expired
00406B29	idem
004063D1	Trial
0040957E	Invalid Unlocking Code
0040751F	The sérial entered is incorrect
00407ACC	Thank You for purchassing
00407684	idem
00406241	Thank you for Trying
00405FF3
00406B29
00406B7C
004094E1 et 00409485
004074EF
004075C4
00407A0C
pas d'occurrence

Il y en a beaucoup d'autres qui pourraient être relevées, mais celles ci permettent de repérer la présence, quelque part, d'une boite d'enregistrement!

Mais Où est-elle?

Vous n'y avez pas accès par un des menus de la barre d'écran, et aucune combinaison de touches ne semble réussir à la faire surgir (rappelez vous l'une des premières versions de WinZip: il fallait faire CTRL-R, si je m'en souviens bien...). Et contrairement à Flash 3, elle n'apparaît pas à la fin de la période d'essai.

Elle est Là!

Comme dans les références de W32dasm, vous avez de nombreux "Buy Now", une référence bizarre (Turnkexe: voir l'essai sur
SalesAgent 3.0 de Goth), et tout ça en dessous de la chaîne TRIAL, si nous commencions par regarder un peu au dessus de cette dernière?

Adobe Image Styler

:00406386 8B842430010000          mov eax, dword ptr [esp+00000130]
:0040638D 3D10010000              cmp eax, 00000110
:00406392 0F8733040000            ja 004067CB -> 2 tests l'un au dessus de l'autre
:00406398 7418                    je 004063B2
:0040639A 83F80F                  cmp eax, 0000000F
:0040639D 0F84FD060000            je 00406AA0
:004063A3 33C0                    xor eax, eax
:004063A5 5F                      pop edi
:004063A6 5E                      pop esi
:004063A7 5D                      pop ebp
:004063A8 5B                      pop ebx
:004063A9 81C418010000            add esp, 00000118
:004063AF C21000                  ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406398(C)
:004063B2 A100124400              mov eax, dword ptr [00441200]
:004063B7 85C0                    test eax, eax
:004063B9 751E                    jne 004063D9
:004063BB A1C0E74300              mov eax, dword ptr [0043E7C0]
:004063C0 85C0                    test eax, eax
:004063C2 7415                    je 004063D9
:004063C4 A1A0BE4300              mov eax, dword ptr [0043BEA0]
:004063C9 8D8C24A4000000          lea ecx, dword ptr [esp+000000A4]
:004063D0 50                      push eax
* Possible StringData Ref from Data Obj ->"%s Trial"
:004063D1 68A4C74200              push 0042C7A4
:004063D6 51                      push ecx
:004063D7 EB14                    jmp 004063ED

* Possible Reference to Dialog: DialogID_07DB, CONTROL_ID:03F0, "&Buy Now"
                                  |
:0040647B 68F0030000              push 000003F0

* Possible StringData Ref from Data Obj ->"Essai"
                                  |
:00406486 6898C74200              push 0042C798

* Possible Reference to String Resource ID=00001: "Turnkexe"
                                  |
:0040648B 6A01                    push 00000001

Adobe Image Ready:

:00406376 8B8424DC000000          mov eax, dword ptr [esp+000000DC]
:0040637D 3D10010000              cmp eax, 00000110
:00406382 0F87AA030000            ja 00406732 -> on retrouve le même schéma!
:00406388 7418                    je 004063A2
:0040638A 83F80F                  cmp eax, 0000000F
:0040638D 0F8474060000            je 00406A07
:00406393 33C0                    xor eax, eax

Comparaison avec 110, et branchement si supérieur à, ou branchement si égale à. De 00406382,on peut sauter en 00406732, soit de 350: ça fait pas mal, non ?
Allons voir, en modifiant le ja 00406732 par un jmp 00406732.

Adobe Image Styler

:00406732 3D11010000              cmp eax, 00000111
:00406737 0F84F7000000            je 00406834
:0040673D 3D06020000              cmp eax, 00000206
:00406742 7463                    je 004067A7
:00406744 3D11030000              cmp eax, 00000311
:00406749 0F851A030000            jne 00406A69
:0040674F 6A00                    push 00000000
:00406751 6A00                    push 00000000
:00406753 53                      push ebx

et ici pour Image Ready

:004067CB 3D11010000              cmp eax, 00000111
:004067D0 0F84F7000000            je 004068CD
:004067D6 3D06020000              cmp eax, 00000206
:004067DB 7463                    je 00406840
:004067DD 3D11030000              cmp eax, 00000311
:004067E2 0F851A030000            jne 00406B02
:004067E8 6A00                    push 00000000
:004067EA 6A00                    push 00000000
:004067EC 53                      push ebx

Vous trouverez les explications de Psyché sur le cmp eax, 111 en ANNEXE 1

Revenons à notre dernier saut! Le JA 00406732

En regardant dans le Dead Listing, cette adresse branche sur Turnkexe, et sur les Control_ID de Buy Now...
On y va!
Inversion du branchement, et F5 pour voir...

Apparition de l'écran shareware, mais avec un bouton supplémentaire: Buy Now. Ah! Ah!
Ma boite d'enregistrement serait-elle derrière ce bouton?

Et oui!
A partir de maintenant, le schéma de la boite d'enregistrement va être le même que pour Flash3:

Rsagnt.dll pour Image Styler

* Reference To: USER32.GetDlgItemTextA, Ord:00F5h
                                  |
:1000B396 FF15B8950310            Call dword ptr [100395B8] -> vous êtes ici 
:1000B39C BFD0B50210              mov edi, 1002B5D0 -> votre code dans EDI 
:1000B3A1 83C9FF                  or ecx, FFFFFFFF
:1000B3A4 33C0                    xor eax, eax
:1000B3A6 F2                      repnz
:1000B3A7 AE                      scasb
:1000B3A8 F7D1                    not ecx
:1000B3AA 49                      dec ecx
:1000B3AB 83F90A                  cmp ecx, 0000000A 
-> ce code est-il de 10 caractères de long ?
:1000B3AE 743B                    je 1000B3EB
:1000B3B0 8B1554180310            mov edx, dword ptr [10031854]

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is "
                                        ->"not valid for this program."
                                  |
:1000B3B6 6898180210              push 10021898


Avant d'attaquer le tracing par F10, posez déjà un BPM EDI. Si vous passez sur un call qui sollicite le code que vous avez entré, vous en serez averti.
A chaque break, interrogez les registres, et recherchez l'écho du bon sérial. En Arrivant ici, vous pouvez vous dire qu'il se passe quelque chose:

Rsagnt.dll pour Adobe Image Styler

:1001FD4C 0AC0                    or al, al
:1001FD4E 742E                    je 1001FD7E
:1001FD50 8A06                    mov al, byte ptr [esi]
-> un caractère de ESI dans Al
:1001FD52 46                      inc esi 
-> prépare le caractère suivant
:1001FD53 8A27                    mov ah, byte ptr [edi] 
-> un caractère de EDI dans Ah
:1001FD55 47                      inc edi
-> prépare le caractère suivant
:1001FD56 38C4                    cmp ah, al
-> compare un caractère de ESI avec un caractère de EDI
:1001FD58 74F2                    je 1001FD4C
-> boucle si ah et al sont égaux (et va contrôler le caractère suivant)
-> les lignes suivantes vérifient la validité alpha numérique de votre sérial
:1001FD5A 2C41                    sub al, 41 -> lettre A
:1001FD5C 3C1A                    cmp al, 1A -> caractère à
:1001FD5E 1AC9                    sbb cl, cl 
:1001FD60 80E120                  and cl, 20 -> espace


Et pour Image Ready: (1001FAD2 pour Flash3)

:100203F0 8A06                    mov al, byte ptr [esi]
:100203F2 46                      inc esi
:100203F3 8A27                    mov ah, byte ptr [edi]
:100203F5 47                      inc edi
:100203F6 38C4                    cmp ah, al

Si il a un moment ou jamais ou il faut faire un "d edi", c'est bien maintenant:

Dans la fenêtre des Data, vous obtenez ceci:

Pour Image Ready Pour Image Styler
00 00  ............
00 00  0007467361..
00 00  489335......
00 00  HDWCNECCIY..
00 00  ............
00 00  ............
00 00  0009139365..
00 00  489335......
00 00  HDWIXJNCIM..
00 00  ............
Pour Flash 3  Pour FireWorks 2
00 00  ............
00 00  1009651719..
00 00  489335......
00 00  YFYRGJJXQC..
00 00  ............
00 00 ............
00 00 1002534786..
00 00 489335......
00 00 YFYBFLMXTM..
00 00 ............

(Il est à noter que les codes obtenus sont générés à partir du Nom que vous avez entré. Avis aux amateurs de keyGen)

489335, c'est le code que j'ai entré. Converti en hexadécimal, il donne 7777. De cette façon, si un des registres le charge, je le verrai facilement en surveillant la fenêtre Ad hoc.
Reste deux autres codes: l'un numérique, l'autre alphabétique.
On a vu que le code entré doit être de 10 caractères: Les deux répondent à ce critère.
Alors, lequel?

Quand vous interrogerez les String Data références, vous verrez une chaîne ayant cette forme: PYUXAHLLRQ.

* Possible StringData Ref from Data Obj ->"PYUXAHLLRQ"
                                  |
:004097B4 BD34D64200              mov ebp, 0042D634
:004097B9 83C408                  add esp, 00000008
:004097BC 2BF1                    sub esi, ecx
:004097BE 2BF9                    sub edi, ecx
:004097C0 2BE9                    sub ebp, ecx
:004097C2 2BC1                    sub eax, ecx
:004097C4 89442424                mov dword ptr [esp+24], eax
:004097C8 C74424200B000000        mov [esp+20], 0000000B

Numéro de série valable? Piège à gogo anti-pirate? Lieu de traitement du code entré ?
Comme je vous l'ai dit, j'ai recherché le bon sérial dans SoftIce, et je n'ai pas osé entrer ce numéro.
On est tous un peu paranoïaque! J'ai craint que ce numéro ne soit un piège à gogo, le genre de sérial que l'on rentre dans une boite et qui mène tout droit au blocage du logiciel... (GetRight, très bon logiciel lui aussi, utilise un attrape-pirates de ce type en proposant plusieurs références/sérial, mais sans autre conséquence qu'une boite de message...).

Bref! Entrez les codes alphabétiques que vous aurez trouvé:

* Possible StringData Ref from Data Obj ->"This file contains your registration "
->"name and serial number for %s."

Et vous verrez une boite: "Your payment was succesfully completed", puis un écran "Transfère des fichiers" ou quelque chose dans ce goût là. Le loader de Director/SalesAgent commence son travail de décompression du fichier Dl_, et finira son travail en supprimant toutes traces actives de la Time Trial. Le programme s'autopatche.

Dans le même temps, la clé de la base de registre va être modifiée. En la sauvegardant, vous n'auriez, à l'occasion d'une réinstallation, qu'a la replacer dans la base de registre, et à cliquer sur le fichier Dream.exe pour que SalesAgent décompresse le fichuer Dl_.

Dans cette version de SalesAgent, il n'y a pas de double boite d'enregistrement, tout simplement parce que ADOBE n'a pas prévu cette option.



La troisième Option:

Director 7: comment réactiver le bouton Try

Quand j'ai attaqué la protection de Director 7, je ne disposais que de SoftIce, et de Hiew. Je connaissais déjà le principe de la protection SalesAgent, mais sans disposez sous la main des outils nécessaires à une recherche de la clé de blocage (W32dasm, Filemon et Regmon).

Après que la clé de blocage fut mise en place, Director afficha son écran "Due to Sécurity"
En posant une bpx DialogBoxparamA, je suis arrivé à ces lignes, que vous avez déjà vue:

0137:004149ED  FF15D4224300        CALL    [USER32!DialogBoxParamA]
0137:004149F3  A1ECFF4400          MOV     EAX,[0044FFEC]
0137:004149F8  85C0                TEST    EAX,EAX
0137:004149FA  7443                JZ      00414A3F
0137:004149FC  A110004500          MOV     EAX,[00450010]
0137:00414A01  50                  PUSH    EAX

Normalement, après cette Dialogbox, l'écran shareware apparaît avec le bouton Try de désactivé.
Au sortir du call qui appelait cette procédure, vous serez ici:

0137:004063CD  6810004500          PUSH    00450010
0137:004063D2  51                  PUSH    ECX
0137:004063D3  E858E40000          CALL    00414830
0137:004063D8  68E49B4300          PUSH    00439BE4  > ici
0137:004063DD  8BF0                MOV     ESI,EAX
0137:004063DF  E8CCE30000          CALL    004147B0
0137:004063E4  83C418              ADD     ESP,18

En traçant un peu à partir de l'adresse 004063D8, vous arrivez à ces lignes:

0137:004064D8  8B442414            MOV     EAX,[ESP+14]
0137:004064DC  83C0FE              ADD     EAX,-02
0137:004064DF  83F81E              CMP     EAX,1E   > 1E pour 30 jours
0137:004064E2  0F8742060000        JA      00406B2A > no jump
0137:004064E8  33C9                XOR     ECX,ECX
0137:004064EA  8A88786B4000        MOV     CL,[EAX+00406B78]
0137:004064F0  FF248D646B4000      JMP     [ECX*4+00406B64]

En remplaçant le JA 00406B2A par un jmp, l'écran shareware activera le bouton Try.
Une modification à ce niveau permettrait donc de bénéficier éternellement du logiciel sous sa forme d'origine. Mais continuons:
En traçant toujours, vous finirez par voir surgir l'écran shareware avec son bouton Try de grisé, et son bouton Cancel. Le bpx DialogBoxParamA va encore nous servir pour arriver ici:

0137:00406B1A  FF15D4224300        CALL    [USER32!DialogBoxParamA]  > nag
0137:00406B20  8BF0                MOV     ESI,EAX
0137:00406B22  891D542E4400        MOV     [00442E54],EBX
0137:00406B28  EB04                JMP     00406B2E
0137:00406B2A  8B74240C            MOV     ESI,[ESP+0C]
0137:00406B2E  83FE02              CMP     ESI,02  > le bouton Cancel est cliqué?
0137:00406B31  891DA8DE4400        MOV     [0044DEA8],EBX
0137:00406B37  0F85B7FDFFFF        JNZ     004068F4  > sortie du programme
0137:00406B3D  5E                  POP     ESI
0137:00406B3E  5D                  POP     EBP

En 0040B6B2E ESI contient 2 si le bouton Cancel est cliqué, et l'application se termine. Dans le cas contraire, par défaut, Director 7 démarre. Donc en remplacent le JNZ 004068F4 par un JZ, vous avez un nouveau moyen de lancer le programme malgré la présence de la clé dans la base de registre. Ca n'est pas encore très élégant... et il reste l'écran "Due to security" qui fait un peu négligé.

Director 7: comment supprimer la 1ere DialogBox

La DialogBox "Due to security" peut être contournée au moins de trois façons:

1- en modifiant le branchement en 004149A5
2- en noppant le call 00414830 en 004063D8(ce qui va en faire frémir certains...). Ce call supporte d'être noppé sans qu'il y ai de répercussions sur le pointeur de pile SP. Là encore la méthode n'est pas très élégante... On trouvera mieux dans un instant!

:00414996 68F07D4300              push 00437DF0
:0041499B E820FEFFFF              call 004147C0
:004149A0 83C404                  add esp, 00000004
:004149A3 85C0                    test eax, eax
:004149A5 740E                    je 004149B5   > ici
:004149A7 5F                      pop edi
:004149A8 B825400000              mov eax, 00004025
:004149AD 5E                      pop esi
:004149AE 81C480020000            add esp, 00000280
:004149B4 C3                      ret
:004149B5 68FF0F0000              push 00000FFF
:004149BA 6858374500              push 00453758
:004149BF 6833010000              push 00000133
:004149C4 C705FC02450001000000    mov dword ptr [004502FC], 00000001
:004149CE E85DFDFFFF              call 00414730
:004149D3 8B9424A4020000          mov edx, [esp + 000002A4]
:004149DA 83C40C                  add esp, 0000000C
:004149DD 6A00                    push 00000000
:004149DF 52                      push edx
:004149E0 6A00                    push 00000000
:004149E2 6834020000              push 00000234
:004149E7 E884FDFFFF              call 00414770
:004149EC 50                      push eax
:004149ED FF15D4224300            Call [USER32!DialogBoxParamA] > nag


Director 7: comment supprimer la 2ème DialogBox

En noppant le call 00414830, et donc en ne passant plus par la procédure de vérification liée à "Due to sécurity", les valeurs dans les registres vont permettre de passer les tests suivant sans difficulté, et d'arriver à l'application sans passer par l'écran shareware, et sans autre modification.

0137:0040B698  7554                JNZ     0040B6EE  >(NO JUMP)
0137:0040B69A  6844CD4300          PUSH    0043CD44
0137:0040B69F  E81C910000          CALL    004147C0
0137:0040B6A4  83C404              ADD     ESP,04
0137:0040B6A7  85C0                TEST    EAX,EAX
0137:0040B6A9  7427                JZ      0040B6D2
0137:0040B6AB  6804010000          PUSH    00000104
0137:0040B6B0  8D8538FEFFFF        LEA     EAX,[EBP-01C8]
0137:0040B6B6  50                  PUSH    EAX
0137:0040B6B7  E8F496FFFF          CALL    00404DB0
0137:0040B6BC  83C408              ADD     ESP,08
0137:0040B6BF  85C0                TEST    EAX,EAX
0137:0040B6C1  740F                JZ      0040B6D2
0137:0040B6C3  8D8D38FEFFFF        LEA     ECX,[EBP-01C8]
0137:0040B6C9  51                  PUSH    ECX
0137:0040B6CA  E88192FFFF          CALL    00404950
0137:0040B6CF  83C404              ADD     ESP,04
0137:0040B6D2  685CCD4300          PUSH    0043CD5C
0137:0040B6D7  E8D4900000          CALL    004147B0
0137:0040B6DC  83C404              ADD     ESP,04
0137:0040B6DF  6A00                PUSH    00
0137:0040B6E1  E8AAACFFFF          CALL    00406390  > vers "due to security"

Une modification du branchement en 0040B698 rassurera ceux d'entre vous qui ont encore les cheveux dressés sur leur tête par le noppage sauvage du call 04036E1: le résultat est identique...

Il ne reste plus qu'à modifier le programme 0040B698!
Avec cette seule modification, la protection est contournée.

C'est à ce moment là que SoftIce a planté pour la deuxième fois!
Les deux tests que j'avais lié au checksum sont passés sans difficultés, mais un peu plus loin:

0137:00419C1E  5E                  POP     ESI
0137:00419C1F  C70064000000        MOV     DWORD PTR [EAX],00000064 > Oups!
0137:00419C25  5B                  POP     EBX
0137:00419C26  7409                JZ      00419C31
0137:00419C28  50                  PUSH    EAX
0137:00419C29  E8D2630000          CALL    00420000
0137:00419C2E  83C404              ADD     ESP,04

Break due to general protection fault!!!
Je m'attendais à cette réaction, l'ayant déjà eu, et au MEME endroit dans Image Styler!
Dans le cas d'ADOBE IMAGE STYLER, j'avais résolu le problème de la façon suivante:

ADOBE IMAGE STYLER:

Possible Reference to String Resource ID=00100:
->  "Please choose to buy the software or click on Cancel to exit"

:00401CD3 C70064000000            mov dword ptr [eax], 00000064
:00401CD9 7409                    je 00401CE4
:00401CDB 50                      push eax
:00401CDC E86FDC0100              call 0041F950
:00401CE1 83C404                  add esp, 00000004

En permutant les lignes 00401CD3 et 00401CD9

:00401CD3 740F                    je 00401CE4
:00401CD5 C70064000000            mov dword ptr [eax], 00000064
:00401CDB 50                      push eax
:00401CDC E86FDC0100              call 0041F950
:00401CE1 83C404                  add esp, 00000004

(Il est intéressant de préciser que mon éditeur hexadécimal m'a trouvé 72 fois la MEME occurence, en utilisant Find/Replace: une surprise!)

Il suffit de remplacer C700640000007409 par 740FC70064000000
Et de modifier le branchement vers le contrôle de sécurité:

:00408B11 E8BAD3FFFF              call 00405ED0
:00408B16 83F8FF                  cmp eax, FFFFFFFF
:00408B19 55                      push ebp
:00408B1A 750B                    jne 00408B27

en

:00408B11 90                      nop
:00408B12 90                      nop
:00408B13 90                      nop
:00408B14 90                      nop
:00408B15 90                      nop
:00408B16 83F8FF                  cmp eax, FFFFFFFF
:00408B19 55                      push ebp
:00408B1A EB0B                    jmp 00408B27

Director 7: suite et fin

Mais dans le cas de Director, le schéma n'est pas tout à fait identique, et pas de permutation possible. J'ai donc noppé (hey!) la ligne embarrassante pour pouvoir continuer En relançant SoftIce, un troisième plantage va se produire en:

0137:00416F72  5E                  POP     ESI
0137:00416F73  C70064000000        MOV     DWORD PTR [EAX],00000064 > Re Oups!
0137:00416F79  5B                  POP     EBX
0137:00416F7A  7409                JZ      00416F85
0137:00416F7C  50                  PUSH    EAX
0137:00416F7D  E87E900000          CALL    00420000

a Nop Nop Nop Nop Nop Nop à nouveau, F5, et le soft démarre tranquillement...

Director 7: Conclusion

Il y a trois modifications à faire:

en
0137:0040B698 7554 JNZ 0040B6EE
à remplacer par
0137:0040B698 7454 JZ 0040B6EE

en
0137:00419C1F C70064000000 MOV DWORD PTR [EAX],00000064
et en
0137:00416F73 C70064000000 MOV DWORD PTR [EAX],00000064
à remplacer par des Nop

(il est à noter que vous trouverez 37 occurrences sur cette chaîne)


La Décompression

Comment Obliger SalesAgent à transformer toutes les Sharewares en Full version:

Si vous cliquez sur l'icône de XXXPOP.exe, vous verrez un écran s'afficher avec "Please wait while your software is being prepared", puis aussitôt après un MessageBox "You cannot run this application at this time"

De quoi mettre la puce à l'oreille...

Pour voir de quoi il en retourne, et surtout si un jump ne pourrait pas faire dévier le branchement vers cette MessageBox, j'ai commencé par poser un bpx messageBoxA sous SoftIce.
Au passage suivant, et après l'affichage de "Please wait...", SoftIce marquera un break. F12 pour sortir de la procédure, apparition de la MessageBox "You cannot run ...". Clic sur le bouton [OK], et vous revoila dans SoftIce, en 00404D9C.

* Reference To: KERNEL32.SleepEx, Ord:0240h
                                  |
:00404D4B FF15E8624300            Call dword ptr [004362E8] > lance "Wait…"
:00404D51 E8DAF9FFFF              call 00404730             > eax=0 à la sortie
:00404D56 8B1D70644300            mov ebx, [00436470]  
:00404D5C 8BF0                    mov esi, eax
:00404D5E 83FEFF                  cmp esi, FFFFFFFF 
:00404D61 7504                    jne 00404D67          > évite le call ebx (jump)
:00404D63 6A00                    push 00000000
:00404D65 FFD3                    call ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D61(C)
|
:00404D67 8B3D98644300            mov edi, [00436498] > charge "You cannot run…"
:00404D6D 85F6                    test esi, esi
:00404D6F 752F                    jne 00404DA0  > pourrait éviter le call edi (no jump)

* Possible StringData Ref from Data Obj ->"You cannot run this application
                                        ->"at this time."
                                  |
:00404D71 6804024200              push 00420204
:00404D76 68408B4200              push 00428B40
:00404D7B E880DA0000              call 00412800
:00404D80 8B8C2458050000          mov ecx, [esp + 00000558]
:00404D87 83C408                  add esp, 00000008
:00404D8A 6830000100              push 00010030

* Possible StringData Ref from Data Obj ->"WARNING"
                                  |
:00404D8F 68FC014200              push 004201FC
:00404D94 68408B4200              push 00428B40
:00404D99 51                      push ecx
:00404D9A FFD7                    call edi  > affiche l’écran "You cannot run…"
:00404D9C 6A00                    push 00000000


Vous avez deux sauts, au dessus du Call EDI, dont un seul permet d'éviter la ligne 00404D9A.
1er reflexe, voir si en l'inversant le programme va continuer vers le module de décompression...

Pas Glop!
XXXpop.exe affiche toujours l'écran "Please wait...", mais il faudra faire un Ctrl-Alt-Suppr pour en sortir.

Cà aurait été trop beau!
Voyons maintenant du coté des registres: en forcant ceux ci (R registre= X), avant les branchements, et en les inversant (R FL Z), on aura peut être un peu plus de résultats...

Pas Glop!
Apparement, soit il faut une combinaison de registres contenant des valeurs précises, soit les call précédents (call 00404730, call ebx, et call 00412800) placent dans des adresses [mémoires] des valeurs qui sont attendues un peu plus loin.

Laissons cette piste de coté pour le moment.

Si vous avez déjà eu l'occasion de lire de précédents essais sur SalesAgent, vous savez déjà qu'il existe d'autres moyens pour obtenir une copie décompréssée de le Full version d'origine.
C'est donc à partir d'une copie décompressée (ImageReady.exe par exemple) et d'une copie qui ne l'est pas (ImageReady.dl_) que j'ai continué mes recherches.

Cette fois ci, je cherchais ce qui pouvait changer de l'une à l'autre, et voir si je n'arriverais pas à créer un décompilateur pour les fichier dl__.
FileCompare, est un utilitaire très pratique pour ce genre de boulot. Problème, il plante lors de la comparaison des deux fichiers (XXX.dl_ serait il protégé?...)
Après désassemblage de ces deux fichiers dans W32dasm, j'ai obtenu 2 listings que j'ai comparé entre eux, toujours en utilisant FileCompare, certain que cette fois ci je n'aurais pas de problème.

Glop Glop!
A ceci prêt que le résulat obtenu dépassait les 40 pages, et qu'à raison d'une soixantaine de lignes par page, j'allais être confronté à plus de 2400 modifications...

Pas Glop!
Motivé, mais pas fou...

Encore une piste à laisser de coté.

Finalement, j'ai décidé de revenir à mon études du contenu des registres, et j'ai forcé xxxPOP.exe à décomprésser un fichier dl_, via la boite d'enregistrement, en gardant mes breakpoints du début actifs.
Après que Rsagnt32.dll ai fini son travail, il passe la main à xxxPOP.exe, et l'écran "Please wait..." s'affiche.

POP!

Break en 00404D51. A partir de mainteant, je n'ai pas le droit de me tromper: le fichier allant obligatoirement vers le module de décompréssion, si je ne trouve pas mainteant où est la différence entre un fichier décompressable et un qui ne l'est pas, je n'aurais plus de cartouche...

Pas assez courageux pour faire le tour des différents calls, et noter tous les changements dans les registre, je me suis intéressé à la valeur de ceci à la sortie des 3 calls, et tout particuliérement avant les branchements en 00404D61 et 00404D6F.
A partir de là une "confrontation" entre les résulats obtenus (pendant que mon fichier dl_ fini de se décompresser), et ceux que j'avais relevé au départ ont mis en evidence ceci:

EAX et ESI doivent avoir la même valeur (01) avant le premier branchement en 00404D61, au lieu des zéros que j'avais auparavant.

Petit essai sur un autre fichier xxxpop.exe.
En procédant de la même façon qu'au tout départ (bpx MessageBoxA, bpx sur le 1er branchement après le call[KERNEL!SleepEx]), j'ai forcé le contenu des registres EAX et ESI à 01.

BINGO!
Décompréssion lancée...

Voyons ce qu'il reste à faire: en 00404D56 j’ai un MOV ESI, EAX. Donc seulement ce qui arrive à EAX dans le call 00404730 m'intéresse.
Après avoir relancé xxxpop.exe, je vais garder un oeil sur EAX dans la fenêtre des registres, en traçant dans le call avec F10, pour arriver ici:

:00404765 85C0                    test eax, eax  > EAX = 0
:00404767 750C                    jne 00404775
:00404769 837C240402              cmp [esp + 04], 00000002
:0040476E 0F94C0                  sete al   > la modif doit intervenir ici
:00404771 83C410                  add esp, 00000010
:00404774 C3                      ret             > sortie du call

Sete al n'a pas d'influence sur EAX qui est déjà à 00, mais qu'arriverait-il en faisant ?

:0040476E B001                    mov al, 01 
:00404770 90                      nop
:00404771 83C410                  add esp, 00000010
:00404774 C3                      ret

EAX serait égale à 1 à la sortie ducall, et en route pour la décompréssion...

Tout marche parfaitement en mémoire, passons au patch avec Hiew.
Au lancement suivant de XXXPOP.exe, PLANTAGE!

00404839C             TEST  EAX EAX
00404839E             MOV   DWORD PTR [EAX], 00000064
0040483A4             JZ    004083AF

Si vous avez lu les tutoriaux dont il était question tout à l'heure, vous aurez reconnu une manifestation du checksum de SalesAgent. Pour contourner le problème, il suffit de faire:

00404839C             TEST  EAX EAX
004083A4              JZ    004083AF                  (jump)
004083A6              MOV   DWORD PTR [EAX], 00000064

Le JZ jumpant, le MOV de nous gène plus. On relance...

Deuxième plantage en 0040843F, et à nouveau sur un MOV DWORD PTR [EAX], 00000064. C'est vraiment le truc de SalesAgent...
Noppez le ou faites la même chose que précédemment, et on en parlera plus!

Relancez XXXPOP.exe, et vous aurez une jolie décompréssion à la clé.

Ce qui à marché avec une version POP peut il fonctionner avec toute?

OUI et NON!
Le patch va fonctionner pour Director et Flash de chez Macromédi, mais pas pour Image Ready et Image Styler de chez Adobe tous les quatre équipés de ce fameux fichier POP.

Peut on trouver un patch commun?

OUI!
En premier lieu, il faut désactiver le checksum de SalesAgent en noppant, ou en inversant tous les Mov Dword Ptr [eax], 00000064.
Pour cela, avec un éditeur hexadécimal, C70064000000 par des NOP (ne soyez pas surpris, vous en aurez jusqu'à 70 occurrences qui peuvent toutes être suprimées).

Ensuite ?
Un autre point commun à tous les fichier POP, est le pasage par ces adresses que l'on a déjà vue:

:00404D56 8B1D70644300            mov ebx, [00436470]  
:00404D5C 8BF0                    mov esi, eax
:00404D5E 83FEFF                  cmp esi, FFFFFFFF 
:00404D61 7504                    jne 00404D67

Et ou l'on sait que EAX et ESI doivent être égal à 01 avant le branchement en 00404D61.
(ESI contiendra -01 (FFFFFFFF), uniquement si vous lancez le fichier POP , avant d'avoir lancé l'application pour la première fois)

On remplacera donc les lignes ci-dessus par: (
Proposition de Neutral AtomX)

:00404D56 8B1D70644300            mov ebx, [00436470]  
:00404D5C 33C0                    xor eax, eax  > eax= 0
:00404D5E 40                      Inc eax       > eax=eax+1
:00404D5F 8BF0                    mov esi, eax  > esi=eax
:00404D61 7504                    jne 00404D67  > jump ou no jump, pas d'importance

Voilà
A partir de maintenant, tous les programmes protégés par SalesAgent 2 peuvent être dévérouillés, et à l'aide du même patch!

Il y a quand même le cas de FireWorks 2.0. Voici la routine habituelle, très légérement différente:

:00404COE FF1564A04100            call [kERNEL32!SleepEx] > "Please Wait..."
:00404C14 E8D7F9FFFF              call 004045F0           > contrôles
:00404C19 83FEFF (ligne à changer)cmp eax, FFFFFFFF       > si eax = -1
:00404D61 7504                    jne 00404D67            > continue

Des différentes routines rencontrées jusqu'ici, FireWoreks est le seul à faire directement une comparaison sur EAX, au lieu de ESI. Dans ce cas précis, EAX = 1 seul suffit à lancer la décompréssion, rendant notre Patch encore efficace, à condition de l'aménager dans la recherche de la bonne chaîne.

J'espère que vous aurez réussi à me suivre dans ces différents aller-retour entre les programmes que j'ai rencontrés, "protégés" par SalesAgent. Il reste que SalesAgent a encore des secrets:


Comment désactiver le checksum autrement qu'en noppant ces mov [eax],64?


La solution de Neutral AtomX

Bien qu'il y ait de nombreuses occurrences sur ces mov dword ptr [eax], 00000064, à chaque fois, il n'y a que 2 d'entres eux qui sont "sollicités" et provoquent un break due to general protection fault.

Dans Image Ready, c'est adresses sont en 004045D7, et en 00404674.

A l'aide du listing désassemblé, il est rapide de se rendre compte que ces deux adresses se trouvent l'une au dessus de l'autre, dans une procédure appelée par un call

* Referenced by a CALL at Address:
|:00404827   
|
:00404540 81EC20010000          sub esp, 00000120
:00404546 8D442420              lea eax, [esp + 20]
...

:004045CF 0FAFC6                imul eax, esi
:004045D2 83C404                add esp, 00000004
:004045D5 85C0                  test eax, eax
:004045D7 C70064000000          mov dword ptr [eax], 00000064
:004045DD 7409                  je 004045E8
...

:0040466C 0FAFC6                imul eax, esi
:0040466F 83C404                add esp, 00000004
:00404672 85C0                  test eax, eax
:00404674 C70064000000          mov dword ptr [eax], 00000064
Voyons dans quelle condition est appelé ce call:

:00404814 A4                    movsb
:00404815 E856E00000            call     00412870
:0040481A 8A4801                mov cl,  byte ptr [eax+01]
:0040481D 83C408                add esp, 00000008
:00404820 3ACB                  cmp cl,  bl
:00404822 7403                  je       00404827
:00404824 885801                mov byte ptr [eax+01], bl

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404822(C)
|
:00404827 E814FDFFFF            call     00404540 ***ICI****
:0040482C 33FF                  xor edi, edi
:0040482E 891D745D4200          mov dword ptr [00425D74], ebx
:00404834 C705805D4200B0114000  mov dword ptr [00425D80], 004011B0

Aucun Push ne précédant le call, aucun paramètre n'est envoyé vers celui ci. On peut donc faire tout simplement un RET sur la première ligne de la procédure anti-crack de Imagepop.exe :

Et remplacer
:00404540 81EC20010000 sub esp, 00000120

par

:00404540 C3 RET

Voilà, reste à faire le choix de la méthode :
Soit le patch de la procédure de contrôle uniquement ou le patch de tous les mov dword ptr [eax], 64

Personnellement je préfère le patch de la procédure, car le patch de n occurrences peut écraser des parties de codes qui n'ont rien à voir avec l'erreur mov dword ptr [eax], 00000064 (à moins de faire une recherche à partir de imul eax,esi / add esp / etc..soit 14 bytes), ou de disposer d'un Hexéditeur comme Hview qui permettra de s'assurer, en le faisant " à la main ", que les codes modifiés le sont au bon endroit.

J'espère que vous aurez réussi à me suivre dans ces différents allez-retour,


Enjoy
Christal
Neutral AtomX


ANNEXE 1

La valeur 00000111

Les explications de Psyché:

En réalité ces tests font partie de ce qu'on pourrait appeler le centre de la gestion d'un dialogbox définie ici:

:0040612A 56                      push esi
:0040612B 6850634000              push 00406350 <- adresse de la routine gérant la dlgbox (souvent appelée WinProc)
:00406130 50                      push eax
* Possible Reference to Dialog: DialogID_0076 
                                  |
:00406131 6A76                    push 00000076 -> N° du dialog défini par le programmeur
:00406133 8935C8124400            mov dword ptr [004412C8], esi
:00406139 51                      push ecx
:0040613A EB15                    jmp 00406151 -> appel de dlgboxparam / en rouge ce sont les paramètres nécessaire à cet API (voir API ref)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040611D(C)
|
:0040613C 8B152C404300            mov edx, dword ptr [0043402C]
:00406142 A134404300              mov eax, dword ptr [00434034]
:00406147 56                      push esi
:00406148 6850634000              push 00406350
:0040614D 52                      push edx

* Possible Reference to Dialog: DialogID_0067 
                                  |
:0040614E 6A67                    push 00000067
:00406150 50                      push eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040613A(U)

* Reference To: USER32.DialogBoxParamA, Ord:008Eh
                                  |
:00406151 FF1588954400            Call dword ptr [00449588]

* * * * *
Donc on aboutit ICI chaque fois que quelque chose se produit avec ce dlgbox

:00406350 A128694300              mov eax, dword ptr [00436928]
:00406355 81EC18010000            sub esp, 00000118
:0040635B 85C0                    test eax, eax
:0040635D 53                      push ebx
:0040635E 8B9C2420010000          mov ebx, dword ptr [esp+00000120]
:00406365 55                      push ebp
:00406366 56                      push esi

* Reference To: USER32.GetDlgItem, Ord:00F3h
                                  |
:00406367 8B3584954400            mov esi, dword ptr [00449584]
:0040636D 57                      push edi

* Reference To: USER32.EnableWindow, Ord:00B2h
                                  |
:0040636E 8B3DE8954400            mov edi, dword ptr [004495E8]
:00406374 891D443F4300            mov dword ptr [00433F44], ebx
:0040637A 740A                    je 00406386
:0040637C 6A00                    push 00000000

* Possible Reference to String Resource ID=00001: "Turnkexe"
                                  |
:0040637E 6A01                    push 00000001
:00406380 53                      push ebx
:00406381 FFD6                    call esi
:00406383 50                      push eax
:00406384 FFD7                    call edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040637A(C)
|
:00406386 8B842430010000          mov eax, dword ptr [esp+00000130]
:0040638D 3D10010000              cmp eax, 00000110

dans eax se trouve l' "événement" associé à la dlgbox que Windows renvoi, ici 110 = WM_INITDIALOG, c-à-d la fenêtre est en train de se créer. Il sera important de savoir si la fenêtre (dlgbox) est terminée ou non. Si non : continuer sa création => je 4063b2
Le ja fait référence à tout ce qui est > à 110 dont un très important : 111 = WM_COMMAND -> ja 4067cb, en d'autres termes, lorsqu'il y a un événement lié à un click sur la fenêtre (en gros).

:00406392 0F8733040000            ja 004067CB
:00406398 7418                    je 004063B2
:0040639A 83F80F                  cmp eax, 0000000F
:0040639D 0F84FD060000            je 00406AA0
:004063A3 33C0                    xor eax, eax
:004063A5 5F                      pop edi
:004063A6 5E                      pop esi
:004063A7 5D                      pop ebp
:004063A8 5B                      pop ebx
:004063A9 81C418010000            add esp, 00000118
:004063AF C21000                  ret 0010

* * * * * * 

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406392(C)
|
:004067CB 3D11010000              cmp eax, 00000111
:004067D0 0F84F7000000            je 004068CD
:004067D6 3D06020000              cmp eax, 00000206
:004067DB 7463                    je 00406840
:004067DD 3D11030000              cmp eax, 00000311
:004067E2 0F851A030000            jne 00406B02
:004067E8 6A00                    push 00000000
:004067EA 6A00                    push 00000000
:004067EC 53                      push ebx

* Reference To: USER32.InvalidateRect, Ord:0152h
                                  |
:004067ED FF15A0954400            Call dword ptr [004495A0]
:004067F3 8D4C2464                lea ecx, dword ptr [esp+64]
:004067F7 51                      push ecx
:004067F8 53                      push ebx

* Reference To: USER32.BeginPaint, Ord:0009h
                                  |
:004067F9 FF159C954400            Call dword ptr [0044959C]
:004067FF 8B0DD4944300            mov ecx, dword ptr [004394D4]
:00406805 68C0D24300              push 0043D2C0
:0040680A 85C9                    test ecx, ecx
:0040680C 7419                    je 00406827
:0040680E 680AD7A33C              push 3CA3D70A
:00406813 6800000644              push 44060000
:00406818 50                      push eax
:00406819 53                      push ebx
:0040681A E881ACFFFF              call 004014A0
:0040681F 83C414                  add esp, 00000014
:00406822 E9CF020000              jmp 00406AF6

* * * * *
On arrive ici s'il y a eu un click et c'est la partie qui gère maintenant QUEL click, c-à-d sur quel bouton ...
Cette info est prise sur la pile et mise en ecx, puis en eax
Les valeurs importantes sont 3EF 3EE et 3ED, ce dernier devant être le code pour un bouton EXIT ou équivalent puisqu'il conduit à un ENDDIALOG qui entraîne la destruction de la dlgbox créée précédemment (le handle étant dans ebx).

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004067D0(C)
|
:004068CD 8B8C2434010000          mov ecx, dword ptr [esp+00000134]
:004068D4 8BC1                    mov eax, ecx
:004068D6 25FFFF0000              and eax, 0000FFFF

* Possible Reference to Dialog: DialogID_07DB, CONTROL_ID:03EF, ""
                                  |
:004068DB 3DEF030000              cmp eax, 000003EF
:004068E0 7F74                    jg 00406956
:004068E2 7440                    je 00406924
:004068E4 48                      dec eax
:004068E5 7422                    je 00406909
:004068E7 48                      dec eax
:004068E8 0F85B2010000            jne 00406AA0
:004068EE 6A02                    push 00000002
:004068F0 53                      push ebx

* Reference To: USER32.EndDialog, Ord:00B4h
                                  |
:004068F1 FF1594954400            Call dword ptr [00449594]


Psyché


ANNEXE 2

Sale Agent 3.0
Rsagnt32.dll, TurnKey et moi

Written by Goth


Outils nécessaires



W32dasm 8.x
SoftIce 3.x
Un éditeur de texte
BRW (Borland Ressource Workshop)

Url/FTP

J'ai utilisé Norton Utilities 3.03 Trial de Symantec (Faites une recherche sur "nu3trial.zip" 27.3 MB)

Cours

Bien , je suppose que vous avez pris toutes les précautions obligatoires (sauvegarde de la base de registres, etc...), installons notre cible et démarrons Win95

Vous devriez aussi avoir:
- jeter un œil dans le répertoire des NU
- découvert qu'il y a quatre fichiers pour CHAQUE principal exe des NU
(ex: NORTON.EXE, NORTON.DL_, NORTOPOP.EXE, NORTOTKY.DLL)
- situé RSAGNT32.DLL

PART I - regarder ce qu'il y a qui traîne


En premier lieu regarder comment notre cible se comporte.
Lancer le Norton Utilities Integrator (Norton.exe) que SYMANTEC a installé si gentiment sur votre bureau.
Vous obtiendrez l'habituel Nagscreen "Time Limit".
N'essayez pas "Try First", lancez tout de suite "Buy Now". Remplissez les lignes et appuyez sur "next" jusqu'à arriver sur la fenêtre "Select Payment Method". Maintenant, est ce que vous avez votre carte de crédit a portée de main?
Sinon, vous devriez reverse-enginneer notre cible afin de voir quels nombres sont valides ou visitez un site fantaisiste de hackers pour obtenir un générateur de carte de crédit (ex: Crédit Master) ou simplement:

Card: American Express
N°: 00000000
Exp: 09/99
Name: Goth

(Hey, lamers! Cette info ne PEUT PAS être employée pour accéder à votre site pornographique préféré! Désolé! -), puis appuyez sur "Next" jusqu'à arriver à la fenêtre "Select Communication Methods". Pour différentes raisons, il est nécessaire d'être sûr que vous n'êtes PAS connecté à quoi que ce soit, éteignez votre Modem, coupez vos lignes ou autres trucs... et cliquez sur "Next".
Oops, impossible de se connecter. Annulez la procédure d'achat.
Maintenant vous pouvez constater que notre cible à atteint sa période d'expiration. Mais vous savez tous ce qui va se passer, non? Oui, le bouton "Try First" est grisé et il ne s'ACTIVERA PAS si vous rébranchez votre Liaison Modem.
Bien, c'est un dépassement du temps autorisé. A ce point vous pourriez avoir l'idée de lancer SoftIce, poser un Bpx getSystemTime, traquer les bytes à patcher dans l'exe/dll et vous serez prêt.

MAIS NON VOUS NE LE FEREZ PAS!!!

(si vous pouvez travailler avec NU de cette façon, Mailez votre cours à Fravia!)
Ce que vous ferez, à ce stade, sera de cliquer sur "Buy Now" une fois de plus. (Des fois quand je vois ce genre de stupide protection, je n'arrive pas croire qu'il y ai un bouton "Buy Now" mais aucun moyen d'entrer un code d'enregistrement ou quelque chose dans le genre, que je puisse réessayer plus tard... ;-)

Vous voyez toutes les zones d'éditions de votre fenêtre "UserRegistration" remplies avec les informations que vous aviez entrées auparavant. Fermez NU et recommencez encore. Les Informations sont toujours là.
SalesAgent doit conserver les infos utilisateur quelque part.

PART II - L'anatomie de SalesAgent 3.0


Vous devriez examiner maintenant les fichiers de notre cible pour voir un aperçu rudimentaire de ce qui doit être utilisé.
Bien, cinq de ces fichiers devraient être plus que suffisant, jetez y un coup d'œil:

1: NORTON.EXE
2: NORTON.DL_
3: NORTOPOP.EXE
4: NORTOTKY.DLL
5: RSAGNT32.DLL

Utilisez BRW et/ou W32dasm. Regardez les tables d'importations et d'exportations, les ressources, les en-têtes et tout ce qui suit... Vérifiez s'ils sont encryptés/compréssés. Utilisez votre imagination. Quel fichier fait quelle action? Comment le schéma de protection fonctionne t il? RESSENTEZ les...

Après les avoir regardés un moment, vous devriez arriver à ces conclusions:

· NORTON.EXE, SI32.EXE, NREGEDIT.EXE... On tous la même taille (243 kb) -> Ils ne peuvent pas être de véritables EXEs -> une sorte d'en-tête
· ********.DL_s sont encryptés -> ce sont les véritables EXE -> ils peuvent être chargés, décryptés, ou d'autres choses encore...
· ***POP.EXEs contient quelques ressources disant "Please Wait While Your Software is being prepared", ainsi qu'une importation de "CreateFileMapping" -> c'est le décrypteur
· ***TKY.DLLs rien de plus ici, vous pourriez même l'utiliser pour acheter Micro$oft FrontPage (regardez les références dialogues!)
· RSAGNT32.DLL établi une connexion à un Serveur Internet, et contient les ressources pour le CODE ENTIER d'ENREGISTREMENT..

Maintenant, comment allons nous procéder?

Vous démarrez NU (Norton.exe) qui utilise RSAGNT32.DLL pour vérifier si vous êtes encore dans la période d'évaluation, puis il présente sa fenêtre "NU for Win 95 Trial".
Si vous cliquez sur "Try First" le fichier Norton.Dl_ est temporairement décrypté puis lancé.
Si vous cliquez sur "Buy Now" Norton.exe utilise RSAGNT32.DLL pour obtenir les infos utilisateurs, la connexion Internet et l'ENREGISTREMENT.

Aussi comment faire en sorte que RSAGNT32.DLL permette de nous enregistrer?

PART III- Truquer un bon de commande FAX/MAIL


J'ai utilisé W32dasm pour désassembler RSAGNT32.DLL.
Premièrement, j'ai examiné sa table d'importation pour voir de quoi il était capable et aussi pour noter les importations suspectes. Hey, vous en trouverez plein. Ce qui devrait vous mettre la puce à l'oreille, c'est sa capacité à modifier les entrées de la base de registres, mais aussi l'utilisation de la fonction obsolète PrivateProfiString (*.INI).
Cela demande plus de recherche.

W32dasm trouve la première occurrence à GetPrivateProfilStr ici:

* Reference To: KERNEL32.GetPrivateProfileStringA, Ord:0112h
                                  |
:100015EE 8B35A8010210            mov esi, dword ptr [100201A8]
* Possible StringData Ref from Data Obj ->"rsagent.ini"

Oops! Il essaye de lire un fichier appelé RSAGENT.INI et où se trouve habituellement les fichiers *.INI? Dans le répertoire Windows:

[ReleaseSoft]
firstName=Goth
lastName=Nosferatu
company=!
street1=!
street2=!
city=!
state=
zip=12345
country=United States
geoType=110
phoneNum=!
faxNum=!
email=!
personalCode=
toneDial=1
callWait=0
needAccess=0
accessCode=9
intlPrefix=
callWaitStr=
mailStat-975135=0
ATTN=AT
MTONEDIAL=T
PULSEDIAL=P
DIALTHIS=D
WORDRESULT=V1
HANGUP=H0
ADDINIT=E0
ESCAPE=+++
OKAY=OK
NOCARRIER=NO CARRIER
CONNECTED=CONNECT
NODIALTONE=NO DIALTONE
BUSY=BUSY

Il ne s'y trouvait pas lors de l'installation. Il a donc du être créé pendant que nous avons essayé de nous enregistrer dans la PART I.
Regardez. Cherchez quelque chose qui pourrait nous aider à nous enregistrer. Bien, jusqu'à "email=!) (Oui, je suis paresseux. J'ai entré tout ces "!") il n'y a rien d'important. Mais attendez !!!"personalCode="?!?!

Où est ce que nous avons vu cela auparavant/ Si vous avez fait comme je vous l'ai dit dans la PART II, vous reconnaîtrez l'endroit.
Utilisez BRW. Regardez au Dialogue 2011!! C'est quoi ce titre de dialogue ? "Complete Mail / Fax payment"!
Humm, Envoyer? Télécopiez? Je ne me rappelle pas du tout d'une boite de dialogue précisant le payment par Fax/email durant la procédure d'enregistrement. Jetez un œil au dialogue 2001. Notre veil ami de la première partie "select Communication Method" nous permettrait de commander par téléphone et par courrier / fax. Il devrait être possible d'obtenir le dialogue 2011 sans avoir de connexion Internet ou de Modem!

Toutes les autres entrées s'expliquent d'elle mêmes mais que dire de l'entrée "MAILStat-975135=0"?
Remplaçons le 0 par un 1, relançons NU et recommençons le procédure "Buy Now" encore une fois. Quelque chose ç changé? Bien sûr! Nous sommes enfin au dialogue 2011. Nous avons un "personalCode" mais ce que nous n'avons pas c'est un "Unlocking code". Ce ne sera pas très long...

PART IV- le générateur de clé RSAGNT32.DLL



Nous savons que notre "UnlockingCode" sera obtenu par le dialogue 2011.
Vous devriez poser un bpx GetDlgItemTextA dans SoftIce, entrer un code bidon (ex:gothtog) et après avoir appuyé sur F12, Softice vous amènera ici:

:10005612 mov edi, 10032E20  <= notre unlocking code
:10005617 or ecx, FFFFFFFF
:1000561A xor eax, eax
:1000561C repnz
:1000561D scasb
:1000561E not ecx
:10005620 dec ecx
:10005621 cmp ecx, 0000000A  <= 10 caractères de long?
:10005624 je 10005665   <= Oui! => va en validation check!
:10005626 lea edx, dword ptr [esp+10]      Non! => ...

* Possible StringData Ref from Data Obj ->"Sorry, that unlocking code is"
                                        ->"not valid for this program."
           |
:1000562A push 10023890
:1000562F push edx
:10005630 call 10014590

Step over the next instructions, toogle zero flag at 10005624 and step on till you reach:

:100056A8 push ecx
:100056A9 push edx
:100056AA push eax
:100056AB call 1000B980    <= calcule le bon code
:100056B0 add esp, 0000000C
:100056B3 lea ecx, dword ptr [esp+000000D8]
:100056BA push 10032E20    <= notre code
:100056BF push ecx                              <= bon code
:100056C0 call 1001F5C0                         <= compare
:100056C5 add esp, 00000008
:100056C8 test eax, eax    <= si la comparaison est mauvaise (eax!=0)
:100056CA jne 1000597C    <= vous aurez 'Sorry, that...'


En 100056BA nous dumpons la mémoire en ecx, et nous obtenons un code parfait de 10 caractères de long du type "RQXKNKQJPP" (Ce code est seulement valable si votre code personnel est "1234567890"!, que BRW peut atteindre si vous modifiez votre "PersonnalCode" et votre "mailStat-975135" dans RSAGENT.INI!). Quittons SoftIce (F5). Tapons le bon code et nous obtiendrons une fenêtre "Enter your sérial" (Bizarre!). Ici, nous rentrons de nouveau notre code, et c'est fait!

PART V- Sommaire et Additions



Nous n'avons pas eu affaire à la moindre routine d'encryption, SalesAgent 3.0 peut être battu en moins de 2 min:

· Changez le "personalCode=" en "personalCode=123456" et "mailStat-975135=0" en "mailStat-975135=1" dans RSAGENT.INI (s'il n'y a pas de RSAGENT.INI, créez en un!)
· Commencez la procédure "Buy Now"
· Entrez "RQXKNKQJPP" comme code d'enregistrement


(Extrait de la traduction anglaise de CyberBobJr le 29/05/1998)

Christal

Septembre 1999