2nd Speech Center
Reversing e KeyGen

Data

by ZippoDj

 

21/marzo/2004

UIC's Home Page

Published by Quequero



Bravo zippo! :)

La nostra morte avverrà nel modo cui quelli che hanno il potere vorranno che avvenga (A.Panagulis)

....

Home page se presente:
E-mail: [email protected]
ZippoDj, #Crack-it, azzurra.org

....

Difficoltà

( )NewBies (X)Intermedio ( )Avanzato ( )Master

 

Ciao gente, in questo tute reverseremo questo simpatico programma e scriveremo un KeyGen


2nd Speech center
Reversing e KeyGen
Written by ZippoDj

Introduzione

Questo è il primo tute che mando alla UIC. Mi son detto, vediamo se Que me lo fa passare :PPpP Comunque, si tratta di un reversing abbastanza semplice...Io ho messo livello intermedio poi fate voi :)

Tools usati

Tools usati:
OllyDebugger
W32Dasm
Un compilatore C (io ho usato Icc)

URL o FTP del programma


http://www.zero2000.com/iisc/

Notizie sul programma

Praticamente tu scrivi qualunque cosa, premi play e lui la legge con una divertente pronuncia inglese :P ha anche varie tonalità.. è molto pubblicizzato  

Essay

Buonasera ragazzi, o buongiorno, oggi reversiamo un bel programmillo, si chiama 2ndSpeechCenter!! io l'ho trovato girovagando in Google, quindi dovreste reperirlo facilmente, è anche parecchio pubblicizzato :pPPp

Ok mettiamoci al lavoro

Installiamo il programma e avviamolo. Comapare un box che ci dice le solite cose

This is a trial version for evaluation purpose only. It contains these limitations -

* It will add a sentence "This is a trial version, please register it to remove all limitations." automatically when you try to convert text to mp3 or wav.

* It will pop out a nag screen when it's starting up.

* It will pop out a nag screen every time you try to convert text to mp3 or wav.

* It will pop out a nag screen every 30 minutes when it's running.

To remove these above limitations, please press the "Buy Now" button

to buy a registration code and register your software.

più giù ci sono 2 campi da riempire

Enter Registered Name:

Enter Registered Code:

Riempiamoli con dati a caso....

Enter Registered Name: ZippoDj

Enter Registered Code: 5555555

premiamo [Register] e... Wrong Registration Code!!!!!!! uhm..una messagebox eh...vediamo cosa dice W32Dasm...Carichiamo l'exe....aspettiamo un pò ;)... Clicchiamo su String References... ed ecco "Wrong Registration Code"!! Vediamo se troviamo anche il suo amichetto, di solito inizia con la T :P e infatti ecco anche lui "Thanks for your supporting".

Bene ora abbiamo un punto d'attacco :p Facciamo doppio click su uno dei due..tanto son vicinissimi nel codice e arriviamo alla parte del incriminata..=) Ora un pò di backtrace... Bene più su ci sono parecchi jump condizionati, a questo punto studiamoci la situazione Real Time. Apriamo OllyDbg e settiamo un breakpoint dove inizia la funzione con quei salti condizionati che ci portano alla registrazione o alla beggar-off (argh):P l'indirizzo è 00408735 Fatto? naturalmente dovevate aprire Olly e caricare il programma prima di settare il Bp (ma per chi c'hai preso direte...eh eh). Bene avviamo il programma...play!!

sempre -ZippoDj- -555555- premiamo Register e voilet, arriva Olly. Siamo qua

004A8735 MOV EBX,EAX <---- poppiamo qua!

004A8737 XOR EAX,EAX

004A8739 PUSH EBP

004A873A PUSH iisc.004A8886

004A873F PUSH DWORD PTR FS:[EAX]

004A8742 MOV DWORD PTR FS:[EAX],ESP

004A8745 LEA EDX,DWORD PTR SS:[EBP-10]

004A8748 MOV EAX,DWORD PTR DS:[EBX+398]

004A874E CALL iisc.004468F8

004A8753 MOV EAX,DWORD PTR SS:[EBP-10]

004A8756 LEA EDX,DWORD PTR SS:[EBP-4]

004A8759 CALL iisc.00408ADC <--call che legge il nome

004A875E LEA EDX,DWORD PTR SS:[EBP-14]

004A8761 MOV EAX,DWORD PTR DS:[EBX+394]<-- mette in eax il nome (ZippoDj)

004A8767 CALL iisc.004468F8 <--call che legge il seriale

004A876C MOV EAX,DWORD PTR SS:[EBP-14] <--mette in eax il seriale (555555)

004A876F LEA EDX,DWORD PTR SS:[EBP-8]

004A8772 CALL iisc.00408ADC

004A8777 CMP DWORD PTR SS:[EBP-4],0 <--controlla che il campo non sia vuoto

004A877B JE iisc.004A8842 <--se lo è salta

004A8781 CMP DWORD PTR SS:[EBP-8],0 <--idem qua per l'altro campo da riempire

004A8785 JE iisc.004A8842 <--idem

004A878B LEA EDX,DWORD PTR SS:[EBP-18]

004A878E MOV EAX,DWORD PTR SS:[EBP-4] <---mette in eax il nome (ZippoDj)

004A8791 CALL iisc.004A897C <---call che genera il seriale

004A8796 MOV EDX,DWORD PTR SS:[EBP-18]<---mette in edx il serial calcolato

004A8799 MOV EAX,DWORD PTR SS:[EBP-8] <---in eax il serial inserito da noi

004A879C CALL iisc.004049D0 <--- questa call fa il confronto tra i due

004A87A1 JNZ iisc.004A8842 <--- se non sono uguali va alla beggar off

004A87A7 MOV BYTE PTR DS:[4C5D20],1 <---se sono uguali prosegue qua

004A87AE MOV DL,1

004A87B0 MOV EAX,DWORD PTR DS:[46DA68]

004A87B5 CALL iisc.0046DB68

Fin troppo facile..all'indirizzo 004A8796 abbiamo il serial bello che pronto da sniffare, ma sarebbe troppo facile...(decisamente troppo). Sono appena mezzanotte e mezzo e non ho sonno per nulla, perciò andiamo a fondo nella questione. Entriamo nella Call all'indirizzo 004A8791 e vediamoci l'algoritmo. SU su dai... vi tolgo gli opcode per lasciare più spazio ai commenti

004A89CF MOV EDX,1

004A89D4 MOV ECX,DWORD PTR SS:[EBP-4] <--qua inizia il loop (ecx contiene il nome)

004A89D7 MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] <-- ecx contiene ora il 1°char del nome (la Z)

