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
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 >nagEn 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] >nagEn 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 EAXPuis 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 100Si 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 00000044Possible 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 suffirVoilà!
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 -> nagEn 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 0045A5200177: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 0045A611En 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 RETA 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 RETEn 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 RETParfait ! 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 CodeDans 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], eaxCette 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 rwAprè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 expired00406B29 idem004063D1 Trial0040957E Invalid Unlocking Code0040751F The sérial entered is incorrect00407ACC Thank You for purchassing00407684 idem00406241 Thank you for Trying 00405FF300406B2900406B7C004094E1 et 00409485004074EF004075C400407A0Cpas 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 00000001Adobe 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, eaxComparaison 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 ebxet 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 ebxVous 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, alSi 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], 0000000BNumé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 EAXNormalement, 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,18En 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 EBPEn 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,04Break 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, 00000004En 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 00408B27en
: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 00408B27Director 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 00420000a 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 callSete 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 retEAX 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 004083AFSi 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], 00000064Le 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 00404D67Et 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'importanceVoilà
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 > continueDes 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], 00000064Voyons 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], 004011B0Aucun 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 1La 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, 00000110dans 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é
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 10014590Step 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)