Crack de Easy CDDA
Extractor 4.3.2
by
fredbug
Cours n°4
|
Salut, me revoilà pour un nouveau tut. On vas
cracker Easy Cdda Extractor 4.3.2 qui est un logiciel permettant de
convertir des fichiers .cda ou .wav en Mp3.
Méthode Live Approach, Dead Listing
Outils SoftIce 4.05, WinDasm 8.93, ProcDump 1.6, Hex WorkShop
How To Bon aller go! Au démarrage il nous affiche une boîte d'enregistrement, on vas encore attaquer par la ( je sais faire que ça... lol ). Remplissez et la vous vous appercevez qu'on peut pas valider. Merde alors!!! Pour qu'on puisse valider, il faut que le code soit bon. Donc le prog vérifie chaque lettre entré. Donc remplissez quand même, allez sous Softice et posez un bpx HmemCpy. Sortez de SI. Retapez une lettre ou un chiffre ( par exemple j'avais mis 12345, en sortant j'appuie sur "6" ). SI break!!! Cool!!! Il y a 2 champs donc faites F5, puis F12 jusqu'à revenir dans le prog ( 12 fois exactement ). N'oubliez pas de faire bc* pour virer le bpx HmemCpy ( fais chier celui la à breaker tous le temps ). Tracez avec F10 ( c'est pas trés loin ) et vous arriver là: :004632F8 E813AA0E00 call 0054DD10 > call de vérif :004632FD 84C0 test al, al > al=0 ??? :004632FF 7440 je 00463341 > saute vers Badboy si al=0 :00463301 B001 mov al, 01 > met al à 1
:0054DD10 55 push ebp :0054DD11 8BEC mov ebp, esp :0054DD13 53 push ebx :0054DD14 8B00 mov eax, dword ptr [eax] > un sérial ( marche pas, sûrement crypté ) :0054DD16 8B12 mov edx, dword ptr [edx] > notre sérial :0054DD18 E84310FDFF call 0051ED60 > compare les deux sérials :0054DD1D 0F94C0 sete al > ces deux instructions :0054DD20 83E001 and eax, 00000001 > mettent al à 0 :0054DD23 5B pop ebx :0054DD24 5D pop ebp :0054DD25 C3 ret > quitte
Donc: 0F94C0 sete al
83E001 and eax, 00000001
devient: B8010000000 mov eax, 00000001 > met eax à 1
90 nop > équilibre le code
Object01: UPX0 RVA: 00001000 Offset: 00000400 Size: 00000000 Flags: E0000080 Object02: UPX1 RVA: 001AB000 Offset: 00000400 Size: 000C0E00 Flags: E0000040 Object03: .rsrc RVA: 0026C000 Offset: 000C1200 Size: 00002800 Flags: C0000040
Object01: UPX0 RVA: 00001000 Offset: 00000600 Size: 001AA000 Flags: E0000020 Object02: UPX1 RVA: 001AB000 Offset: 001AA600 Size: 000C0B80 Flags: E0000020 Object03: .rsrc RVA: 0026C000 Offset: 0026B200 Size: 00002784 Flags: E0000020 Object04: .idata RVA: 0026F000 Offset: 0026DA00 Size: 00002400 Flags: E0000020
:004299D6 E859F8FFFF call 00429234 > call de vérif
:004299DB 59 pop ecx
:004299DC 84C0 test al, al > test si al=0
:004299DE 751A jne 004299FA > saute direct sur le message
:004299E0 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004299E3 85C9 test ecx, ecx > test si ecx=0
:004299E5 7408 je 004299EF > si oui Badboy
:004299E7 8B45F4 mov eax, dword ptr [ebp-0C] > rien???
:004299EA 8B50FC mov edx, dword ptr [eax-04] > notre code
:004299ED EB02 jmp 004299F1 > saute vers Goodboy
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004299E5(C)
|
:004299EF 33D2 xor edx, edx > Badboy
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004299ED(U)
|
:004299F1 83FA0A cmp edx, 0000000A > compare la longueur de notre sérial à 10
:004299F4 0F8D8E000000 jnl 00429A88 > si <>10 vas en Badboy
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004299DE(C)
|
:004299FA 66C78550FEFFFFB000 mov word ptr [ebp+FFFFFE50], 00B0
* Possible StringData Ref from Data Obj ->"The unlock key is not valid. Program "
->"will now exit."
|
:00429A03 BA80DB5500 mov edx, 0055DB80
:00429A08 8D45A4 lea eax, dword ptr [ebp-5C]
:00429A0B E878401200 call 0054DA88
:00429A10 FF855CFEFFFF inc dword ptr [ebp+FFFFFE5C]
:00429A16 8B00 mov eax, dword ptr [eax]
:00429A18 E8FB110B00 call 004DAC18 > affiche le message
Donc: 0F8D8E000000 jnl 00429A88 devient: E98F000000 jmp 00429A88 > force le saut en 00429A88 90 nop > équilibre le code
:00429ADC E847421200 call 0054DD28
:00429AE1 84C0 test al, al > test si al=0
:00429AE3 0F84F5000000 je 00429BDE > si oui n'affiche pas la boîte
:00429AE9 33C9 xor ecx, ecx
:00429AEB B201 mov dl, 01
* Possible StringData Ref from Data Obj ->"lhN"
|
:00429AED A1D0F35600 mov eax, dword ptr [0056F3D0]
:00429AF2 E8298E0300 call 00462920
:00429AF7 8BD8 mov ebx, eax
:00429AF9 8BC3 mov eax, ebx
:00429AFB 8B10 mov edx, dword ptr [eax]
:00429AFD FF92D8000000 call dword ptr [edx+000000D8] > affiche la boîte
Donc on le force: 0F84F5000000 je 00429BDE devient: 0F85F5000000 jne 00429BDE
:0044F9E4 E84B98FDFF call 00429234 > le même call que tout à l'heure!!!Arf!!!
:0044F9E9 59 pop ecx
:0044F9EA 84C0 test al, al > test si al=0
:0044F9EC 0F848E000000 je 0044FA80 > si oui saute
:0044F9F2 66C785C0FEFFFF8C00 mov word ptr [ebp+FFFFFEC0], 008C
* Possible StringData Ref from Data Obj ->"The unlock key is not valid. Program "
->"will now exit."
|
:0044F9FB BA53A85600 mov edx, 0056A853
:0044FA00 8D45C0 lea eax, dword ptr [ebp-40]
:0044FA03 E880E00F00 call 0054DA88
:0044FA08 FF85CCFEFFFF inc dword ptr [ebp+FFFFFECC]
:0044FA0E 8B00 mov eax, dword ptr [eax]
:0044FA10 E803B20800 call 004DAC18 > affiche le message
:0044FA86 E89DE20F00 call 0054DD28 > encore le même, Arf!!!
:0044FA8B 84C0 test al, al > test si al=0
:0044FA8D 0F84EB000000 je 0044FB7E > si oui saute
:0044FA93 33C9 xor ecx, ecx
:0044FA95 B201 mov dl, 01
* Possible StringData Ref from Data Obj ->"lhN"
|
:0044FA97 A1D0F35600 mov eax, dword ptr [0056F3D0]
:0044FA9C E87F2E0100 call 00462920
:0044FAA1 8BD8 mov ebx, eax
:0044FAA3 66C785C0FEFFFF5C00 mov word ptr [ebp+FFFFFEC0], 005C
:0044FAAC 8BC3 mov eax, ebx
:0044FAAE 8B10 mov edx, dword ptr [eax]
:0044FAB0 FF92D8000000 call dword ptr [edx+000000D8] > affiche la boîte
:0054DD28 55 push ebp :0054DD29 8BEC mov ebp, esp :0054DD2B 53 push ebx :0054DD2C 8B00 mov eax, dword ptr [eax] :0054DD2E 8B12 mov edx, dword ptr [edx] :0054DD30 E82B10FDFF call 0051ED60 :0054DD35 0F95C0 setne al > méchant :0054DD38 83E001 and eax, 00000001 > méchant :0054DD3B 5B pop ebx :0054DD3C 5D pop ebp :0054DD3D C3 ret
Donc: 0F95C0 setne al 83E001 and eax, 00000001 devient: B800000000 mov eax, 00000000 > met eax à 0, donc al à 0 90 nop > équilibre le code
T=2000: > le temps donné au loader F=ezcddax.exe: > le fichier source O=Loader.exe: > le fichier crée P=0054DD35/0F,95,C0/B8,00,00: > remplace la première ligne P=0054DD38/83,E0,01/00,00,90: > remplace la seconde ligne $ > fin
mov word ptr [0054DD35], 00B8 \ mov byte ptr [0054DD37], 00 \ fais les modifs mov word ptr [0054DD38], 0000 / mov byte ptr [0054DD3A], 90 / jmp 00401000 > passe le relais
//******************** Program Entry Point ******** :0066BA00 60 pushad > sauvegarde les registres :0066BA01 BE2EB05A00 mov esi, 005AB02E :0066BA06 8DBED25FE5FF lea edi, dword ptr [esi+FFE55FD2] ------------------------------------------------------ ------------------------------------------------------ > j'ai coupé ------------------------------------------------------ :0066BB6B 61 popad > restore les registres :0066BB6C E98F54D9FF jmp 00401000 > passe le relais :0066BB71 000000 BYTE 3 DUP(0) :0066BB74 8CBB6600 DWORD 0066BB8C :0066BB78 40BC6600 DWORD 0066BC40 :0066BB7C CC int 03 :0066BB7D DE5700 ficom word ptr [edi+00] :0066BB80 00000000000000000000 BYTE 10 DUP(0) | :0066BB8A 00000000000000000000 BYTE 10 DUP(0) | :0066BB94 00000000000000000000 BYTE 10 DUP(0) | de l'espace libre :0066BB9E 00000000000000000000 BYTE 10 DUP(0) | :0066BBA8 00000000000000000000 BYTE 10 DUP(0) | :0066BBB2 00000000000000000000 BYTE 10 DUP(0) |
Donc E98F54D9FF jmp 00401000 > passe le relais devient EB1C jmp 0066BB8A > saute vers le patch 90 nop // 90 nop // > équilibre le code 90 nop //
:005074D0 53 push ebx :005074D1 56 push esi :005074D2 57 push edi :005074D3 8BFA mov edi, edx :005074D5 8BD8 mov ebx, eax :005074D7 8B7308 mov esi, dword ptr [ebx+08] :005074DA 3B730C cmp esi, dword ptr [ebx+0C] :005074DD 7506 jne 005074E5 > ne saute pas :005074DF 8BC3 mov eax, ebx :005074E1 8B10 mov edx, dword ptr [eax] :005074E3 FF12 call dword ptr [edx] > affiche le message * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:005074DD(C) | :005074E5 8B4304 mov eax, dword ptr [ebx+04] // réaffiche :005074E8 893CB0 mov dword ptr [eax+4*esi], edi // le message
* Referenced by a CALL at Address: > 1 seul appel
|:005072C6
|
:005070D4 53 push ebx
:005070D5 E866A0EFFF call 00401140
:005070DA 83B80400000000 cmp dword ptr [eax+00000004], 00000000
:005070E1 7519 jne 005070FC > dans prog modifié il saute
:005070E3 B201 mov dl, 01 > mais ne saute pas dans prog original
* Possible StringData Ref from Data Obj ->"TvP"
|
:005070E5 A1BC5A5000 mov eax, dword ptr [00505ABC]
:005070EA E8156C0100 call 0051DD04
:005070EF 8BD8 mov ebx, eax
:005070F1 E84AA0EFFF call 00401140
:005070F6 899804000000 mov dword ptr [eax+00000004], ebx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005070E1(C)
|
:005070FC E83FA0EFFF call 00401140
:00507101 8B8000000000 mov eax, dword ptr [eax+00000000]
:00507107 50 push eax
:00507108 E833A0EFFF call 00401140
:0050710D 8B8004000000 mov eax, dword ptr [eax+00000004]
:00507113 5A pop edx
:00507114 E8B7030000 call 005074D0 > affiche le message
:00507119 B201 mov dl, 01
* Possible StringData Ref from Data Obj ->"TvP"
|
:0050711B A1BC5A5000 mov eax, dword ptr [00505ABC]
:00507120 E8DF6B0100 call 0051DD04
:00507125 8BD8 mov ebx, eax
:00507127 E814A0EFFF call 00401140
:0050712C 899800000000 mov dword ptr [eax+00000000], ebx
:00507132 5B pop ebx
:00507133 C3 ret
mov word ptr [0054DD35], 00B8 \ mov byte ptr [0054DD37], 00 \ fais les modifs mov word ptr [0054DD38], 0000 / mov byte ptr [0054DD3A], 90 / mov byte ptr [005070E1], 74 > inverse le saut jmp 00401000 > passe le relais
Donc: B201 mov dl, 01 A1BC5A5000 mov eax, dword ptr [00505ABC] devient: E9EA4A1600 jmp 0066BBD2 > saute vers le second patch 90 nop // équilibre 90 nop // le code
mov dword ptr [005070E3], 164AEAE9 > commence à crée le jump mov word ptr [005070E7], 9000 > finis de le crée et équilibre mov byte ptr [005070E9], 90 > équilibre Ainsi voilà la totalité du premier patch: mov word ptr [0054DD35], 00B8 \ mov byte ptr [0054DD37], 00 \ fais les modifs mov word ptr [0054DD38], 0000 / mov byte ptr [0054DD3A], 90 / mov byte ptr [005070E1], 74 > inverse le saut mov dword ptr [005070E3], 164AEAE9 > commence à crée le jump mov word ptr [005070E7], 9000 > finis de le crée et équilibre mov byte ptr [005070E9], 90 > équilibre jmp 00401000 > passe le relais
mov dl, 01 > restore ce qu'on a écrasée mov eax, dword ptr [00505ABC] > idem mov byte ptr [005070E1], 75 > remet le saut à la normal jmp 005070EA > retourne à la suite
|
Bah je vous dit à bientôt pour un prochain tut qui portera sûrement sur un jeu ( faut bien changer de temps en temps ).
fredbug
Greetz: A
tous ceux qui m'ont fait découvrir le Cracking ( Toutes la ShmeitCorp, Christal
et plein d' autres....... )