004A89DC ADD EBX,ECX <-- il primo char viene sommato a ebx che all'inizio vale zero

004A89DE INC EDX <-- incrementa edx per puntare al char successivo

004A89DF DEC EAX <-- decrementa eax che conteneva la lunghezza del nome inserito

004A89E0 JNZ SHORT iisc.004A89D4 <-- finchè eax non vale zero il loop continua

004A89E2 LEA EDX,DWORD PTR SS:[EBP-C]

004A89E5 MOV EAX,EBX <--- mette in eax la somma di tutti char calcolata col loop

004A89E7 SHL EAX,3 <-- e la shifta di 3 bit a sinstra

004A89EA SUB EAX,EBX <--- al risultato dello shift sottrae la somma calcolata col loop

004A89EC CALL iisc.00408CF8

004A89F1 PUSH DWORD PTR SS:[EBP-C]

004A89F4 PUSH iisc.004A8A60

004A89F9 LEA EDX,DWORD PTR SS:[EBP-10]

004A89FC ADD EBX,43 <--- aggiunge alla somma 43h (67 in decimale)

004A89FF LEA EAX,DWORD PTR DS:[EBX+EBX*2] <-- carica in eax... bè lo vedete:PpP (somma+somma*due)

004A8A02 CALL iisc.00408CF8

004A8A07 PUSH DWORD PTR SS:[EBP-10]

004A8A0A MOV EAX,ESI

004A8A0C MOV EDX,3

Vi ho tolto la parte anteccedente (che bella parola:PpPpP) perchè non serve ai nostri scopi. Viene in pratica caricata in eax la lunghezza del nome inserito da noi.... A sto punto il serial è calcolato, andiamo avanti e troviamo il ret. Poi viene caricato il serial giusto e quello sbagliato in edx e in eax e vien chiamata l'altra ( e ultima) call ;) Vediamo anche questa visto che ci siamo...:PPPP

004049D0 PUSH EBX

004049D1 PUSH ESI

004049D2 PUSH EDI

004049D3 MOV ESI,EAX <--- anche esi contiene il serial errato

004049D5 MOV EDI,EDX <-- e anche edx contiene il serial giusto

004049D7 CMP EAX,EDX <-- li confronta

004049D9 JE iisc.00404A6E <-- sono uguali? se si, ok!

004049DF TEST ESI,ESI <-- se no, uhm.. ma siam sicuri che c'è qualcosa?

004049E1 JE SHORT iisc.00404A4B <-- non salta? allora qualcosa c'è

004049E3 TEST EDI,EDI <-- e qua?

004049E5 JE SHORT iisc.00404A52 <---se non salta c'è anche qua quarcosa

004049E7 MOV EAX,DWORD PTR DS:[ESI-4] <--- niente il nostro serial è

004049EA MOV EDX,DWORD PTR DS:[EDI-4] semplicemente sbagliato

004049ED SUB EAX,EDX basta cazzate

004049EF JA SHORT iisc.004049F3

004049F1 ADD EDX,EAX

004049F3 PUSH EDX

004049F4 SHR EDX,2

004049F7 JE SHORT iisc.00404A1F

Stavo un pò svarionando..Comunque ora abbiamo visto davvero tutto.. Iniziamo la nostra creaturina...un bel KeyGenerator ;) non dovrebbe essere difficile, ripendiamo in mano il codice che calcolava il serial e andiamo.. come dove? a scrivere il codice!

#include <stdio.h>

#include <string.h>

int main()

{ char nome[10];

int somma=0;

int serial;

unsigned int i;

printf("2nd Speech Center Keygen....By ZippoDj\n");

printf("Inserire il nome: ");

scanf("%s", &nome);

for(i=0; i<=strlen(nome); i++) <-- da 004A89D4 a 004A89D0 (loop)

somma += nome[i];

serial = somma << 3; <--- SHL EAX,3

serial = serial - somma; <--- SUB EAX,EBX (prima parte del serial)

somma = somma + 67; <--- ADD EBX,43

somma = somma + somma*2; <--- LEA EAX,DWORD PTR DS:[EBX+EBX*2] (seconda parte)

printf("Seriale calcolato: %d", serial);

printf("-%d\n", somma);

return 0;

}

Facile Vero? Non sono un genio in C ma se ci sono riuscito anch'io dev'essere per forza facile.

Me l'ero dimenticato, il serial è composto da 2 parti separate da un trattino. Ad esempio per il mio nick è

4928-2313.

OK? Comunque credo di essere stato abbastanza chiaro! se poi avete dubbi mi trovate in chat su azzurra oppure maillatemi

[email protected] ciao!!!

                                                                                                                 ZippoDj

Note finali

Bè ringrazio tutta la UIC perchè lo devo a gente come voi se sono così bravo ora (e modesto) ghghghgh. Continuate così.. Un saluto agli amici di Azzurra!!

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.