ENALOTTO 3.0 Crack
L'AUTORE DI QUESTO TESTO NON SI PRENDE NESSUNA RESPONSABILITA' PER L'USO CHE NE VERRA' FATTO POICHE' E' STATO ESPRESSAMENTE CONCEPITO PER PURI SCOPI DITATTICI.
--> CRACKING TUTORIAL
data la poca difficolta di Questo tutorial è consigliato a chi è alle primissime esperienze.
--> TOOLS NECESSARI
W32DASM 8.9 (reperibile su molti siti dedicati al cracking)
HIEW (hacker view, editor esadecimale)
--> PROGRAMMA TARGET
ENALOTTO BETA 3.0 (http://www.daniele.net)
Il programma "target" e' un tool per lo sviluppo delle schedine enalotto.
1) Installiamo il programma.
2) Proviamo a fare uno sviluppo di schedine abbastanza impegnativo. Apparira' una messagebox con la scritta: "Con la versione beta e' possibile inserire max 12 numeri". Continuando ad usare il programma arriviamo al menu: "Sistemi Ortogonali--->Applica sistema" e anche qui selezionando i vari sistemi disponibili otteniamo una bella messagebox: " Con la versione beta e' possibile applicare solo il sistema num10g5.ass" Caspita, questo programma non funziona molto bene! cerchiamo di migliorarlo!
3) Prendiamo nota del testo delle messagebox :"Con la versione beta e'..." Chiudiamo il programma e facciamo una copia di enalotto.exe. Lanciamo w32dasm e disassembliamo la copia che abbiamo appena fatto. Tramite il menu' "Refs" e il sottomenu' "String Data references" apriremo la lista delle stringhe di testo usate dal programma. Andiamo a cercare il messaggio di cui abbiamo preso nota, puntiamolo con il mouse e diamogli un doppio click. Nella finestra principale di W32dasm apparira la parte di codice in cui e' contenuta la stringa in questione:
----------------------------------
:00464C00 50 push eax
:00464C01 E8C8260500 call 004B72CE
:00464C06 8B4C2454 mov ecx, dword ptr [esp+54]
* Possible StringData Ref from Data Obj ->"num10g5"
|
:00464C0A 68305B5000 push 00505B30
:00464C0F 51 push ecx
:00464C10 E82BC30300 call 004A0F40
:00464C15 83C408 add esp, 00000008
:00464C18 F7D8 neg eax
:00464C1A 1BC0 sbb eax, eax
:00464C1C F7D8 neg eax
:00464C1E 84C0 test al, al
:00464C20 0F84CE000000 je 00464CF4
:00464C26 6A30 push 00000030
:00464C28 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Con la versine beta e' possibile "
->"applicare solo il sistema num10g5.ass"
|
:00464C2A 68E85A5000 push 00505AE8
:00464C2F 8BCD mov ecx, ebp
:00464C31 E84BAE0500 call 004BFA81
-----------------------------------
Una piccola delucidazione per chi non conosce nulla sulla sintassi dell'output fornito dal disassemblatore:
:0043E30D 83FA64 cmp edx, 00000064
| | |
| | - Codice Mnemonico
| - Istruzione (base Hex)
- indirizzo del codice (base Hex)
Cerchiamo di capire cosa combina il programma prima di visualizzare la famigerata messagebox:
All'indirizzo 00464C20 c'e' un'istruzione molto interessante:
JE 00464CF4;
questo comando dice che deve essere eseguito un salto al verificarsi di una particolare condizione e cioe' quando l'ultima operazione eseguita risulta uguale ( JE Jump if Equal ).
(Se fosse eseguito il salto (je) il programma non processerebbe la stringa e non sarebbe eseguta la call:
:00464C31 E84BAE0500 call 004BFA81
se seguite la call cn il wdasm vi accorgete che verra' invocato il comando messageboxa).
Torniamo al nostro JE: Mmmm... minore o uguale a cosa? Le istruzioni di salto sono condizionate dallo stato del registro di flag che contiene svariate informazioni sul risultato dell'ultima operazione eseguita dalla CPU. L'ultima operaziene eseguita dalla CPU e' quella appena sopra l'struzione di je:
:00464C1E 84C0 test al, al
il comado TEST fa un and logico tra i due operandi e modifica solo il registro di flag senza salvare il risultato dell'operazione. dando uno sguardo al codice si intuisce che il programma non fa altro che comparare il nome del file ammesso con quello selezionato:
:00464C06 8B4C2454 mov ecx, dword ptr [esp+54]
* Possible StringData Ref from Data Obj ->"num10g5"
|
:00464C0A 68305B5000 push 00505B30
:00464C0F 51 push ecx
:00464C10 E82BC30300 call 004A0F40
:00464C15 83C408 add esp, 00000008
il risultato di questa operazione viene salvato in AL e il programma con TEST controlla l'esito della comparazione. Bene andiamo a controllare cosa succede se viene eseguito il salto:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00464C20(C)
|
:00464CF4 81FBFC000000 cmp ebx, 000000FC
:00464CFA 0F84CE000000 je 00464DCE
:00464D00 6A30 push 00000030
:00464D02 6A00 push 00000000
* Possible StringData Ref from Data Obj ->"Il sistema non e' il num10g5.ass"
|
:00464D04 68C45A5000 push 00505AC4
:00464D09 8BCD mov ecx, ebp
:00464D0B E871AD0500 call 004BFA81
pare che venga eseguito un ulteriore controllo e alla riga 00464CFA c'e' un altro salto... il principio e' del tutto analogo al controllo già esaminato.
Il modo piu semplice per eludere il controllo del nome del file è quello di sostituire l'istruzione di salto condizionato con una di salto incondizionato.
Con la barra verde spostiamoci sulla riga:
:00464C20 0F84CE000000 je 00464CF4
sulla riga di stato c'e' un'informazione di cui dobbiamo prendere nota: l'indirizzo assoluto dell'istruzione in evidenza: @Offset00064020. Eseguamo la stessa operazione per l'altra riga:
:00464CFA 0F84CE000000 je 00464DCE
l'offset è 000640FA.
Il controllo sull'nserimento massimo di 12 numeri è ancora più semplice:
----------------
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00457489(C)
|
:0045749F 83F80C cmp eax, 0000000C
:004574A2 7E14 jle 004574B8
:004574A4 6A30 push 00000030
:004574A6 53 push ebx
* Possible StringData Ref from Data Obj ->"Con la versione beta e' possibile "
->"inserire max 12 numeri!"
|
:004574A7 68F4565000 push 005056F4
:004574AC 8BCE mov ecx, esi
:004574AE E8CE850600 call 004BFA81
-----------------
Alla riga 0045749F viene comparato il contenuto di eax con il valore 0C che guarda caso in decimale corrisponde a 12. Alla riga 004574A2 viene eseguito un salto JLE (jump if less or equal), cioe se il registro di flag indica che il risultato dell'ultima operazione è minore o uguale a 12. basterà forzare anche qui il salto ;)
Come al solito prendiamo nota dell'offset alla riga che sarà modificata: 000568A2
4) Adesso andremo ad effettuare le modifiche sull'eseguibile: Apriamo con HIEW il programma 'ENALOTTO.exe'. Settiamo l'editor in modalita' "DECODE" con la sequenza dei tasti F4, F3. Adesso dobbiamo spostarci all'indirizzo dove andremo a fare la modifica premiamo F5 e inseriamo l'Offset di cui abbiamo preso nota 00064020. Una volta dato l'invio saremo alla posizione desiderata. A questo punto ci troveremo col cursore sul codice 0F84CE000000. Premiamo il tasto F3 e entriamo in modalita "EDIT". premendo F2 e' possibile operare con i codici mnemonici, penserà HIEW a sostituirli con i corrispettivi codici HEX. sostituiamo il "je" con un "jmp" ed il gioco e' fatto, attenzione però come si potrà notare i due comandi utilizzano un diveso nomero di bytes e l'editor ha spostato a capo gli ultimi due "00" andando ad incasinare il comado che seguiva. Anche se in questo caso non sarebbe accaduto nulla, perche il codice sotto al "jmp" non verrà mai eseguito, è sempre bene lavorare ordinatamente quindi modifichiamo il "00" in "90" che corrisponde ad un NOP (no operation, un ciclo a vuoto per la CPU). premiamo F9 per rendere effettiva la modifica.
Le stesse operazioni vanno eseguite per il comando che e' all'offsett 000640FA.
Spostiamoci all'indirizzo 000568A2 qui basterà sostituire il "jle" con un "jmps" per bypassare il controllo.
5) Usciamo da HIEW e rilanciamo ENALOTTO. Si potrà constatare che le limitazioni non ci sono più :))
questo è tutto!
VI INVITO A CANCELLARE IL PROGRAMMA SE NON AVETE INTENZIONE DI ACQUISTARLO!!!