CRACK de Adobe PageMill 3

By Nody

Intro.

 

Logiciel : Adobe PageMill 3.0

Source : Windows NEWS n°64 (mars 99)

Outils : W32Dasm, Soft-Ice et un éditeur hexa

Commentaires :

Adobe, bien connu pour ces bons logiciels professionnels (donc chers) est de retour avec PageMill 3 qui est un éditeur HTML, qui fait plein d'autres choses, enfin ça je vous laisse regarder.

Regret : Le crack de PageMill 3 n'est pas à la hauteur des autres produits Adobe comme Photoshop 5 et Illustrator 8 (si qqn à le crack de ce dernier, je suis preneur et si en plus il m'explique, je lui  suce la q.....)

 

Le Crack.

 

PM (PageMill) a l'air complet, on peut sauvegarder nos créations, etc ...., à part une petite messagebox quand on quitte, sinon ça à l'air tranquille.

Avancez votre date système et relancez PM : une messagebox et bye...bye. Remettez votre horloge syst. et vous verrez la même chose. DONC PM écrit quelque part que la période d'essai est terminée (registre, fichier ou les 2).

Sous Soft-Ice, mettez un 'bpx messageboxa' et redémarrez PM. On arrive sous Soft-Ice, faites un F12 et appuyez sur OK.On arrive dans mfc42.dll à l'adresse 5F416F02.Appuyez 2 fois sur F12 pour quitter cette DLL et enfin arriver dans pm3tryout.exe en 004A150E.

Désassemblez pm3tryout.exe et allez voir ce qu'il se passe autour de l'adresse 004A150E. Mouais, rien de passionant à part 100 sauts conditionnels. Allons voir qui appelle cette routine. Faites un F12 quand vous êtes en 004A150E et on arrive en   004A146E. Mêmes remarques, la routine est trop chiante et ça ressemble plus à routine d'appelle d'une messagebox utilisée par tout le prog qu'à la routine contenant la protection.

Donc sous Soft-Ice, un p'tit F12 qd vous êtes en 004A146E et cette fois on arrive en 004ECE1B. Allez sous w32dasm, ça commencce à être mieux, d'autant plus que quelques lignes au-dessus (en 004ECDC7), on a la string data ref "This tryout version of .... has expired etc...". Bien on approche.

Je vous ai écrit l'ensemble de cette routine car elle est intéressante :

Routine contenant le code ci-dessus :

Note : les commentaires sont développés après.

 

 

:004ECCBE B8C3C25300 mov eax, 0053C2C3    ;début de la routine

* Reference To: MSVCRT._EH_prolog, Ord:0042h

|

:004ECCC3 E8886E0300 Call 00523B50

:004ECCC8 51 push ecx

:004ECCC9 81EC64010000 sub esp, 00000164

:004ECCCF 53 push ebx

:004ECCD0 56 push esi

:004ECCD1 57 push edi

:004ECCD2 8D45DC lea eax, dword ptr [ebp-24]

:004ECCD5 8965F0 mov dword ptr [ebp-10], esp

:004ECCD8 8BF1 mov esi, ecx

:004ECCDA 33FF xor edi, edi

:004ECCDC 50 push eax

:004ECCDD 8975D4 mov dword ptr [ebp-2C], esi

:004ECCE0 897DCC mov dword ptr [ebp-34], edi

:004ECCE3 897DEC mov dword ptr [ebp-14], edi

* Reference To: MSVCRT.time, Ord:02CDh        ;  quel jour on est ?

|

:004ECCE6 FF1520125400 Call dword ptr [00541220]

:004ECCEC A1ACE85A00 mov eax, dword ptr [005AE8AC]

:004ECCF1 59 pop ecx

:004ECCF2 8D8880C61300 lea ecx, dword ptr [eax+0013C680]

:004ECCF8 394DDC cmp dword ptr [ebp-24], ecx  ; saute en 004ECD02 si

