Crack de Audioactive Production Studio Lite/Pro
par Psyche


Introduction


Au départ le présent crack (et le texte aussi) faisait suite à un exercice proposé par Cyberbobjr. LÆobjectif (si nous lÆacceptions, ki disait) était de basculer la version Lite en version Pro.
Ce programme (de conversion Wav-> MP3, très bien fait dÆailleurs !) était disponible sur le CD Pro N° 39 de PCTeam (au cas où ...).
Il fallait expliquer comment cÆest-y kon avait fait pour que ça marche ... crack ou keygenerator.
JÆme suis dit du coup que tant quÆà expliquer kekchoz autant le faire pour tout le monde.
Donc, ceci devient un tutorial, dispo en principe sur la page de Cyberbobjr (http ://altern.org/cyberbobjr) et sur celle dÆATP Team (dont je fais partie :) -http ://www.citeweb.com/atpteam).
Sur ce ... on sÆy colle ;)

First encounter (« premier contact » pour les puristes, amateurs de cédérom et de partagiciels :) )

Blazé et confiant, jÆinstalle la chose sur mon HD et sans autre forme de procès je lance le désassemblage avec Wdasm 8.93, oui oui, vous avez bien lu, sans lÆessayer, rien du tout !
Et boum, plantage ! Oups :( Ouais, jÆaurais dû mÆy attendre ! Cyberbobjr nÆallait pas nous filer un « test eax, eax jnz gentil_utilisateur » !
Quand le marteau ne marche pas, on prend la masse ... et cÆest parti avec IDA.
Tiens, cÆest curieux ... il ne livre que quelques lignes de code. Ca sent la compression ou le cryptage ! ? -> à verifier.

Second encouter (« second contact », pour les mêmes que plus haut)

Bien ! On va aller jeter un £il à ce quÆon trouve dans le répertoire æAudioactiveÆ.
Ooooh une petite surprise : un vieil ami que jÆavais déjà rencontré lors dÆune « approche » de Systran, jÆai nommé : Crypkey.
Keskidi ? CÆest quoi ça Crypkey et comment il sait ça lui ?

Comment je le sais ? Il y a dans le répertoire un fichier æcryp95a.dllÆ et son pote en code 16bits. Je dois avouer que je lÆavais déjà vu, donc jÆai pas cherché pendant des heures.

CÆest quoi crypkey ? Alors là je ne résiste pas au plaisir de vous citer le descriptif quÆen fait la boîte qui le vend (gnarf gnarf -> rire gras :) ):

CrypKey is a revolutionary license control system that not only stops unauthorized use and duplication of your software, it helps you increase your sales! CrypKey truly adds features to your software. Offer usage by runs, time, enable or add options by phone, fax or e-mail! CrypKey's Ready-To-Try feature lets you distribute software by Internet or CD-ROM, giving ONE free trial, with full security!
Piracy protection does not need to be intrusive or annoying to your customers. CrypKey makes software licensing a natural part of each software sale, and an invisible part of the computer your software exists in. CrypKey was designed to replace any dongle or disk-based key system in copy protection effectiveness.

"We truly believe that CrypKey is the best copy protection system available, providing a superior combination of features, security, reliability and ease of use; all at a very reasonable price... and professional software developers confirm this every day."
Jim McCartney, P.Eng., CrypKey Product Visionary


Bref, Crypkey est une protection commerciale tenant compte de toute une série de paramètres bloqués ou non, servant pour la diffusion de sharewares débridables par lÆentrée dÆun serial.
Crypkey toujours, possède une librairie contenant toute une série de fonctions assez explicites par leurs noms (on verra ça plus tard).
Voyons pour la question en suspend : cryptage - compression ?
On édite lÆexe principal avec un éditeur hexa et que voit-on en toutes lettres ? SHRINKER ! Ouf, ce nÆest que de la compression...
Shrinker permet de compresser un .EXE et le rend exécutable sans obligation de le décompresser temporairement au préalable (ah, ça me rappelle la bonne vieille époque de PowerPacker sur Amiga, snif, versons une larme sur le défunt - heu pardon, on continue !).
Résolvons ce petit problème à lÆaide de lÆutilitaire ad hoc : deshrinker pour ne pas le citer - en cherchant bien vous devriez le trouver ;)
Voilà, nous avons maintenant un exe désassemblable par Wdasm ... et nous savons quÆil faudra contourner Crypkey en faisant passer Audioactive en version Pro. Une paille, non ? :)
Pour terminer la préparation, jÆai directement changé lÆhorloge pour dépasser le terme dÆutilisation (ça évite des recherches supplémentaires). Notre ami Crypkey, si je me souviens bien, enregistre à des endroits aléatoires un fichier au contenu dépendant des paramètres de votre machine ... mais ça on sÆen fout ;)
Du coup, dès quÆon lance MP3PRO.EXE on nous demande de rentrer un code dÆenregistrement ; sans cela, ben on se passe du programme :) (inutile de remettre la montre à la bonne date, il se base sur le fameux fichier, pas sur lÆhorloge interne, une fois que le terme est dépassé).

