|
Lezioni x Studente 1 Rev&Crack |
|
18/09/2004 |
by "Pnluck" |
|
|
18/09/2004 |
UIC's Home Page |
Published
by Quequero |
|
Vuoto o non vuoto
|
Grazie pn, mpo sformattato
ma scritto bene :) |
Vuoto o non vuoto |
|
.... |
- Home
page se presente:E-mail: pnluck@virgilio.it
- pnluck,
#crack-it,#asm,#c
|
.... |
|
Difficoltà |
(X)NewBies ( )Intermedio (
)Avanzato ( )Master |
|
Cerchiamo di crackare o reversare questa lezione
- Lezioni x studenti UIC
- Rev&Crack
Written by pnluck
- Ecco la mia soluzione, alla prima lezioni x studenti,
spero ke sia abbastanza kiara
- Tools usati: Ollydbg, HexEditor a piacere
- Vedete la pag delle lezioni x studenti :D
- Questo
crackme è cryptato con petite,e po i c'è una bastardata di que ma ve ne parlo
dopo :D
- Per prima cosa analiaziamo
il programma con peid, e questo ci dice ke ke è criptato con petite. Allora
noi dobbiamo decriptare, allora lanciamo il prg e poi il peditor. Nel PEditor
clikiamo su tasks->uno.exe poi pulsante destro e dump full, e salviamolo come
uno(dump) e facciamo rebuilder->do. Il reibulder rende + pulito il formato
PE e poi, può essere usato anke x rendere compatibile per xp, file exe ke
fungono solo su 98 e via dicendo :D.
Ora apriamolo con l'ollydbg, e poi facciamo tasto destro: search for->all
intermodular calls, e cerchiamo qualcosa ke ci serve e vediamo GetWindowTextA
clikkiamo sopra e siamo all'inizio della procedura di controllo della psw.
Analiziamola
00401205 CALL <JMP.&USER32.GetWindowTextA> Prende l'user inserito
0040120A MOV EAX,uno(dump.00402165 e
lo mette in EAX
Qui apro una parentesi,
all'user vengono presi solo i primi 4 char e poi vengono aggiunti i char della
psw
ES noi abbiamo inserito come user 012345678 e come psw abcdefg, la psw rimane
così, mentre l'user divenerà 0123abcdefg.
0040121C CALL <JMP.&USER32.GetWindowTextA> Prende la psw
00401221 MOV EBX,uno(dump.00402169 e la mette in EBX
00401226 MOV EDX,EAX Muove in EDX l'user
00401228 XOR ECX,ECX Azzera ECX
0040122A MOV AL,BYTE PTR DS:[ECX+402165] Muove il primo char dell'user in AL
00401230 ADD AL,12 gli aggiunge 0x12
00401232 XOR AL,CL poi lo xora con CL(contatore)
00401234 ADD AL,15 gli aggiunge 0x15
00401236 ADD AL,2 e poi gli aggiunge 0x2
00401238 MOV EBX,uno(dump.00402169 muove in EBX la psw inserita
0040123D MOV AH,BYTE PTR DS:[EBX+ECX] prende il primo char della psw e lo mette in AH
00401240 CMP AL,AH Li compara
00401242 JNZ uno(dump.00401311 se sono diversi salta
00401248 INC ECX se uguali aumenta ECX di 1
00401249 INC EAX ed incrementa EAX
0040124A CMP ECX,3 compara ECX con 3
0040124D JNZ SHORT uno(dump.0040122A se è diverso salta fino a quando ECX=3
Ora direi di creare anke il keygen
#########==============Codice c++ del
Key-gen=============############
#include<iostream>
#include<cstdio>
using namespace std;
char user[] = 0123; //dikiaro l'use
int use1;
int psw[10]; //qui verrà inserita la psw finale
int a; //questa ci servirà di supporto
int ECX=0; //dikiaro il contatore
for (int t = 0; t <= 2; t++) {
a = user[t] + 0x12;
a = a ^ b;
a = a + 0x15;
a = a + 0x2;
ECX++;
psw[t] = a; //in psw c'è la psw
}
#########==============Codice c++ del Key-gen=============############
Ora continuiamo l'analisi
di sto crackme e vediamo k eci sono una serie di
CMP ECX,3
JNZ SHORT uno(dump.0040122A
e credo ke que le ha messi, in modo ke di complicacci la vita.
Cmq continuiamo fino a
004012A9 MOV AL,BYTE PTR DS:[ECX+402165] prende i char della psw dal 4°
004012AF XOR AL,16 lo xora con 0x16
004012B1 ADD AL,45 gli aggiunge 0x45
004012B3 ADD AL,CL gli aggiunge ECX
004012B5 XOR AL,CL lo xora con ECX
004012B7 MOV BL,BYTE PTR DS:[ECX+402169] prende il char della psw inserita
004012BD CMP AL,BL e lo confronta con quello generato sopra
004012BF JNZ SHORT uno(dump.00401311 se diversi salta
004012C1 INC ECX incremente ECX
004012C2 CMP ECX,8 compara ECX con 8
004012C5 JNZ SHORT uno(dump.004012A9 se diverso reinizia il ciclo
#########==============Codice c++ del Key-gen=============############
for (int t=0; t<=3;t++) { user1[t] = user[t];} // ora calcola il nick secondo il prg
for (int t=4; t <=6;t++) {user1[t] = psw[t-4];} //ho fatto così x essere preciso con il prg
//calcolo 8 char del nick secondo il prg
a = user1[3] ^ 0x16;
a = a + 0x45;
a = a + b;
a = a ^ b;
user1[7] = a;
for (int t=3; t<=7;t++) { // genero la 2° parte del serial
a = user1[t] ^ 0x16;
a = a + 0x45;
a = a + b;
a = a ^ b;
b++;
psw[t] = a;}
cout << "la psw è : ";// stampo il serial
for (int t=0;t<=7;t++)
{
printf("%c",sample[t]);
}
cout << " x il nick : "; //stampo il nick
cout << c;
return 0;
}
#########==============Codice c++ del Key-gen=============############
Ora andando avanti con
l'analisi vediamo che c'è una call
00401308 CALL uno(dump.00401351
entriamoci con
F7 e vediamo questo :
00401351 MOV EBX,uno(dump.00402169
00401356 MOV EDX,EAX
00401358 XOR ECX,ECX
0040135A MOV AL,BYTE PTR DS:[ECX+402165]
00401360 ADD AL,12
00401362 XOR AL,CL
00401364 ADD AL,15
00401366 ADD AL,2
00401368 MOV AH,BYTE PTR DS:[ECX+402169]
0040136E CMP AL,AH
00401370 JNZ SHORT uno(dump.00401311
00401372 INC ECX
00401373 INC EAX
00401374 CMP ECX,3
00401377 JNZ SHORT uno(dump.0040135A
00401379 MOV AL,BYTE PTR DS:[ECX+402165]
0040137F XOR AL,16
00401381 ADD AL,44
00401383 ADD AL,CL
00401385 XOR AL,CL
00401387 MOV AH,BYTE PTR DS:[ECX+402169]
0040138D CMP AL,AH
0040138F JNZ SHORT uno(dump.0040139B
00401391 INC ECX
00401392 CMP ECX,8
00401395 JNZ SHORT uno(dump.00401379
00401397 MOV AL,1
00401399 JMP SHORT uno(dump.0040139F
0040139B MOV AL,0
0040139D JMP SHORT uno(dump.0040139F
0040139F XOR EBX,EBX
004013A1 RETN
Questo è la procedura
di controllo ke abbiamo analizato prima ma c'è una piccola differenze a 401381
add al,44. Ora possiamo fare solo una cosa cambiare quel 44 con 45, xkè se
non lo facciamo tutto quello ke abbiamo fatto prima non serve a niente. Dopo
averlo fatto con il nostro hexeditor.Ora compiliamo il keygeneretor, inserimo
i dati e premiamo ok ma cosa è successo, ci esce sempre il mesg di errore.
Andiamo ad analizare da capo il prg dato ke prima non ho visto la psw guardo
402169, e vedo che vengono presi solo i primi 7 char, ma la psw deve avere
8 char x essere giusto (CMP ECX,8), quindi anke se la psw generata è giusta,
la psw prende 7 char. Alllora c'è solo 1 cosa da fare. Andiamo a 401242, qui
JNZ uno(dump.00401311, lo dobbiamo cambiare in JNZ SHORT uno(dump.00401338.
Per far ciò in Olly, andate sulla riga e premete spazio, ora cambiare JNZ
00401311 in JNZ 00401338,selezionare la riga cambiata, poi fare destro->copy
to executable->selection, nella finestra fare destro->save file e quando vi
appare la finestra di dice di sovrascrivere clikkate si. Ora kiudete olly,
aprite il crackme cliccate su "Register" e vi apparirà la finestra di complimenti.Così
abbiamo risolto il crackme nel modo + veloce possibile :D
-
Pnluck
Avete capito la bastardiazia di Que, anke se facciamo il keygeneretor e modifikiamo il prg x farlo funzionare a dovere questo non funge.
Thx to: Quake ke gli rompo sempre le balle, allo Ged a Brno x la bella figura k emi ha fatto fare a #c(se ti becco ti faccio a pezzi), |Geo|, e a tutto il chan di #crack-it
Si prega alla gentile clientela della UIC, di pagare (in qualsiasi modo:soldi, dirra,etc) i creatori dei crackme, i quali ci allietano la vità con le bastardate nei loro lavori . GRAZIE :D
Noi reversiamo al solo scopo informativo e di
miglioramento del linguaggio Assembly.