:004ECCFB 7F05 jg 004ECD02                     ; [ebp-24] > ecx

:004ECCFD 3945DC cmp dword ptr [ebp-24], eax   ; saute en 004ECD09 si

:004ECD00 7D07 jge 004ECD09                     ; [ebp-24] >= ecx

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

|:004ECCFB(C)

|

:004ECD02 C745EC01000000 mov [ebp-14], 00000001    ; [ebp-14] = 1

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

|:004ECD00(C)

|

* Possible StringData Ref from Data Obj ->"{6E996511-A3ED-11d1-B7B8-0060975AE13F}"

|

:004ECD09 685CD85A00 push 005AD85C

:004ECD0E 8D4DBC lea ecx, dword ptr [ebp-44]

* Reference To: MFC42.MFC42:NoName0787, Ord:0219h

|

:004ECD11 E866220200 Call 0050EF7C

:004ECD16 50 push eax

:004ECD17 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Data Obj ->"CLSID\"

|

:004ECD1A 682CCC5A00 push 005ACC2C

:004ECD1F 50 push eax

:004ECD20 897DFC mov dword ptr [ebp-04], edi

* Reference To: MFC42.MFC42:NoName0041, Ord:039Eh

|

:004ECD23 E8DE250200 Call 0050F306

:004ECD28 8D4DBC lea ecx, dword ptr [ebp-44]

:004ECD2B C645FC02 mov [ebp-04], 02

* Reference To: MFC42.MFC42:NoName0507, Ord:0320h

|

:004ECD2F E89A210200 Call 0050EECE

* Reference To: ADVAPI32.RegOpenKeyA, Ord:012Dh

|

:004ECD34 8B3D50005400 mov edi, dword ptr [00540050]   ; edi = RegOpenKeyA

:004ECD3A 8D45C0 lea eax, dword ptr [ebp-40]

:004ECD3D 50 push eax

:004ECD3E BB00000080 mov ebx, 80000000

:004ECD43 FF75E8 push [ebp-18]

:004ECD46 53 push ebx

