Comment Cracker ACDSEE ?

1- La phase observation



Le programme:
La première chose à faire, pour cracker un programme, est de le lancer pour regarder comment il fonctionne.
On peut voir:

Un bandeau [unregistred] en haut de l'écran

Une boite d'enregistrement dans le menu "Help/About"

L'apparition régulière d'un écran de rappel Shareware.

Voilà de quoi orienter nos recherches.


Le désassemblage:

Importer le programme sous wdasm pour le désassembler, et lancer le menu "String Data
Références" pour voir ce qu'il peut nous raconter. C'est plutôt riche. Entre autre on retient:

	00406704    Regcode
	00404D80    Regname
	004013C5    Unregistred
	00406AFB    Serial number
	00406FAE    Your name and registration number do not match
	004014E1    Enter your registration number (ainsi qu'en 004024B5, 0040242A....)
	(pensez a double-cliquer plusieurs fois sur chacune des lignes de la boite 
    "Data String" pour rechercher les occurrences d'un même Item)
	Dans ce cas précis, vous en trouverez plusieurs.
	00401DF9    Your evaluation periode is over


Il ne reste plus qu'à poser des breakpoints pour achever cette phase Observation.



Le Débugger:

Via la boite Loader de Soft-ice, charger le programme, et poser un BPX à chacune des adresses ci-dessus, puis relancer le programme en appuyant sur F5, et après chaque break.

1er break 00406704 (regcode)
2ème break idem
3ème break idem
4éme break dem

5éme break 04013C5 (unregistred)

6ème break 00406704 (Regcode)

7èmè break 004013C5 (unregistred)

Puis l'écran d'ACDSee apparaît.

Aller dans le menu Help/about

2 break en 00406704

La boite d'enregistrement apparaît. Cliquer sur "Register Now".

Break en 00406AFB (serial number)

Remplir les champs de la boite d'enregistrement par votre nom et n° de série préféré, et valider.

Break en 00406FAE (your name do not match)

et retour au programme, avec un vilain écran "Your name and registration number do not match".

Fin de la phase Observation.


2- Reflexion


Il faut bien commencer quelque part.

Dans Uedit, importer le listing désassemblé avec WDASM (acdsee.alf), et à l'aide de la fonction
"rechercher", trouver "RegCode"

* Possible StringData Ref from Data Obj ->"RegCode"
                                  |
:00406704 6894034E00              push 004E0394
:00406709 50                      push eax

* Possible Reference to String Resource ID=00501: "Source and destination directories
must be different"
                                  |
:0040670A C7442420F5010000        mov [esp+20], 000001F5
:00406712 FFD6                    call esi
:00406714 8B4C240C                mov ecx, dUedit ptr [esp+0C]
:00406718 51                      push ecx

* Reference To: ADVAPI32.RegCloseKey, Ord:015Bh
                                  |
:00406719 FF1500C04C00            Call dUedit ptr [004CC000]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004066C2(C)
|
:0040671F 8A442414                mov al, byte ptr [esp+14]
:00406723 33FF                    xor edi, edi
:00406725 84C0                    test al, al
:00406727 C70540004E0000000000    mov dUedit ptr [004E0040], 00000000
:00406731 8D742414                lea esi, dUedit ptr [esp+14]
:00406735 741F                    je 00406756


En "descendant" le listing on arrive à un Je 00406756, en CS:00406735

Afin de savoir comment réagit ce " Je 00406756 ", on relance ACDSee.exe, et il break en 00406704.
En tracant avec F10, on arrive à notre "je". Soft-ice nous indique (no jump).
(il ne saute pas à la routine en 00406756)

Notre code étant faux, on peut imaginer que le programme se rendrait à la routine en 00406756
si il était bon. Pour voir, taper un R FL Z qui inverse le Zero Flag et transforme notre "no jmp", en "jmp",
et relancer le programme en tapant F5

Le programme break en 004013C5, [unregistred]. Pas bon ça !

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401387(U)
|
:0040139D E8CE520000              call 00406670
:004013A2 83F801                  cmp eax, 00000001
:004013A5 742A                    je 004013D1
:004013A7 8D942414010000          lea edx, dUedit ptr [esp+00000114]
:004013AE 6A50                    push 00000050
:004013B0 52                      push edx

* Reference To: KERNEL32.lstrlenA, Ord:0308h
                                  |
:004013B1 FF1514C24C00            Call dUedit ptr [004CC214]
:004013B7 8B8B00020000            mov ecx, dUedit ptr [ebx+00000200]
:004013BD 8D840418010000          lea eax, dUedit ptr [esp+eax+00000118]
:004013C4 50                      push eax

* Possible Reference to String Resource ID=00195: " [Unregistered]"
                                  |
:004013C5 68C3000000              push 000000C3
:004013CA 51                      push ecx

* Reference To: USER32.LoadStringA, Ord:01ABh
                                  |
:004013CB FF1538C64C00            Call dUedit ptr [004CC638]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004013A5(C)
|
:004013D1 8A1558B84E00            mov dl, byte ptr [004EB858]


Retour à notre source désassemblé dans Uedit, et on regarde ce qui se passe autour de
l'adresse 004013C.

Un peu plus haut dans le listing, on à un CS:004013A5 742A je 004013D1
qui nous fait sauter par dessus la routine [unregistred]. Ca c'est bon!

Pourquoi ? Grâce, ou à cause, d'un CMP EAX,00000001

Donc si EAX est égal à 1, le code est considéré comme bon?
Comment EAX est mis, ou non, à 1?

Très certainement dans le Call 00406670 juste au dessus.

Est ce notre routine de vérification de la validité du code?

Retour à Uedit pour faire une recherche sur ce call 00406670.

* Referenced by a CALL at Addresses:
|:0040103F   , :004010D4   , :0040114D   , :0040124F   , :0040139D   
|:004014D3   , :0040175B   , :004017F5   , :0040195F   , :00401D4C   
|:004021F4   , :0040241C   , :004024A7   , :004039B8   
|
:00406670 81EC24020000            sub esp, 00000224  (la suite n'apporte rien de plus).

14 appels y font référence!!!

Ca pourrait bien être la routine de contrôle du code, mais testé 14 fois, n'y aurait-il pas d'abus?



3 Quelle stratégie adopter?


Avec Uedit, aller faire un tour à chacune de ces adresses dont voilà un exemple:

:004024A7 E8C4410000              call 00406670
:004024AC 85C0                    test eax, eax
:004024AE 740D                    je 004024BD
:004024B0 8B4654                  mov eax, dUedit ptr [esi+54]
:004024B3 6A00                    push 00000000

* Possible Ref to Menu: MenuID_4EBA, Item: "Register..."
                                  |

* Possible Reference to String Resource ID=20210: "Enter your registration code and unlock this software."


Etonnant non!
Pour toutes ces adresses sauf une, il y a un test EAX,EAX (pour 9 adresses), ou un
CMP EAX,00000001 (pour 4 adresses).

EAX = 1 est tout marcherai ?

On relance ADCSee.exe, et au premier break, on tape un BD* pour désactiver tous nos précédents
points d'arrêt, et on les remplace par les 14 appels fait au call 00406670.
Puis on sort complètement de soft-ice en appuyant sur F5 autant de fois que nécessaire.

Relance de ACDSee, et à chaque fois que le programme break dans soft-ice, on inverse le drapeau par
un R FL Z, pour transformer des "jmp" en, "no jmp", et inversement, sauf pour le 1er break (en 004021F4)
ou il n'y a aucun test de fait (?! Alors pourquoi contrôler la validité du code?!).

Le programme ne passe pas par tous les points d'arrêt quant on cherche à s'enregistrer (seul 7 d'entres
eux sont "sollicités"), les autres sont là pour d'autres fonctions du programme...

Tout marche! Le bandeau [unregistred] à disparu et dans Help/About, nous sommes "utilisateur enregistré".

Donc, ca voudrait dire qu'il faudrait faire treize modifications pour finir ce crack?!

J'ai bien essayé de créer un résident en utilisant de la place "libre" à l'intérieur du programme (13 NOP disponibles à l'adresse 00458b73) en cherchant à mettre EAX à 00000001 juste avant la fin de la routine de contrôle de la validité du code, mais il semblerait qu' ACDSee le détecte, et du coup, s'en est fini de notre crack, nous sommes à nouveau en version Shareware et, et le programme ne break même plus sur le call 00406670!!! Il n'est pas non plus impossible Qu'ACDSee utilise lui même ces NOP...



4 Pour finir: les modifications à faire

A défaut d'autre solution, j'ai modifié avec HexWorkShop les 13 contrôles (Test EAX,EAX, ou CMP
EAX,00000001), un par un en, dont voici les principaux.

Cs:0040241C					    Cs:004013A5

85C0 74 0D 8B 56 1C				74 2A 8D 94 24 14 01
     75				         	75


Cs:004024AE

85 C0 74 0D 8B 46 54		pour le lancement du programme
      75


pour le menu Help/about

Cs:40124F					    Cs:00401D54

75 05 BE FC 03 00 00			 	75 68 8B 0D 00 03 4E
74                                74


pour le "lancement" d'une image		pour la sortie d'ACDSee

cs:4017F5					    Cs:004039B8

75 05 BF FC 03 00 00				F8 01 5E 74 4D A1 00
74                                         75


Mon objectif a été de comprendre comment le programme était protégé, pas de trouver un crack à diffuser. Je vous laisse le soins de finir celui-ci en trouvant les autres modifications à apporter, sachant que :

Vous changez un jump (par ex JE) en le nopant (No Opération) par deux 90 dans Hex WorkShop
Vous changez un no-jump par un saut inconditionnel à l'aide d'un EB dans votre éditeur Hexa.
Vous pouvez aussi remplacer un jne (75) par un je (74), et inversement. Certain diront que la methode est plus élégante...



5 En conclusion


On ne peut pas vraiment dire que ce crack soit réussi. 13 modifications à apporter dans un programme tient plutôt de l'echec, même si ça marche !

L'idéal aurait été de pouvoir mettre EAX à 1. Le réussir sans faire planter le programme oblige à trouver comment modifier le programme sans rajouter d'octet (est-ce pour cela qu'il ne fonctionne plus avec un résident), et qu'il en faut 5 au minimum pour un MOV EAX,00000001.

Si quelqu'un pouvait m'aider à trouver la solution…

Bonne Journée

Christal