Close encounter of the 3rd kind (« Rencontre du 3ème type » pour les initiés :) )

On va dÆabord sÆoccuper du dépassement de la période dÆévaluation.
DÆexpérience (oui, je sais, ça vous aide pas mais bon ...) jÆai appris que la fonction Get_Authorization (dans cryp95a.dll) joue un rôle important comme le signale son nom :)
On va donc utiliser le LOADER de SoftIce et importer cryp95a.dll (ou le placer dans les EXPORTS de Sice - comme ça vous chante).
On place un BPX sur Get_Authorization et on lance MP3PRO.EXE.
Boum on est dedans... F12 et on arrive en 43AB57h, puis eax est stocké en mémoire.


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043AB3F(C)
|
:0043AB4F 8B450C mov eax, dword ptr [ebp+0C]
:0043AB52 50 push eax
:0043AB53 8B4508 mov eax, dword ptr [ebp+08]
:0043AB56 50 push eax
:0043AB57 FF95C4FDFFFF call dword ptr [ebp+FFFFFDC4]
<- appel de Get_Authorization
:0043AB5D 8985C8FDFFFF mov dword ptr [ebp+FFFFFDC8], eax
<- stockage de la valeur retournée par Get_Authorization
:0043AB63 E861510000 call 0043FCC9
:0043AB68 83BDC8FDFFFF00 cmp dword ptr [ebp+FFFFFDC8], 00000000
<- cette valeur = 0 ?
:0043AB6F 0F8CAF000000 jl 0043AC24 <- NAN ? dégage !
:0043AB75 8D85B0FDFFFF lea eax, dword ptr [ebp+FFFFFDB0]
<- Oui et cÆest parti pour la vérif
:0043AB7B 50 push eax
:0043AB7C E8BF8E0000 call 00443A40
:0043AB81 83C404 add esp, 00000004
:0043AB84 8B85B0FDFFFF mov eax, dword ptr [ebp+FFFFFDB0]
:0043AB8A 668985B4FDFFFF mov word ptr [ebp+FFFFFDB4], ax
:0043AB91 8B85B4FDFFFF mov eax, dword ptr [ebp+FFFFFDB4]
:0043AB97 25FFFF0000 and eax, 0000FFFF
:0043AB9C 8B8DB4FDFFFF mov ecx, dword ptr [ebp+FFFFFDB4]
:0043ABA2 81E1FFFF0000 and ecx, 0000FFFF
:0043ABA8 0FAFC1 imul eax, ecx
:0043ABAB 8B8DB4FDFFFF mov ecx, dword ptr [ebp+FFFFFDB4]
:0043ABB1 81E1FFFF0000 and ecx, 0000FFFF
:0043ABB7 0FAFC1 imul eax, ecx
:0043ABBA 668985C0FDFFFF mov word ptr [ebp+FFFFFDC0], ax
:0043ABC1 8B85C0FDFFFF mov eax, dword ptr [ebp+FFFFFDC0]
:0043ABC7 50 push eax
:0043ABC8 8B85B4FDFFFF mov eax, dword ptr [ebp+FFFFFDB4]
:0043ABCE 50 push eax
:0043ABCF E8C0420000 call 0043EE94
:0043ABD4 83C408 add esp, 00000008
:0043ABD7 668985BCFDFFFF mov word ptr [ebp+FFFFFDBC], ax
:0043ABDE 8B85C0FDFFFF mov eax, dword ptr [ebp+FFFFFDC0]
:0043ABE4 50 push eax
:0043ABE5 8B85B4FDFFFF mov eax, dword ptr [ebp+FFFFFDB4]
:0043ABEB 50 push eax
:0043ABEC E80A410000 call 0043ECFB
:0043ABF1 83C408 add esp, 00000008
:0043ABF4 668985B8FDFFFF mov word ptr [ebp+FFFFFDB8], ax
:0043ABFB 8B85B8FDFFFF mov eax, dword ptr [ebp+FFFFFDB8]
:0043AC01 25FFFF0000 and eax, 0000FFFF
:0043AC06 8B8DBCFDFFFF mov ecx, dword ptr [ebp+FFFFFDBC]
:0043AC0C 81E1FFFF0000 and ecx, 0000FFFF
:0043AC12 3BC1 cmp eax, ecx
<- cÆest pas tout dÆavoir Get_Authorization à 0, il faut encore passer ce test-là !
:0043AC14 0F840A000000 je 0043AC24
:0043AC1A B896FFFFFF mov eax, FFFFFF96
:0043AC1F E9B8060000 jmp 0043B2DC

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043AB6F(C), :0043AC14(C)
|
:0043AC24 8B85C8FDFFFF mov eax, dword ptr [ebp+FFFFFDC8]
:0043AC2A E9AD060000 jmp 0043B2DC