:004ECD47 FFD7 call edi            ; essaie ouvrir la clé CLSID\{6E9965...

:004ECD49 85C0 test eax, eax      ; teste si la clé existe (alors eax=0)

:004ECD4B 7507 jne 004ECD54       ; saute si la clé n'existe pas (eax=1)

:004ECD4D C745EC01000000 mov [ebp-14], 00000001   ; [ebp-14] = 1

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

|:004ECD4B(C)

|

:004ECD54 FF75C0 push [ebp-40]

* Reference To: ADVAPI32.RegCloseKey, Ord:0117h

|

:004ECD57 FF154C005400 Call dword ptr [0054004C]

:004ECD5D 837DEC01 cmp dword ptr [ebp-14], 00000001  ; teste si [ebp-14]=1

:004ECD61 0F85F3000000 jne 004ECE5A                    ; saute si <>

* Possible StringData Ref from Data Obj ->"CLSID"

|

:004ECD67 68D4A95A00 push 005AA9D4

:004ECD6C 8D4DE0 lea ecx, dword ptr [ebp-20]

* Reference To: MFC42.MFC42:NoName0787, Ord:0219h

|

:004ECD6F E808220200 Call 0050EF7C

:004ECD74 8D45DC lea eax, dword ptr [ebp-24]

:004ECD77 C645FC03 mov [ebp-04], 03

:004ECD7B 50 push eax

:004ECD7C FF75E0 push [ebp-20]

:004ECD7F 53 push ebx

:004ECD80 FFD7 call edi    ; appel RegOpenKeyA pour CLSID\{6E9965...

:004ECD82 33DB xor ebx, ebx  ; ebx = 0

:004ECD84 3BC3 cmp eax, ebx   ; teste si eax = ebx

:004ECD86 7512 jne 004ECD9A    ; saute si  eax <> 0 (ie la clé existe)

:004ECD88 8D45D8 lea eax, dword ptr [ebp-28]

:004ECD8B 50 push eax

* Possible StringData Ref from Data Obj ->"{6E996511-A3ED-11d1-B7B8-0060975AE13F}"

|

:004ECD8C 685CD85A00 push 005AD85C

:004ECD91 FF75DC push [ebp-24]

* Reference To: ADVAPI32.RegCreateKeyA, Ord:011Ah ; sinon on crée la clé...

|

:004ECD94 FF1534005400 Call dword ptr [00540034]

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

|:004ECD86(C)

|

:004ECD9A FF75DC push [ebp-24]

* Reference To: ADVAPI32.RegCloseKey, Ord:0117h   ; et on la referme

|

:004ECD9D FF154C005400 Call dword ptr [0054004C]

* Possible StringData Ref from Data Obj ->"PMLocal.dll"

|

:004ECDA3 6850D85A00 push 005AD850

* Reference To: KERNEL32.LoadLibraryA, Ord:0190h

|

:004ECDA8 FF1534025400 Call dword ptr [00540234]

:004ECDAE 8BF8 mov edi, eax

:004ECDB0 3BFB cmp edi, ebx

:004ECDB2 89BECC000000 mov dword ptr [esi+000000CC], edi

:004ECDB8 752D jne 004ECDE7        ; fake saut ???

:004ECDBA 66A104EE5400 mov ax, word ptr [0054EE04]

:004ECDC0 6A01 push 00000001

:004ECDC2 50 push eax

:004ECDC3 53 push ebx

:004ECDC4 53 push ebx

:004ECDC5 53 push ebx

:004ECDC6 53 push ebx

* Possible StringData Ref from Data Obj ->"This tryout version of Adobe PageMill "

->"has expired. You can order PageMill "

->"by calling 1-800-411-8657 and "

->"referring to code 32906."

|

:004ECDC7 68CCD75A00 push 005AD7CC

:004ECDCC 8D4DB4 lea ecx, dword ptr [ebp-4C]

:004ECDCF E8C245FBFF call 004A1396             ; Messagebox

:004ECDD4 6AFF push FFFFFFFF

:004ECDD6 C645FC04 mov [ebp-04], 04

* Reference To: MSVCRT.exit, Ord:0246h        ; bye bye ...

|

:004ECDDA FF1500115400 Call dword ptr [00541100]

:004ECDE0 59 pop ecx

:004ECDE1 C645FC03 mov [ebp-04], 03

:004ECDE5 EB08 jmp 004ECDEF

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

|:004ECDB8(C)

|

* Reference To: MFC42.MFC42:NoName0814, Ord:0490h

|

:004ECDE7 E8EE200200 Call 0050EEDA

:004ECDEC 89780C mov dword ptr [eax+0C], edi

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

|:004ECDE5(U)

|

:004ECDEF 8D4DEC lea ecx, dword ptr [ebp-14]

* Reference To: MFC42.MFC42:NoName0813, Ord:021Ch

|

:004ECDF2 E8E9200200 Call 0050EEE0

:004ECDF7 6A01 push 00000001

:004ECDF9 8D4DEC lea ecx, dword ptr [ebp-14]

:004ECDFC C645FC05 mov [ebp-04], 05

* Reference To: MFC42.MFC42:NoName0815, Ord:1040h

|

:004ECE00 E8CF200200 Call 0050EED4

:004ECE05 66A104EE5400 mov ax, word ptr [0054EE04]

:004ECE0B 6A01 push 00000001

:004ECE0D 50 push eax

:004ECE0E 8D45EC lea eax, dword ptr [ebp-14]

:004ECE11 53 push ebx

:004ECE12 50 push eax

:004ECE13 8D4DC4 lea ecx, dword ptr [ebp-3C]

:004ECE16 E83A46FBFF call 004A1455             ; MessageBox

:004ECE1B 8B86CC000000 mov eax, dword ptr [esi+000000CC]

:004ECE21 C645FC06 mov [ebp-04], 06

:004ECE25 3BC3 cmp eax, ebx

:004ECE27 7407 je 004ECE30

:004ECE29 50 push eax

* Reference To: KERNEL32.FreeLibrary, Ord:0098h

|

:004ECE2A FF1548025400 Call dword ptr [00540248]

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

|:004ECE27(C)

|

:004ECE30 6AFF push FFFFFFFF

* Reference To: MSVCRT.exit, Ord:0246h        ; bye bye ....

|

:004ECE32 FF1500115400 Call dword ptr [00541100]

:004ECE38 59 pop ecx

:004ECE39 C745C4C4165400 mov [ebp-3C], 005416C4

:004ECE40 8D4DEC lea ecx, dword ptr [ebp-14]

:004ECE43 C645FC03 mov [ebp-04], 03

* Reference To: MFC42.MFC42:NoName0507, Ord:0320h

|

:004ECE47 E882200200 Call 0050EECE

:004ECE4C 8D4DE0 lea ecx, dword ptr [ebp-20]

:004ECE4F C645FC02 mov [ebp-04], 02

* Reference To: MFC42.MFC42:NoName0507, Ord:0320h

|

:004ECE53 E876200200 Call 0050EECE

:004ECE58 EB02 jmp 004ECE5C

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

|:004ECD61(C)

|

:004ECE5A 33DB xor ebx, ebx                ; démarrage du programme ...

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

|:004ECE58(U)

|

:004ECE5C 8B467C mov eax, dword ptr [esi+7C]

:004ECE5F 3BC3 cmp eax, ebx

:004ECE61 7408 je 004ECE6B

 

Elle est mignone, non ??

En 004ECCE6, PM récupère la date et met 1 dans [ebp-14] si la date est dépassée. Puis après il essaye d'ouvrir la clé CLSID\{6E996511-A3ED-11d1-B7B8-0060975AE13F}avec l'API RegOpenKeyA qui renvoie 0 dans eax si la clé n'existe pas et 1 si la clé existe. Si la clé existe, il fout 1 dans [ebp-14] (en 004ECD4D) . Puis il teste si [ebp-14] = 1 et il saute au démarrage du prog. si [ebp-14] <> 1 , sinon on continue dans la routine et il y a encore un teste si la clé existe, il la crée s'il n'existe pas puis il nous envoie le nag et bye.

DONC : si la clé existe, le programme 'sait' que la période d'essai a déjà été dépassée par l'utilisateur. Faites un essai : mettez votre date syst.dans la période d'essai, supprimez la clé dans la base de registre et par magie il n'y a plus le nag.

Ne vous faîtes pas d'illusion, la clé ne sert uniquement à indiquer SI le période d'essai a déjà été dépassé.

La vérification de la date se fait par l'API "time", et si la date est dépassée, le prog. fout 1 dans [ebp-14].

 

Pour cracker y'a qu'à changer ça :

 

* Reference To: MSVCRT.time, Ord:02CDh        ;  quel jour on est ?

|

:004ECCE6 FF1520125400 Call dword ptr [00541220]

:004ECCEC A1ACE85A00 mov eax, dword ptr [005AE8AC]

:004ECCF1 59 pop ecx

:004ECCF2 8D8880C61300 lea ecx, dword ptr [eax+0013C680]

:004ECCF8 394DDC cmp dword ptr [ebp-24], ecx 

:004ECCFB 90 nop

:004ECCFC 90 nop

:004ECCFD 3945DC cmp dword ptr [ebp-24], eax  

:004ECD00 EB07 jmp 004ECD09                    

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

|:004ECCFB(C)

|

:004ECD02 C745EC01000000 mov [ebp-14], 00000001    ; [ebp-14] = 1

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

|:004ECD00(C)

|

* Possible StringData Ref from Data Obj ->"{6E996511-A3ED-11d1-B7B8-0060975AE13F}"

|

:004ECD09 685CD85A00 push 005AD85C           ; le prog ira tjrs ici

:004ECD0E 8D4DBC lea ecx, dword ptr [ebp-44]

* Reference To: MFC42.MFC42:NoName0787, Ord:0219h

|

:004ECD11 E866220200 Call 0050EF7C

:004ECD16 50 push eax

:004ECD17 8D45E8 lea eax, dword ptr [ebp-18]

* Possible StringData Ref from Data Obj ->"CLSID\"

|

:004ECD1A 682CCC5A00 push 005ACC2C

:004ECD1F 50 push eax

:004ECD20 897DFC mov dword ptr [ebp-04], edi

* Reference To: MFC42.MFC42:NoName0041, Ord:039Eh

|

:004ECD23 E8DE250200 Call 0050F306

:004ECD28 8D4DBC lea ecx, dword ptr [ebp-44]

:004ECD2B C645FC02 mov [ebp-04], 02

* Reference To: MFC42.MFC42:NoName0507, Ord:0320h

|

:004ECD2F E89A210200 Call 0050EECE

* Reference To: ADVAPI32.RegOpenKeyA, Ord:012Dh

|

:004ECD34 8B3D50005400 mov edi, dword ptr [00540050]   ; edi = RegOpenKeyA

:004ECD3A 8D45C0 lea eax, dword ptr [ebp-40]

:004ECD3D 50 push eax

:004ECD3E BB00000080 mov ebx, 80000000

:004ECD43 FF75E8 push [ebp-18]

:004ECD46 53 push ebx

:004ECD47 FFD7 call edi            ; essaie ouvrir la clé CLSID\{6E9965...

:004ECD49 85C0 test eax, eax      ; teste si la clé existe (alors eax=0)

:004ECD4B EB07 jmp 004ECD54       ; la clé n'existe plus ;-)

:004ECD4D C745EC01000000 mov [ebp-14], 00000001   ; [ebp-14] = 1

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

|:004ECD4B(C)

|

:004ECD54 FF75C0 push [ebp-40]

* Reference To: ADVAPI32.RegCloseKey, Ord:0117h

|

:004ECD57 FF154C005400 Call dword ptr [0054004C]

:004ECD5D 837DEC01 cmp dword ptr [ebp-14], 00000001  ; teste si [ebp-14]=1

:004ECD61 0F85F3000000 jne 004ECE5A                    ; saute tjrs !


Voilà, vous pouvez maintenant démarrer le prog. au-delà de la période d'essai.

Mais, essayez d'enregistrer votre page et vous verrez une superbe messagebox "This tryout version of .... has expired". Pas de problème, c'est la même protection qu'au-dessus, il n'y a qu'à faire la même recherche sur la MessageBoxA et à coups de F12 dans Soft-Ice, puis récupéré l'adresse de le routine "enregistre_ou_enregistre_pas_?" et patcher la de la même manièrequ'au-dessus.

Dernier petit souci : il y a encore une messaegebox quand on quitte qui nous dit :

    soit "This tryout version of .... has expired"

    soit "cette version va expiré dans xx jours"

Patcher la 1ère messagebox avec la méthode vue au-dessus et pour la 2ème, il suffit de simplement patcher le call (avec 5 nop) de la messagebox (en 004EDC34).

 

Et voilà, Pagemill 3 version d'essai n'est plus. Faîtes en bonne usage mais d'oublier que cec que vous êtes en train de lire est une AIDE pour les crackers débutants !! Si vous vous en servez à un autre usage, allez sur un moteur de recherche, cherchez un patch pour pagemill3, mettez-y votre nom et soyez heureux mais vous n'êtes pas cracker alors mais simple copieur.

 

nodless@usa.net