.:HoMe:.     .:CrackMe:.     .:My ProGGie:.     .:BuGs & ExpLoiTs:.     .:TOoLs:.     .:VaRiE:.

> CraCk Me n.1:SoLuTiOn <
Realizzato da NoRpiUs

ToOLz uTiLiZzATi:
- Debugger ( Olly Dbg )
- No Hex Editor + Disassembler (Vero?? :) )

SpiEgaZiOnE:
Beh.. il crack me e' molto molto semplice, l' ho codato per far si che quelli che sono alle prime armi potessero scriversi un bel keygenuzzolo :)  
Ma partiamo con la spiegazione:

Come al solito, apriamo il nostro bel programmino e mettiamo un breakpoint sull' API GetDlgItemTextA, andiamo su help --> registra e mettiamo un nome e pass a caso: notiamo che il debugger poppa sullo schermo. Subito dopo la seconda call che prende la pass notiamo questo:

CALL         JMP.&USER32.GetDlgItemInt         ; questa e' la call per la pass
MOV         EBX,EAX                                        ; prende il serial e lo mette in ebx
XOR          EAX,EAX                                        ; azzera eax
LEA           ESI,DWORD PTR DS:[4030F8]     ; carica in esi il nome

INIZIO CICLO:
MOV         AL,BYTE PTR DS:[ESI]                  ; mette in al la prima lettera del nome
TEST         AL,AL                                              ; controlla se il nome e' finito
JE              SHORT CrackMe.0040122D           ; se lo e', esce dal ciclo
ADD         ECX,EAX                                         ; aggiunge eax a ecx 
SUB          ECX,30                                             ; toglie a ecx 30h (48 decimale)
INC          ESI                                                    ; passa alla seconda lettera del nome
JMP          INIZIO CICLO                                 ; e torna a inizio ciclo 

Praticamente alla fine di questo ciclo abbiamo le lettere del nostro nome sommate in ecx e poi a ecx verra' sottratto un valore pari a 30h * le lettere del nome. Quindi per ora il nostro keygen dovrebbe venire una roba del genere:


main() {
  char *nome;
  int i, lun, serial = 0;

  printf("Scrivi il nome: ");
  scanf("%s",nome);

  lun = strlen(nome);
  for ( i = 0; i < lun; i++) 
  {
       serial += nome[i];
       serial -= 48;
  }

Cosi abbiamo il nostro bel registro ecx = somma. Ora andiamo avanti con il programma:
Subito dopo il ciclo ci sono queste righe:

CALL           CrackMe.0040127C              ; richiama qualcosa di oscuro e misterioso
CMP             EAX,EBX                              ; confronta eax con ebx (ovvero il seriale inserito)
JE                 SerialeGiusto                          ; se sono uguali vai a "Seriale giusto!" 
JMP             SerialeSbagliato                       ; se no vai a "Seriale Sbagliato!"

Quindi il programma esegue la call ( in cui probabilmente vi saranno degli altri calcoli, visto che dopo per dire se il seriale e' giusto o no confronta eax con ebx e noi abbiamo il nostro seriale in ecx ). Molti leim che non si prendono la briga di debuggare avranno cambiato quello stupido JE in un JNE in modo che salti sempre a "Seriale giusto!" anche quando il seriale e' sbagliato, ma a noi non ci interessa e andiamo imperterriti avanti col nostro debugging :)). A questo punto non ci resta che andare a spulciare quella call e vedere quali calvoli svolge, quindi andiamo sulla call e premiamo F7:

 

MOV         EAX,ECX    ; mette il seriale che si era calcolato prima in eax
ADD          EAX,1B        ; gli adda 1B ( 27 decimale)
CALL        Call2             ; e chiama la seconda call
RETN

Call2:
MOV        ECX,4E         ; mette in ecx 4E ( 78 decimale )
MUL         ECX              ; moltiplica eax per ecx ( quindi per 78 )
XOR         EAX,4D2       ; per ultimo xora il seriale per 4D2 ( 1234 decimale )
RETN

Quindi nella nostra call abbiamo una sottocall che richiama un altro codice, ma non ci fa paura visto che e' semplice ed e' subito dopo. A questo punto e' abbastanza semplice andare avanti con il keygen, visto che sono dei semplicissimi calcoli da aggiungere.
Alla fine il keygen risulta cosi:

#include <stdio.h>
#include <string.h>

main() {
  char *nome;
  int i, lun, serial = 0;

  printf("Scrivi il nome: ");
  scanf("%s",nome);

  lun = strlen(nome);
  for ( i = 0; i < lun; i++) 
  {
       serial += nome[i];
       serial -= 48;
  }

  serial += 27;
  serial *= 78;
  serial ^= 1234;

  printf("Il seriale e': %d",serial);
}

Perfetto, per oggi e' tutto. Spero che questo tutorial sia stato di vostro gradimento. Alla prossima, gente! :)

Sito ottimizzato per:
Browser: I.E.
Risoluzione: 1024 x 768
.:ReVeRsiNg:.     .:CoNTaCt Me:.     .:LiNks:.     .:ThaNksTo:.     .:FuCkTo:.