Petite parenthèse : la æmajoritéÆ des fonctions de Crypkey renvoie des valeurs négatives en cas dÆerreur et 0 si tout sÆest bien passé. La valeur négative indiquant le type dÆerreur survenue. Fin de parenthèse.

On trace un petit peut et on se rend compte que cette valeur est renvoyée au retour du call, sauf si eax <> ecx en 43AC12h.
A ce niveau, il y a deux choses à faire :
1. forcer eax à 0
2. sÆassurer que cÆest 0 qui revient après le RET
Différentes options se présentent, mais personnellement jÆai choisi de patcher cryp95a.dll pour que eax revienne toujours avec 0

100010D5 Xor eax, eax
100010D7 Xor eax, eax
100010D9 NOP


et remplacer le JL en 43AB6Fh par un JMP.
On suit les retours jusquÆen 40FCB6h car notre eax (=0) est encore utilisé ici (40FCC2 mov esi, eax -> cÆest toujours lui !).
En regardant le listing, on se rend compte que nous avons toute une série de tests dÆerreur.
Nous allons contourner ces tests ou du moins forcer le bon chemin quand nécessaire.
Je vais pointer les sauts importants et jÆexpliquerai ensuite.

:0040FCB6 E88C9F0200 call 00439C47
:0040FCBB 83C408 add esp, 00000008
:0040FCBE 8D4C2414 lea ecx, dword ptr [esp+14]
:0040FCC2 8BF0
mov esi, eax
:0040FCC4 E882D50400 call 0045D24B
:0040FCC9 8D466C lea eax, dword ptr [esi+6C]
:0040FCCC 33ED xor ebp, ebp
:0040FCCE 83F86B cmp eax, 0000006B
:0040FCD1 C684248003000007 mov byte ptr [esp+00000380], 07
:0040FCD9 7756 0040FD31
-> ici (1)
:0040FCDB 33C9 xor ecx, ecx
:0040FCDD 8A885C024100 mov cl, byte ptr [eax+0041025C]
:0040FCE3 FF248D44024100 jmp dword ptr [4*ecx+00410244]
:0040FCEA 56 push esi
:0040FCEB 8D542418 lea edx, dword ptr [esp+18]

