2nd Speech Center | ||
Data |
by ZippoDj |
|
21/marzo/2004 |
Published by Quequero | |
|
Bravo zippo! :) |
La nostra morte avverrà nel modo cui quelli che hanno il potere vorranno che avvenga (A.Panagulis) |
.... |
|
.... |
Difficoltà |
( )NewBies (X)Intermedio ( )Avanzato ( )Master |
Ciao gente, in questo tute reverseremo questo simpatico programma e scriveremo un KeyGen
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Essay |
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!!!
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.