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

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

ToOLz uTiLiZzATi:
- Debugger ( Olly Dbg )

SpiEgaZiOnE:
Al mio amico |TonT| serviva una mano per questo crack me.. non riusciva a fare il keygen cosi mi son messo al lavoro e, dopo aver scritto il keygen giusto, ho deciso di scrivere un tutorial. Bon, cominciamo. Bpx su GetDlgItemTextA e siamo qua:

CALL EDI                                   ; prende il nome
CMP EAX,6                                 ; confronta se il nome e' lungo 6 
JNB SHORT Crackme1.00401239     ; se e' maggiore salta (e deve saltare!!)
PUSH 30                                    ; pusha i parametri della MessageBox MB_OK ecc...
PUSH Crackme1.004050DC            ; pusha la stringa "Lamer!"
PUSH Crackme1.004050AC            ; pusha "Il nome deve essere lungo 6 caratteri"
PUSH ESI                                   ; pusha l' hIstance
CALL DWORD PTR DS:[<&USER32.MessageBoxA>]   ; richiama la MessageBoxA


Beh il codice si commenta da solo, grazie anche alle stringhe. La lunghezza del nome > 6. Avanti. Ci sono un po' di righe dopo cmq arriva in questo punto dove dentro la "CALL EDI" si prende il suo seriale:

CALL EDI                                       ; prende il serial 
CMP EAX,6                                     ; confronta se e' lungo 6
JNB SHORT Crackme1.00401269         ; se e' maggiore di 6 jumpa (e deve jumpare)
PUSH 0                                          ; pusha i parametri della MessageBoxA, MB_OK ecc...
PUSH Crackme1.004050A4                 ; pusha la stringa "Leim!"
PUSH Crackme1.00405084                 ; pusha "Il serial inserito è errato."
PUSH ESI                                       ; pusha l' hIstance
CALL DWORD PTR DS:[<&USER32.MessageBoxA>]    ; richiama la MessageBoxA


Stessa storia di prima. Controlla se il serial e' lungo piu di 6 caratteri se no esce. Ora siamo arrivati al cuore del crack me... ovvero all'unico ciclo di creazione del serial. 

XOR ECX,ECX                                     ; azzera il contatore
Iniziociclo:
MOVSX EAX,BYTE PTR SS:[EBP+ECX-8]  ; mette in eax ECXesima lettera del nome
MOVSX EDX,CL                                   ; mette in edx il contatore
ADD EAX,EDX                                     ; somma edx a eax
MOV EDI,1A                                       ; mette 1Ah in edi (26 decimale)
CDQ                                                 ; non serve a un cazzo per il seriale
IDIV EDI                                            ; divide eax per 26
ADD DL,41                                         ; somma 41h al resto della divisione (65 decimale)
XOR DL,29                                         ; xora il resto per 29h (41 decimale)
NOP                                                 ; No OPeration
MOV AL,BYTE PTR SS:[EBP+ECX-10]      ; mette in al il ECXesima carattere del seriale
XOR AL,29                                         ; xora al per 29h (41 decimale)
CMP DL,AL                                         ; confronta la lettera del seriale col nome
JNZ SHORT Crackme1.004012D7            ; se sono diverse jumpa a "errore"
INC ECX                                            ; incrementa il contatore
CMP ECX,6                                        ; confronta il contatore con 6
JB SHORT Iniziociclo                            ; se e' minore torna a inizio ciclo

La routine e' molto semplice... e si puo' riassumere in queste fasi:
- Prende lettera del nome

- Aggiuge a questa lettera il contatore

- Divide il risultato per 26
- Al resto aggiunge 65 e controlla

Considerando che l'ultima operazione che fa con il nome prima di confrontarlo e' uno xor con 29 ed e' pure l'ultima operazione che fa con il seriale, si puo' fare a meno di implementarla nel keygen, in quanto e' inutile xorare 2 valori per uno stesso numero e dopo confrontarli... non li si xora e si confrontano direttamente. C'e' un altra cosa da notare: alla fine il contatore lo confronta con 6 e on con la lunghezza del nome o del seriale, il che vuol dire che al programma interessano solo i primi 6 caratteri del nome e del seriale, dei restanti caratteri non gliene importa nulla. Ora pasto il keygen finale:

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

main() {

  int lun, i, edx, eax;
  char nome[2000];

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

  lun = strlen(nome);
  if (lun < 6)
  {
       printf("Nome troppo corto, minimo 6 caratteri");
       exit(1);
  }

  printf("Il seriale e': ");
  for ( i = 0; i < 6; i++) 
  { 
      eax = nome[i];
      eax += i;
      edx = eax % 26;
      edx += 65;
      printf("%c",edx);
  } 
}

Ok abbiamo finito questo semplice crack me di ^Spider^. C ya.

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