Crackiamo ACDSee 3.24
 
------------------------------------------------------------------------------------------------------------
Vorrei dedicare questo tutorial a mio zio che una settimana fa è rimasto quasi del tutto paralizzato a seguito di un incidente......Zio torna a camminare, fallo per noi
------------------------------------------------------------------------------------------------------------
Tools:
SoftIce 3.25 (o precedenti)
 
Ciauz a tutti, in questo tutorial impareremo a crackare ACDSee 3.24, apriamo il programmillo vittima, in alto notiamo una scritta "UNREGISTERED", notiamo anche nel menu Help il sottomenu About, clicchiamoci sopra e vediamo aprirsi una finestra con tre pulsanti: "Register now", "Remind me later", "More info"....ovviamente cliccherete sul primo bottone, inserite un nome (io uso Quequero), un dummy number (666111666) e prima di premere invio aprite SoftIce e mettete un bp su GetDlgItemTextA (bpx GetDlgItemTextA). Premete una volta F11 e fate step con F10 fino ad arrivare qui:
 
.text:00406DD7  mov al, [esp+1Ch] ; Muove in AL una lettera del nome (ESP+1c = nome)
.text:00406DDB  lea esi, [esp+1Ch]
; Carica il nome in ESI
.text:00406DDF  test al, al
.text:00406DE1  jz _text_406F33
.text:00406DE7  movsx edx, byte ptr [esi]
; Salva una lettera del nome in EDX
.text:00406DEA  push edxv                        
.text:00406DEB  call _text_4BF26E
.text:00406DF0  add esp, 4
.text:00406DF3  test eax, eax
.text:00406DF5  jz short _text_406DF8
.text:00406DF7  inc ebx
.text:00406DF8  mov al, [esi+1]
.text:00406DFB  inc esi
.text:00406DFC  test al, al
.text:00406DFE  jnz 406DE7
; Se il nome non è ancora finito torna sopra
.text:00406E00  cmp bx, 5
.text:00406E04  jl 406F33
; Salta alla beggar off
.text:00406E0A  lea eax, [esp+7Ch]
; Carica il seriale in EAX
.text:00406E0E  push 0
.text:00406E10  lea ecx, [esp+20h]
; Carica il nome in ECX
.text:00406E14  push eax
.text:00406E15  push ecx
.text:00406E16  push offset
str->  -314159265
.text:00406E1B  call 458A90 
; Routine di calcolo del seriale, entriamo qui con F8
.text:00406E20  add esp, 10h
.text:00406E23  neg eax
 
Con F8 entrate nella chiamata all'indirizzo xxxx:00406E20, fate step con F10 fino ad arrivare qui:
 
.text:00458A9E  push esi
.text:00458A9F  push edi
.text:00458AA0  push eax
.text:00458AA1  push ecx
.text:00458AA2  call _text_4593B0
.text:00458AA7  lea edi, [esp+94h+var_84]
; Carica in EDI il nostro nome convertito in                                                                     ; UpperCase
.text:00458AAB  or ecx, 0FFFFFFFFh
.text:00458AAE  xor eax, eax
.text:00458AB0  add esp, 8
.text:00458AB3  repne scasb
.text:00458AB5  not ecx
.text:00458AB7  dec ecx
.text:00458AB8  mov eax, 2AAAAAABh
.text:00458ABD  imul ecx
.text:00458ABF  mov eax, edx
.text:00458AC1  xor esi, esi
.text:00458AC3  shr eax, 1Fh
.text:00458AC6  test ecx, ecx
.text:00458AC8  lea edi, [edx+eax+1]
.text:00458ACC  jle short _text_458ADF
; Muove il seriale in ECX
.text:00458ACE  xor eax, eax
.text:00458AD0  mov dl, [esp+eax+8Ch+var_84]
; Esegue due loop, in ognuno dei quali                                                                                   ; mette alternamente le lettere del nome in DL                                                                                   ; (nel mio caso carica solo le lettere QEUR)
 
