Reversing [PE32 ASM - CrackMe (Self)KeygenMe] Ice9

Stato
Discussione chiusa ad ulteriori risposte.

Zyrel

Utente Electrum
3 Gennaio 2009
425
31
27
156
Ultima modifica da un moderatore:
Ciao a tutti :)
Ho pensato di postare questo crackme che tempo fà Di4b0 ci sottopose :)
È veramente facile da crackare, nessuna protezione particolare, quindi, come lui ci chiese, questa volta vi chiedo di creare un self keygen.

Anzi, per essere precisi vi chiedo:
+ Una Crack che permetta di fare accettare qualsiasi seriale
+ Un Self-Keygen (decidete voi come fare apparire il seriale, io lo ho fatto in 2 modi ma ce ne sono molti)
+ Un Keygen

Download: Ice9.exe

Mia soluzione: (da guardare solo se non ci riuscite xd)
http://www.mediafire.com/?mcb2d6u23i9hqxy
 
xd ma anche se non lo aveste mai visto direi che non vi servirebbe nemmeno mettercisi sotto per una cosa così facile ;)
 
Quasi del tutto :)
Non accetta un seriale nullo :D
ok quella era la prima richiesta e bravo per l' impegno :)
Ora cerca di soddisfare anche le altre ;)
 
Per il momento non sò dove aggrapparmi per fare il keygen ...

--- Aggiornamento Post ---

Stò debuggando, credo di aver individuato il cuore della generazione ....
 
Adesso non ricordo di preciso com'era questo crackme, ma se hai fatto un self-keygen significa che hai capito dove viene allocato il seriale, quindi ti basta seguire quella routine al contrario e vedrai tutti i calcoli che vengono svolti
 
Genera tutto qui :


004011B7 > 33D2 XOR EDX,EDX ; azzera EDX
004011B9 . F7F1 DIV ECX ; Esegue la divisione intera di ECX ( ottiene sempre 0A )
004011BB . 80C2 30 ADD DL,30 ; Aggiunge a DL 30 ( non sò dove pesca DS )
004011BE . 881433 MOV BYTE PTR DS:[EBX+ESI],DL ; sposta la seconda cifra del risultato es : DL=34 -> 4
004011C1 . 83C3 01 ADD EBX,1 ; incrementa EBX
004011C4 . 83F8 00 CMP EAX,0 ; EAX = 0 <- a cosa serve ?
004011C7 . 74 02 JE SHORT Ice9DEBU.004011CB ;RICICLA

non sò che tirarci fuori, la cosa che ho capito è che questo genera il serial "al contrario"


ho un pò di confusione xDD

--- Aggiornamento Post ---

non posso editare, ho sbagliato a scrivere un commento :

004011BB . 80C2 30 ADD DL,30 ; Aggiunge a DL 30 ( non sò dove pesca DL )
 
Non proprio, quella è una parte dell' algo, anche la parte prima compie delle semplici operazioni aritmetiche che vanno a creare il sseriale :)
 
Non ho fatto in tempo a rx :) Cmq si :)
Stai seguendo la giusta strada :)
Appena posti il tuo keygen posto il listato con tutta la routine che genera il seriale commentata... non si sa mai che possa serivre a qlkn :)
 
sembra che il programma sommi l' esadecimale delle lettere in ECX, dopodichè fà qualche altra operazione con imul e sub,tirando fuori un numero bello grande.
Dopodichè copia ECX in EAX, assegna ad ECX 0A

fino a qui ci sono ?
 
giustissimo :) hai trovato il seriale quasi completo :) il resto lo vedi anche ad occhio dal seriale giusto che si vede in chiaro ;)
 
