Zoom Icon

2nd Speech Center

From UIC

2nd Speech Center Reversing e KeyGen

Contents


Infos
Author: ZippoDj
Email: zippodj@tiscali.it
Website:
Date: 21/03/2004 (dd/mm/yyyy)
Level: Luck and skills are required
Language: Italian Image:Flag_Italian.gif
Comments: Ciao gente, in questo tute reverseremo questo simpatico programma e scriveremo un KeyGen


Introduction

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

OllyDebugger W32Dasm Un compilatore C (io ho usato Icc)


Program Infos

h**p://www.zero2000.com/iisc/ 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 po' ;)... 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 po' 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 po' 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!

<nowiki>#</nowiki>include <nowiki><</nowiki>stdio.h>
<nowiki>#</nowiki>include <nowiki><</nowiki>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 zippodj@tiscali.it ciao!!!


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

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 malevoli 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.