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===========================