Comment
Cracker ACDSEE ? 14 appels y font référence!!!
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).
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