* Possible StringData Ref from Data Obj ->"Program is not correctly installed! "
->"ERR(%d)"
|
:0040FCEF 68ACDB4700 push 0047DBAC
:0040FCF4 52 push edx
:0040FCF5 E809810400 call 00457E03
:0040FCFA 8B442420 mov eax, dword ptr [esp+20]
:0040FCFE 83C40C add esp, 0000000C
:0040FD01 6A00 push 00000000
:0040FD03 6A00 push 00000000
:0040FD05 50 push eax
:0040FD06 E8D91F0500 call 00461CE4
:0040FD0B EB24 jmp 0040FD31
:0040FD0D 8D4C2414 lea ecx, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"Program must be installed on a "
->"local hard drive!"
|
:0040FD11 6878DB4700 push 0047DB78
:0040FD16 51 push ecx
:0040FD17 E8E7800400 call 00457E03
:0040FD1C 8B54241C mov edx, dword ptr [esp+1C]
:0040FD20 83C408 add esp, 00000008
:0040FD23 6A00 push 00000000
:0040FD25 6A00 push 00000000
:0040FD27 52 push edx
:0040FD28 E8B71F0500 call 00461CE4
:0040FD2D EB02 jmp 0040FD31
:0040FD2F 8BEB mov ebp, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040FCD9(C), :0040FD0B(U), :0040FD2D(U)
|
:0040FD31 8B4C2440 mov ecx, dword ptr [esp+40]
:0040FD35 33C0 xor eax, eax
:0040FD37 85C9 test ecx, ecx
:0040FD39 7408 je 0040FD43
-> ici (2)
:0040FD3B 8B4C243C mov ecx, dword ptr [esp+3C]
:0040FD3F 85C9 test ecx, ecx
:0040FD41 752A jne 0040FD6D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FD39(C)
|
:0040FD43 8D442448 lea eax, dword ptr [esp+48]
:0040FD47 50 push eax
:0040FD48 E8D4F70200 call 0043F521
:0040FD4D 8B4C2444 mov ecx, dword ptr [esp+44]
:0040FD51 83C404 add esp, 00000004
:0040FD54 33C0 xor eax, eax
:0040FD56 8BEB mov ebp, ebx
:0040FD58 85C9 test ecx, ecx
:0040FD5A 8B4C243C mov ecx, dword ptr [esp+3C]
:0040FD5E 0F94C0 sete al
:0040FD61 F7D9 neg ecx
:0040FD63 1BC9 sbb ecx, ecx
:0040FD65 83E1FE and ecx, FFFFFFFE
:0040FD68 83C102 add ecx, 00000002
:0040FD6B 0BC1 or eax, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FD41(C)
|
:0040FD6D 85ED test ebp, ebp
:0040FD6F 7418 je 0040FD89
-> ici (3)
:0040FD71 50 push eax
:0040FD72 56 push esi
:0040FD73 8BCF mov ecx, edi
:0040FD75 E8260D0000 call 00410AA0
:0040FD7A 85C0 test eax, eax
:0040FD7C 0F85FE000000 jne 0040FE80
:0040FD82 8BF3 mov esi, ebx
:0040FD84 E9BD000000 jmp 0040FE46

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FD6F(C)
|
:0040FD89 85F6 test esi, esi
:0040FD8B 0F85B9000000 jne 0040FE4A
-> ici (4)
:0040FD91 8D542424 lea edx, dword ptr [esp+24]
:0040FD95 8D442444 lea eax, dword ptr [esp+44]
:0040FD99 52 push edx
:0040FD9A 8D4C242C lea ecx, dword ptr [esp+2C]
:0040FD9E 50 push eax
:0040FD9F 8D542424 lea edx, dword ptr [esp+24]
:0040FDA3 51 push ecx
:0040FDA4 52 push edx
:0040FDA5 E83F9F0200 call 00439CE9
:0040FDAA 83C410 add esp, 00000010
:0040FDAD 85C0 test eax, eax
:0040FDAF 0F8591000000 jne 0040FE46
:0040FDB5 395C241C cmp dword ptr [esp+1C], ebx
:0040FDB9 0F8587000000 jne 0040FE46
:0040FDBF 8B442444 mov eax, dword ptr [esp+44]
:0040FDC3 8B542424 mov edx, dword ptr [esp+24]
:0040FDC7 2BC2 sub eax, edx
:0040FDC9 83F807 cmp eax, 00000007
:0040FDCC 7F78 jg 0040FE46
:0040FDCE 8D4C2410 lea ecx, dword ptr [esp+10]
:0040FDD2 E874D40400 call 0045D24B
:0040FDD7 8D4C2438 lea ecx, dword ptr [esp+38]
:0040FDDB C684248003000008 mov byte ptr [esp+00000380], 08
:0040FDE3 E863D40400 call 0045D24B

