- Crackare Enalotto 3.1
-
Tutorial
scritto da Tin_Man
-
- Bhè, come potete vedere, qualcuno ha raccolto la mia sfida,
vediamo cosa ci propone il caro amico Tin_Man
-
Quequero
-
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"
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
:00537287 push edx
: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 Warning_Box: ; CODE XREF: sub_0_536CC0+565j
: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 Warn_box: ; CODE XREF: sub_0_536CC0+482j
: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 loc_0_53713E: ; CODE XREF: sub_0_536CC0+453j
: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 ; S u b r o u t i n e
: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.
==============CUT========================
//Usage: Select text with mouse or cursor, hit F2 and
type copyl.idc,
//enter a filename when prompted and the selected text
//will be written to that file.
//
// code by TiN_MaN
//--------------------------------------------------------
----------------------------------------------
#include <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;
}
============END===========================