Enalotto 3.1
From UIC
Crackare Enalotto 3.1
Contents |
| Infos | |
|---|---|
| Author: | Tin Man |
| Email: | |
| Website: | |
| Date: | 01/01/2001 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Bhè, come potete vedere, qualcuno ha raccolto la mia sfida, vediamo cosa ci propone il caro amico Tin_Man - Quequero |
Introduction
Ok, accettiamo la sfida di quequero e sveliamo la super protezione di ENALOTTO 3.1
Tools
SOFTICE 3.x
IDA 3.80b (W32Dasm non regge questo disassembling)
HIEW (anche se vi dice che il file e' strano funziona lo stesso)
Musica ascoltata:
Supertramp "Breakfast in America"
Essay
Perfetto, per prima cosa lanciamo il target e vediamo che
succede, il prog ci dice subito di inserire il nome il
cognome (traduzione in Italiano di Company ???????? :- )) (chissà, vorrà
forse il nome della persona con la quale siamo in compagnia? NdQuequero ;)
e la password (ma non era un seriale ?), procediamo,
inseriamo TiN_MaN, CRackeD, 11111111111 e premiamo
registra, ci appare una bella warning con su' scritto
"password non valida", bene passiamo ad IDA e
disassembliamo il codice, facciamo una bella ricerca di
"Password non valida" sorpresa, la stringa non c'e'!,
dove diavolo l'avra' nascosta ?
Passiamo allora a softice, carichiamo il target con il
loader e lo lanciamo, mettiamo un bel breakpoint su
getdlgitem e vediamo che succede, mettiamo di nuovo la
password (devo complimentarmi con il programmatore, il
programma si ricorda sia nome che cognome evitandoci di
riscriverlo ogni volta "du palle a volte.....")premiamo
registra e softice poppa fuori, bene usiamo una tecnica
zen, cerchiamo in memoria la stringa maledetta "password
non valida" con il search di softice, eccola, ma allora
esiste, ci piazzo sopra un bel bpm al suo indirizzo in
modo che quando viene usata softice ci avverte in questo
modo:
bpm xxxxxxx R (xxxxxx e' l'indirizzo di inizio della stringa)
CTRL-D per far ripartire il codice, softice si ferma di
nuovo, premiamo una marea di volte il tasto F12 per
uscire dai meandri delle API di winzozz, e ci ritroviamo
finalmente nel codice di ENALOTTO dove viene richiamata
la stringa ci segniamo l'indirizzo xxxx:00537288 e
torniamo in IDA
premiamo G e mettiamo 537288 ecco il codice risultante
:00537288
:00537288 Bad_Serial_Box: ; CODE XREF: sub_0_536CC0+5B
:00537288 call ds:MessageBoxA_0
:0053728E mov eax, [esp+0CCh+var_BC]
:00537292 push 1001h
:00537297 push eax
:00537298 call ds:GetDlgItem_0
:0053729E mov ecx, eax
:005372A0 call sub_0_535D90
:005372A5 pop ebp
:005372A6 pop edi
:005372A7 pop esi
:005372A8 pop ebx
:005372A9 add esp, 0ACh
:005372AF retn
Usiamo la possibilita' di IDA di rinominare le routine premendo N e la chiamiamo Bad_Serial_Box, ora cerchiamo andando in su' dove viene chiamata la routine Bad_Serial_Box ecco qui sotto il codice che ne fa' uso
:0053724A cmp ds:dword_0_53F971, 0
:00537251 push 10h
:00537253 push offset aWarning
:00537258 jl short loc_0_53727A
:0053725A mov eax, ds:dword_0_53F971
:0053725F mov ebx, ds:dword_0_53FBF8
:00537265 shl eax, 2
:00537268 lea ecx, [eax+eax*2]
:0053726B lea edx, [ecx+ecx*4]
:0053726E mov ecx, [esp+0C4h+var_AC]
:00537272 mov eax, [edx+ebx+74h]
:00537276 push eax
:00537277 push ecx
:00537278 jmp short Bad_Serial_Box
La chiamiamo Warning_Box e continuiamo con le ricerche, ecco cosa troviamo:
:00537219 ; sub_0_536CC0+492j
:00537219 mov eax, ds:dword_0_53F971
:0053721E inc eax
:0053721F cmp eax, ds:dword_0_53FBF4
:00537225 jl short Warning_Box
:00537227 push 10h
:00537229 mov ecx, ds:dword_0_53FBF4
:0053722F shl ecx, 2
:00537232 push offset aWarning
:00537237 lea eax, [ecx+ecx*2]
:0053723A mov ecx, ds:dword_0_53FBF8
:00537240 lea edx, [eax+eax*4]
:00537243 mov eax, [edx+ecx-4]
:00537247 push eax
:00537248 jmp short loc_0_537283
Un'altra routine che richima la Warning_Box, la rinominiamo Warn_Box (sto' esaurendo la fantasia per i nomi speriamo non ve ne siano piu') e continuiamo a cercare ecco un'altra schermata di IDA molto interessante:
:0053713E ; sub_0_536CC0+45Cj ...
:0053713E xor ebx, ebx
:00537140 test ebp, ebp
:00537142 jl Warn_box ;noppare
:00537148 mov eax, [esp+14h]
:0053714C cmp eax, ds:dword_0_53FBF4
:00537152 jge Warn_box ;noppare
:00537158 mov edx, 1
:0053715D mov ecx, eax
:0053715F call sub_0_536890
:00537164 test eax, eax
:00537166 jz short loc_0_5371DE
:00537168 mov ecx, [esp+0BCh+var_A8]
:0053716C push 1010h
:00537171 shl ecx, 2
:00537174 push offset aWarning
:00537179 lea eax, [ecx+ecx*2]
:0053717C mov ecx, ds:dword_0_53FBF8
:00537182 mov ebp, ds:MessageBoxA_0
:00537188 lea edx, [eax+eax*4]
Un'altra routine, questa volta ci sono diverse opzioni, Troviamo 2 belle chiamate alla nostra Warn_box, una dopo un test, e l'altra dopo un cmp, gatta ci cova, siamo vicini alla soluzione, marchiamo questi indirizzi usando ALT-M e mettiamo un nome tipo Sospetto_1 in modo da poter richiamare il punto con CTRL-M, osservando il codice seguente vediamo una call sub_0_536890, seguita da un test eax,eax e un jz, che salta unaltra routine di warning e va diretta all'uscita, diamo un occhiata alla call eccola
:00536890
:00536890 sub_0_536890 proc near ; CODE XREF: sub_0_536CC0+49F
:00536890 ; sub_0_53BBC0+45
:00536890
:00536890 var_1C = byte ptr -1Ch
:00536890 var_1A = byte ptr -1Ah
:00536890 var_18 = byte ptr -18h
:00536890 var_14 = dword ptr -14h
:00536890 var_10 = word ptr -10h
:00536890 var_E = word ptr -0Eh
:00536890 var_A = word ptr -0Ah
:00536890
:00536890 sub esp, 1Ch
:00536893 test byte ptr ds:word_0_53FBEE+1, 20h
:0053689A push ebx
:0053689B push esi
:0053689C push edi
:0053689D mov esi, ecx
:0053689F push ebp
:005368A0 mov edi, edx
:005368A2 jnz short loc_0_5368AE ; Crack con 2 nop
:005368A4 xor eax, eax ; azzera eax
:005368A6 pop ebp
:005368A7 pop edi
:005368A8 pop esi
:005368A9 pop ebx
:005368AA add esp, 1Ch
:005368AD retn
:005368AE ;
--------------------------------------------------------------------------------
:005368AE
:005368AE loc_0_5368AE: ; CODE XREF: sub_0_536890+12j
:005368AE mov al, byte ptr ds:unk_0_53F953[esi]
:005368B4 test al, al
:005368B6 jnz short loc_0_5368C5
:005368B8 mov eax, 2 ; mette 2 in eax
:005368BD pop ebp
:005368BE pop edi
:005368BF pop esi
:005368C0 pop ebx
:005368C1 add esp, 1Ch
:005368C4 retn
:005368C5 ;
--------------------------------------------------------------------------------
:005368C5
:005368C5 loc_0_5368C5: ; CODE XREF: sub_0_536890+26j
:005368C5 cmp al, 3
:005368C7 jnz short loc_0_5368D6
:005368C9 mov eax, 1 ;Mette 1 in eax
:005368CE pop ebp
:005368CF pop edi
:005368D0 pop esi
:005368D1 pop ebx
:005368D2 add esp, 1Ch
:005368D5 retn
OK, la routine e' usata in 2 punti del programma, e se tutto e' ok restituisce zero, altrimenti restituisce 2 o 1 in EAX, il patch e' semplice bastano 2 nop dove ho messo il commento, ed il famigerato ENALOTTO 3.1 e' andato, al nostro seriale 11111111111111 rispondera' "grazie, hai pagato mezza rata del mio panda nuovo", vi raccomando pero' se usate il programma per giocare al superenalotto registratelo, oppure se prorio non volete farlo in caso di vincita inviatene una parte al buon Daniele (ed anche al vostro TiN_MaN che e' sempre in bolletta).
P.S. Non ho messo gli offset delle patch nel tute, e neanche gli opcode da cercare, se proprio volete, seguite le istruzioni e cercateveli che un po' di esercizio non guasta mai, in fondo questa e' la UIC e siete qui' per imparare, (spero non da me' :-) ) <--- E perchè mai? ;) (NdQuequero)
P.P.S Metto qui' sotto un piccolo add-on per IDA, che ho scritto e che uso per esportare il teso selezionato Tagliate dopo il segno e salvate il tutto in un file di nome COPYL.IDC e salvatelo nella dir IDC di IDA, basta selezionare il testo in IDA premere F2 e digitare "copyl", vi verra chiesto il nome del file inserite ad esmpio "c:\routine1.txt" ed eccolo pronto.
//enter a filename when prompted and the selected text
//will be written to that file.
//
// code by TiN_MaN
//-----------------------------------------------------------------------------
#include <nowiki><</nowiki>idc.idc>
#define GEN_ASM 3
static main(){
auto filename, start_loc, end_loc;
start_loc = SelStart();
end_loc = SelEnd();
filename = AskFile( "lst", "Output file name?");
WriteTxt( filename, start_loc, end_loc);
return 0;
}
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.