* Possible Reference to String Resource ID=00106: "Your trial period will expire in %d days! Please register y"
|
:0040FDE8 6A6A push 0000006A
:0040FDEA 8D4C243C lea ecx, dword ptr [esp+3C]
:0040FDEE C684248403000009 mov byte ptr [esp+00000384], 09
:0040FDF6 E8CEE60400 call 0045E4C9
:0040FDFB 8B4C2444 mov ecx, dword ptr [esp+44]
:0040FDFF 8B542424 mov edx, dword ptr [esp+24]
:0040FE03 2BCA sub ecx, edx
:0040FE05 8B542438 mov edx, dword ptr [esp+38]
:0040FE09 51 push ecx
:0040FE0A 8D442414 lea eax, dword ptr [esp+14]
:0040FE0E 52 push edx
:0040FE0F 50 push eax
:0040FE10 E8EE7F0400 call 00457E03
:0040FE15 8B4C241C mov ecx, dword ptr [esp+1C]
:0040FE19 83C40C add esp, 0000000C
:0040FE1C 56 push esi
:0040FE1D 56 push esi
:0040FE1E 51 push ecx
:0040FE1F E8C01E0500 call 00461CE4
:0040FE24 8D4C2438 lea ecx, dword ptr [esp+38]
:0040FE28 C684248003000008 mov byte ptr [esp+00000380], 08
:0040FE30 E861D50400 call 0045D396
:0040FE35 8D4C2410 lea ecx, dword ptr [esp+10]
:0040FE39 C684248003000007 mov byte ptr [esp+00000380], 07
:0040FE41 E850D50400 call 0045D396

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040FD84(U), :0040FDAF(C), :0040FDB9(C), :0040FDCC(C)
|
:0040FE46 85F6 test esi, esi
-> on aboutit ici (5)
:0040FE48 744E je 0040FE98

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040FD8B(C)
|
:0040FE4A 3BF3 cmp esi, ebx
:0040FE4C 744A je 0040FE98


(1) Ce test-là on le laisse tel quel, il sert à déterminer sÆil y a des erreurs dÆinstallation, ce qui peut être utile. Au passage, si ça coince à cet endroit chez vous, cÆest soit quÆeffectivement lÆinstall a foiré, soit (et cÆest ce que je pense) que vous avez lancé le programme décompressé mais sans lÆavoir renommé MP3PRO.EXE et comme il se base sur le nom de lÆEXE pour aller chercher des trucs dans la base de registres, ça cafouille par rapport au nom par défaut.
Donc, à priori, eax contient 6Ch et autorise le saut en 40FD31h. Au suivant ...
(2) Bon, il vient dÆoù ce ecx ? De [esp+40] et cÆest le résultat dÆune vérif. Il va falloir forcer le jump en 40FD39h pour lÆamener en 40FD6Dh (je 40FD43 -> jmp 40FD6D) => puisque je vous dit que cÆest par là, croyez-moi ;)
(3) ebp a été mis à 0 en 40FCCCh et nÆa plus changé depuis. Saut OK ! On ne modifie rien.
(4) esi contient toujours le retour de Get_Authorization (anciennement eax = 0 ). Saut à forcer et on lÆemmène en 40FE46h pour avoir la paix (jne 40FE4A -> je ou jmp 40FE46)
(5) On refait le même test sur esi qui vaut toujours 0. OK, on est dans le bon et on laisse courir :)

Il est difficile de vraiment creuser en détail, mais en résumé, Il fallait éviter tous les tests qui menaient (ou auraient pu mener) à des « voies de garage ». JÆai proposé un chemin, mais il y en a dÆautres ! Le tout est dÆarriver sans encombres en 40FE98h

Je vous laisse patcher MP3PRO.EXE (version décompressée !) et cryp95a.dll avec votre éditeur hexa préféré et on se retrouve ici après .
...
...
...
Ah vous voilà !
Vous lancez MP3PRO.EXE et miracle plus de demande de code.
Seulement, on nÆa pas encore la version PRO ! ! !
On repart pour un tour.
Voyons dans le listing ce qui nous semble intéressant (outre le fait quÆil y a des images et des icônes qui nous rappellent quÆil sÆagit de la version Lite).

* Referenced by a CALL at Addresses:
|:00404510 , :0041045B , :004171C1
|
:00406420 64A100000000 mov eax, dword ptr fs:[00000000]
:00406426 6AFF push FFFFFFFF
:00406428 68EB7D4600 push 00467DEB
:0040642D 50 push eax
:0040642E 64892500000000 mov dword ptr fs:[00000000], esp
:00406435 83EC68 sub esp, 00000068
:00406438 53 push ebx
:00406439 55 push ebp
:0040643A 56 push esi
:0040643B 57 push edi
:0040643C 8BE9 mov ebp, ecx
:0040643E 6A02 push 00000002
:00406440 E83E380300 call 00439C83
:00406445 83C404 add esp, 00000004
:00406448 83F802 cmp eax, 00000002
:0040644B 0F848E000000 je 004064DF
:00406451 6A02 push 00000002
:00406453 6A02 push 00000002
:00406455 E86F380300 call 00439CC9
:0040645A 83C408 add esp, 00000008
:0040645D 83F801 cmp eax, 00000001
:00406460 747D je 004064DF
:00406462 837D2C14 cmp dword ptr [ebp+2C], 00000014
:00406466 7C77 jl 004064DF
:00406468 6A00 push 00000000
:0040646A E8D1D50300 call 00443A40
:0040646F 8B7504 mov esi, dword ptr [ebp+04]
:00406472 8BC8 mov ecx, eax
:00406474 2BCE sub ecx, esi
:00406476 83C404 add esp, 00000004
:00406479 83F901 cmp ecx, 00000001
:0040647C 7E59 jle 004064D7
:0040647E 8D8C2488000000 lea ecx, dword ptr [esp+00000088]
:00406485 894504 mov dword ptr [ebp+04], eax
:00406488 E8BE6D0500 call 0045D24B
:0040648D 6A14 push 00000014
:0040648F 8D94248C000000 lea edx, dword ptr [esp+0000008C]