Bravo per l' impegno :)
Visto che ormai ci sei arrivato posto il listato che ho commentato :)
Codice:
00401153    $  55             PUSH EBP
00401154    .  8BEC           MOV EBP,ESP
00401156    .  68 B4304000    PUSH Ice9.004030B4                                     ; /String = "Zyrel"
0040115B    .  E8 42010000    CALL <JMP.&kernel32.lstrlenA>                          ; \lstrlenA
00401160    .  BA 6A314000    MOV EDX,Ice9.0040316A
00401165    .  8902           MOV DWORD PTR DS:[EDX],EAX                             ;  infila nell indirizzo puntato da EDX la lunghezza del nick
00401167    .  BF B4304000    MOV EDI,Ice9.004030B4                                  ;  muove il nick in EDI
0040116C    .  BE 19314000    MOV ESI,Ice9.00403119                                  ;  ASCII "370512621"
00401171    .  33C0           XOR EAX,EAX                                            ;  azzera EAX
00401173    .  33DB           XOR EBX,EBX                                            ;  azzera EBX
00401175    .  33C9           XOR ECX,ECX                                            ;  azzera ECX
00401177    .  33D2           XOR EDX,EDX                                            ;  azzera EDX
00401179    .  BA 6A314000    MOV EDX,Ice9.0040316A
0040117E    .  8B12           MOV EDX,DWORD PTR DS:[EDX]                             ;  muove la lunghezza del nick in EDX
00401180    >  83C3 01        ADD EBX,1                                              ;  parte un ciclo for con il counter inizializzato ad 1
00401183    .  3BD3           CMP EDX,EBX                                            ;  compare la len con EBX (0)
00401185    .  74 15          JE SHORT Ice9.0040119C                                 ;  se è uguale salta
00401187    .  8A07           MOV AL,BYTE PTR DS:[EDI]                               ;  Prende il primo carattere del nick e lo mette in AL
00401189    .  3C 5A          CMP AL,5A                                              ;  controlla se il carattere è <= di 90
0040118B    .  7E 05          JLE SHORT Ice9.00401192                                ;  se si salta al prossimo if
0040118D    >  03C8           ADD ECX,EAX                                            ;  somma ECX con EAX (valore ASCII del char)
0040118F    .  47             INC EDI                                                ;  incrementa EDI (variabile counter dell' iterazione)
00401190    .^ EB EE          JMP SHORT Ice9.00401180                                ;  cicla di nuovo
00401192    >  3C 41          CMP AL,41                                              ;  controlla che il char sia maggiore o uguale a 65
00401194    .  7D 02          JGE SHORT Ice9.00401198                                ;  se si (quindi se il carattere è MAIUSCOLO) salta
00401196    .  EB 02          JMP SHORT Ice9.0040119A                                ;  se no salta a 00401198
00401198    >  04 2C          ADD AL,2C                                              ;  somma 44 al valore del char tenuto in EAX
0040119A    >^ EB F1          JMP SHORT Ice9.0040118D                                ;  somma EAX con ECX (004018D)
0040119C    >  81C1 9A020000  ADD ECX,29A                                            ;  somma_char = somma_char + 666
004011A2    .  69C9 39300000  IMUL ECX,ECX,3039                                      ;  somma_char = somma_char * 12345
004011A8    .  83E9 17        SUB ECX,17                                             ;  somma_char = somma_char - 23
004011AB    .  6BC9 09        IMUL ECX,ECX,9                                         ;  somma_char = somma_char * 9
004011AE    .  33DB           XOR EBX,EBX                                            ;  azzera EBX
004011B0    .  8BC1           MOV EAX,ECX                                            ;  muove il seriale corretto (non completo) in EAX
004011B2    .  B9 0A000000    MOV ECX,0A
004011B7    >  33D2           XOR EDX,EDX                                            ;  azzera EDX (che conteneva la len del nick)
004011B9    .  F7F1           DIV ECX                                                ;  divide ECX
004011BB    .  80C2 30        ADD DL,30                                              ;  somma 30 a DL
004011BE    .  881433         MOV BYTE PTR DS:[EBX+ESI],DL                           ;  mette DL nell' indirizzo puntato
004011C1    .  83C3 01        ADD EBX,1                                              ;  EBX + 1
004011C4    .  83F8 00        CMP EAX,0                                              ;  compara il nostro seriale con 0
004011C7    .  74 02          JE SHORT Ice9.004011CB                                 ;  se lo è salta a 004011CB
004011C9    .^ EB EC          JMP SHORT Ice9.004011B7                                ;  se no torna allo XOR ad 004011B7
004011CB    >  BF C8304000    MOV EDI,Ice9.004030C8                                  ;  ASCII "126215073el"
004011D0    >  8A4433 FF      MOV AL,BYTE PTR DS:[EBX+ESI-1]                         ;  mette il char contenuto nell' indirizzo puntato in AL
004011D4    .  8807           MOV BYTE PTR DS:[EDI],AL                               ;  AL và nel indirizzo puntato da EDI
004011D6    .  47             INC EDI                                                ;  aumenta EDI
004011D7    .  4B             DEC EBX                                                ;  decrementa EBX
004011D8    .  83FB 00        CMP EBX,0                                              ;  compara EBX con 0
004011DB    .^ 75 F3          JNZ SHORT Ice9.004011D0                                ;  se non è = a = cicla di nuovo da 004011D0
004011DD    .  C607 00        MOV BYTE PTR DS:[EDI],0
004011E0    .  8D3D B4304000  LEA EDI,DWORD PTR DS:[4030B4]
004011E6    .  68 B7304000    PUSH Ice9.004030B7                                     ;  prende le ultime due lettere del nick
004011EB    .  68 C8304000    PUSH Ice9.004030C8                                     ;  pusha la prima parte del serial
004011F0    .  E8 BB000000    CALL Ice9.004012B0                                     ;  concatena le due stringhe (prima parte numerica e ultimi 2 char)
004011F5       68 C8304000    PUSH Ice9.004030C8                                     ;  ecco qui il nostro seriale!! :D

Spero possa essere utile a qualcuno :)
 
Eccomi xD, mi ero scordato di non aver postato il link, cmq eccolo qui

Ice9 - Keygen.rar

Per gli interessati, ma anche per completare il reversing di questo crackME, posto il source del keygen

Codice:
#include <iostream>
#include <string.h>

using namespace std;

int main ()
{
	char name[100];
	int stringdec=0;
	int lun=0;
	


	cout<<"Ice9 crackME keygen, created by BeTmAsTeR\n";
	cout<<"Inserisci l' username\n";

	gets(name); // get the username
	lun = strlen(name); // get username lenght

	if (lun <4 || lun>10)
	{
		cout<<"Inserisci un username valido, 4 < caratteri < 10 \n";
		return 0;
	}

	for (int i=0;i<(lun-1);i++) 
		stringdec+=int(name[i]);
	cout<<endl;
	
	stringdec+=666; // Operazioni per la generazione
	stringdec=stringdec*12345;
	stringdec-=23;
	stringdec=stringdec*9;

	cout<<"Il serial e' : ";
	cout<<stringdec; // Stampa la stringa generata
	for (int i=3;i<lun;i++) // Aggiunge le  lettere dopo le prima 3
		cout<<name[i];

	cout<<endl<<endl;
	system("PAUSE");

	return 0;
}
 
Stato
Discussione chiusa ad ulteriori risposte.