Zoom Icon

Corso UIC Avanzato 01 Pnluck

From UIC Archive

Corso UIC Avanzato 01 Pn

Contents


Corso UIC Avanzato 01 Pnluck
Author: Pn
Email: Email
Website: No Site
Date: 19/09/2004 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Flag Italian.gif
Comments:



Introduzione

Cerchiamo di crackare o reversare questa lezione Ecco la mia soluzione, alla prima lezioni x studenti, spero ke sia abbastanza kiara


Link e Riferimenti

Tools usati: Ollydbg, HexEditor a piacere


Notizie sul Programma

Questo crackme è cryptato con petite, e po i c'è una bastardata di que ma ve ne parlo dopo :D


Essay

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

Il keygen

Ora direi di creare anke il keygen

#include <iostream> #include <cstdio> using namespace std;

char user[] = 0123; //dichiaro l'use int use1; int psw[10]; //qui verrà inserita la psw finale int a; //questa ci servirà di supporto int ECX=0; //dichiaro 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

}

Ora continuiamo l'analisi di sto crackme e vediamo che ci sono una serie di CMP ECX,3 JNZ SHORT uno(dump.0040122A) e credo ke que le ha messi, in modo da complicarci 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; }

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

Pn =)


Note Finali

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


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.