* Possible StringData Ref from Data Obj
->"The LITE version supports only "
->"%d files! PRO version supports "
->"an unlimited number."

|
:00406496 68BCD54700 push 0047D5BC
_______________________________________________
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040BB26(U), :0040BB2D(U)
|
:0040BB36 6A02 push 00000002
:0040BB38 E846E10200 call 00439C83
:0040BB3D 83C404 add esp, 00000004
:0040BB40 8BF8 mov edi, eax
:0040BB42 6A01 push 00000001
:0040BB44 6A02 push 00000002
:0040BB46 E87EE10200 call 00439CC9
:0040BB4B 83C408 add esp, 00000008
:0040BB4E 83FF02 cmp edi, 00000002
:0040BB51 7436 je 0040BB89
:0040BB53 83F801 cmp eax, 00000001
:0040BB56 7431 je 0040BB89
:0040BB58 681C040000 push 0000041C
:0040BB5D 8BCE mov ecx, esi
:0040BB5F C7863801000000000000 mov dword ptr [esi+00000138], 00000000
:0040BB69 E87B0D0500 call 0045C8E9
:0040BB6E 8BF8 mov edi, eax
:0040BB70 85FF test edi, edi
:0040BB72 7415 je 0040BB89

* Possible StringData Ref from Data Obj
->"Higher quality encode (Enabled "
->"in Pro version)"

|
:0040BB74 6830D84700 push 0047D830


Nous avons ici deux limitations de la version Lite. En regardant attentivement les deux portions de code, on constate des similitudes :
CALL 439C83h qui renvoie une valeur dans eax, comparée ensuite avec 2
et CALL 439CC9h qui renvoie une valeur dans eax, comprée avec 1.
Si lÆune de ces valeurs correspond à la valeur de comparaison, la limitation nÆa pas lieu.
On peut imaginer que le premier call a une importance supérieure (simplement pcqÆil vient avant lÆautre - cÆest fort comme réflexion non ?).
On va aller voir ce quÆil y a en 439C83h. Rien de spécial, si ce nÆest un CALL 43F344h qui nous mène à lÆappel dÆune autre fonction de cryp95a.dll : Get_level.
Effectivement, une fois de plus, cette fonction renvoie une valeur dans eax et cÆest celle-là qui sera testée en 406448h et en 40BB4Eh.
Vous voyez tout de suite ce qui nous reste à faire : patcher la fonction dans cryp95a.dll :

100012D4 shrd eax, edx, 10
devient
100012D4 xor eax, eax
100012D6 inc eax
100012D7 inc eax


Ce qui a pour effet de systématiquement renvoyer 2 dans eax.
Vous avez remarqué que je préfère patcher au niveau des fonctions plutôt que du programme lui-même. La raison est simple : par définition, les fonctions contenues dans les DLL sont destinées à être appelées à plusieurs reprises à des endroits divers du programme. En patchant les fonctions, vous vous évitez des problèmes ultérieurs, puisque vous êtes assurés de la valeur de retour !
CÆest le cas ici avec Get_Level car cÆest également cette fonction qui sera appelée pour déterminer sÆil faut afficher les gfx æLITEÆ ou æPROÆ.
Donc en modifiant directement la fonction, vous faites dÆune pierre deux coups.
Voilà, vous avez à présent une version PRO pour une durée illimitée.
CQFD :)

Psyche (Fred_Psyche@Hotmail.com)

PS : alors Cyberbobjr, cÆest suffisant comme explication ? ;)))))
Note de CBjr : Impec' ;) 20/20