.text:00458AD4  add eax, edi
.text:00458AD6  mov [esp+esi+8Ch+var_58], dl
.text:00458ADA  inc esi
.text:00458ADB  cmp eax, ecx
.text:00458ADD  jl 458AD0
.text:00458ADF  mov ecx, [esp+8Ch+arg_8]
; Muove il seriale in ECX
.text:00458AE6  mov edx, [esp+8Ch+arg_0]
; Muove "-314159265" in EDX
.text:00458AED  lea eax, [esp+8Ch+var_2C]
.text:00458AF1  push 29h
.text:00458AF3  push eax
.text:00458AF4  push ecx
.text:00458AF5  push edx
.text:00458AF6  mov [esp+esi+9Ch+var_58], 0
.text:00458AFB  call _text_458B80
.text:00458B00  mov ecx, [esp+9Ch+arg_C]
.text:00458B07  add esp, 10h
.text:00458B0A  cmp eax, ecx
.text:00458B0C  jz
00458B19 ; Salta se il serial è esatto
.text:00458B0E   pop edi
.text:00458B0F  xor eax, eax
.text:00458B11   pop esi
.text:00458B12  add esp, 84h
.text:00458B18  retn
Allora, arrivati all'indirizzo xxxx:00458B0C provate a invertite il flag Z (con r fl z sotto Sice) e salterete dritti nella nuova routine, cioè questa:
 
.text:00458B19  push ebx
.text:00458B1A  lea esi, [esp+90h+var_2C]
.text:00458B1E  lea eax, [esp+90h+var_58]
; EAX contiene alternate le lettere del nome (QEUR)
.text:00458B22  mov dl, [eax]
.text:00458B24  mov bl, [esi]
.text:00458B26  mov cl, dl
; Muove una lettera del nome in CL
.text:00458B28  cmp dl, bl
; Confronta la lettera con una lettera calcolata dal programma
.text:00458B2A  jnz 458B5B
; Se uguali salta e continua il check
.text:00458B2C  test cl, cl
.text:00458B2E  jz 458B46
; Salta alla good guy
.text:00458B30  mov dl, [eax+1]
.text:00458B33  mov bl, [esi+1]
.text:00458B36  mov cl, dl
.text:00458B38  cmp dl, bl
; Confronta le lettere come sopra
.text:00458B3A  jnz 
; Se sono diverse salta
.text:00458B3C  add eax, 2
.text:00458B3F  add esi, 2
.text:00458B42  test cl, cl
.text:00458B44  jnz 458B22
.text:00458B46  xor eax, eax
; Azzera EAX
.text:00458B48  xor ecx, ecx
; Azzera ECX
.text:00458B4A  test eax, eax
.text:00458B4C  setz cl
.text:00458B4F  pop ebx
.text:00458B50  pop edi
.text:00458B51  mov eax, ecx
.text:00458B53  pop esi
.text:00458B54  add esp, 84h
.text:00458B5A  retn

Benissimo, a questo punto potremmo soffermarci ad esaminare l'algoritmo per poter fare un keygenerator, però dal momento che sono pigro vi farò patchare solo 3 istruzioni, indovinate quali? Sicuramente andremo a cambiare questa istruzione: .text:00458B0C  jz 00458B19 in un bel jump e poi cambieremo in nop il jnz a 00458B2A ed infine in jmp il jz a 458B2E.
Per farlo basta disassemblare il file con W32DASM, cercare le istruzioni, farci doppio click sopra e vedere in basso l'offset, aprire un editor esadecimale e cambiare i byte, oppure sarebbe più facile usare un Patching Engine, fate voi.........vabbè dal momento che sono buono vi do un po' di info:
 
Virutal address   codice esadecimale     offset            istruzione    cambiare i byte      istr. cambiata
   00458B0C                   74 0B                00058B0Ch           jz               EB 0B                        jmp
   00458B2A                   75 2F                00058B2Ah           jnz             90 90                         nop
   00458B2E                   74 16                00058B2Eh            jz               EB 16                        jmp
 
Non dovete far altro che aprire un editor esadecimale, inserire gli offset che vi ho dato (nell'Hex Workshop dovete cliccare su "Go to offset") e cambiare i byte della seconda colonna con quelli della quinta, aprire ACDSee a registrarsi con il nome che più vi piace.....Semplice no!
 
                                                                                                          Quequero