Togliamo il nag screen di WinRAR 3.30 | ||
Data |
by The Neuromancer |
|
06/Jan/2005 |
Published by Quequero | |
If you have to ask, ya'll never know... - Red Hot Chili Peppers |
Grazie tante neuro, ottimo lavoro |
Sex, music, hacking. |
.... |
|
.... |
Difficolt� |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
Introduzione |
Beh questo � quello che far� io.......... :PPPPPPPPP~
In effetti, io il
WinRAR 3.30 l'ho gi� analizzato, patchato, testato e anch'io sto per scrivere
questo doc a lavoro compiuto, ma almeno cercher� di replicare i miei errori (che
potreste fare anche voi) e cercher� di spiegarvi dove state sbagliando.
E comunque... solo sbagliando si impara, non seguendo la strada gi� tracciata
da altri :p
Ok, basta storie. Attaccatevi su Sir Psycho Sexy dei RHCP e
smontiamo 'sto WinRAR!
Tools usati |
URL o FTP del programma |
Essay |
Eccoci qui. Aprite ora il vostro amato, adorato e adorabile OllyDbg e selezionate
l'eseguibile del WinRAR. (avremmo potuto disassemblarlo preventivamente con IDA
per esempio, ma meglio non incasinarci troppo la vita all'inizio. Se ce ne fosse
bisogno, lo apriremo dopo) Cosa dobbiamo fare ora? Assicuratevi che la vostra data � stata spostata in
avanti come � stato detto sopra e che WinRAR mostri la finestra. Ecco la
parola chiave.. mostra la finestra.. Dobbiamo essere avvisati quando il sistema
mostra la finestra di registrazione, in quel modo risalendo sul percorso
effettuato dal processore prima o poi dovremo raggiungere la funzione che la
chiamata e quindi il suddetto controllo della data no?
Alcuni valori potrebbero essere differenti, ma notiamo gli argomenti,
soprattutto pTemplate con valore "REMINDER".. Interessante, non trovate? E' solo
probabile che sia questa, avremmo potuto aprire un resource editor prima e
vedere come si chiama quella dannata finestra ma ora siamo in ballo, quindi
continuiamo a ballare :) Fate un altro Run e vedete magicamente la finestra
maledetta comparire. Ok, � lei.
Ora vediamo il da farsi. Abbiamo trovato la finestra, bisogna risalire a chi
la chiama. Fate un Restart del programma perch� poi non la vedremo pi� quella
finestra. Attenzione che il breakpoint � stato disattivato da OllyDbg (perch�
posto fuori dal prog). Eseguito il Restart, riposizionate il break come fatto
prima ("bp DialogBoxParamA") e fate un bel Run. Il programma si ferma. Accendete
una sigaretta o una canna, a scelta :p
Bene. Il nostro stack � poco affollato, abbiamo una sola entry, dite che ci
bloccheremo? :PPPPP
Eccoci qui. Col senno di poi vi dir� che � tutto qui il nocciolo della
situazione. Analizziamo. Ok, siamo a buon punto, spero abbiate capito tutto fin qua, altrimenti
mandatemi una mail e vi spiego io direttamente a casa vostra al modico prezzo di
100 euri all'ora :P Eccoci qui. Modificando 1 solo byte del WinRAR siamo riusciti a farlo andare
come volevamo. Ora bisogna patchare il programma. Cracked! :)
P.S.: avete notato che nel codice sopra c'� un CMP EAX, 28? Quant'� 0x28
in decimale? 40? Quanti erano i giorni di prova? :PPPPPPPP
Per prima cosa, analizziamo il
problema che ha WinRAR e che dovremo togliere. Se WinRAR lo avete appena
scaricato e installato (o fatto da poco) non ve ne sarete mai accorti, ma quelli
che ce l'hanno gi� da un po' si saranno accorti che il nostro programmino dopo
40 giorni mostra una finestrella che vi invita alla registrazione. Mettete
avanti la data di 2 mesi e vedrete (provare x credere).
In effetti basta
premere su "Close" ma quando per esempio state analizzando pi� file compressi e
aprite decine di istanze di WinRAR una dopo l'altra questa cosa diventa
fastidiosa. Il nostro compito sar� quello di rimuovere questa finestra
fastidiosa (detta in gergo "nag screen").
Cosa ci potremo aspettare? Da
qualche parte nel programma ci sar� un controllo della data e calcoler� se sono
passati pi� di 40 giorni dall'installazione (infatti � di 40 giorni il periodo
di prova). Se non sono passati, tutto fila liscio. Se sono passati, deve
mostrare la finestra.
Bisogner� trovare questo controllo, e fargli sempre
credere che i 40 giorni non sono mai passati :)
(Il consiglio � sempre di
immedesimarci nel programmatore ma soprattutto nel programma e nella sua logica
stupida)
Come vedete (e se ci avete gi� giocato), il
debugger non ci avvisa che il file � compresso o criptato e davanti a noi
abbiamo del codice che sembra corretto (come si fa a capire? Beh finch� ci sono
dei PUSH, POP, MOV e altre istruzioni ordinarie andiamo bene, quando cominciano
ad apparire senza alcun senso istruzioni come AAD, FLDCW, WBINWD e istruzioni
privilegiate, senza alcun ordine, gatta ci cova...)
Bene, dobbiamo quindi
mettere un breakpoint alla chiamata a DialogBoxParamA, la funzione di Windows
(API) che mostra le finestre di dialogo. Aprite dunque su Plugins->Command
line->Command line e vi esce una comoda finestrella che vi permette di
eseguire vari comandi scrivendoli (che velocizza di molto il processo di
debugging). Scrivete "bp DialogBoxParamA" (attenti alle maiuscole). Ok, comando
eseguito. Fate un Run (F9)... Ehi! Cosa succede? OllyDbg si � fermato. Dove? In
basso il debugger ci dice "Breakpoint at USER32.DialogBoxParamA". Questo
significa che il programma ha voluto mostrare la finestra. Quale finestra?
Guardando nello stack (in basso a destra) il debugger ci mostra dettagliatamente
gli argomenti passati alla DialogBoxParamA:
ESP valore Commento
0012D5EC 0043FEB3 /CALL to DialogBoxParamA from WinRAR2.0043FEAE
0012D5F0 00400000 |hInst = 00400000
0012D5F4 00493CC9 |pTemplate = "REMINDER"
0012D5F8 003301DA |hOwner = 003301DA ('Desktop - WinRAR (evaluation ...',class='WinRarWindow')
0012D5FC 00443F14 |DlgProc = WinRAR2.00443F14
0012D600 00000000 \lParam = NULL
Come facciamo a risalire le chiamate?
Il nostro caro debugger ci fornisce l'opzione Call stack (View->Call stack) e
ci mostra le chiamate a funzione (CALL):
Address Stack Procedure / arguments Called from Frame
0012D5EC 0043FEB3 <JMP.&USER32.DialogBoxParamA> WinRAR2.0043FEAE 0012EDBC
0012D5F0 00400000 hInst = 00400000
0012D5F4 00493CC9 pTemplate = "REMINDER"
0012D5F8 003301DA hOwner = 003301DA ('Desktop - WinR
0012D5FC 00443F14 DlgProc = WinRAR2.00443F14
0012D600 00000000 lParam = NULL
Selezionando la prima riga (quella in rosso) e premendo
il pulsante destro ci appare un bel menu. Selezionate Show call e Olly vi
mostrer� dove la DialogBoxParamA � stata chiamata, il punto esatto. (Mi emoziona
questo programma, � un amore :)
0043FE5D > CMP [DWORD DS:4B10F8], 0 ; Case 113 (WM_TIMER) of switch 0043F834
0043FE64 v JNZ SHORT WinRAR2.0043FEB3
0043FE66 > CMP [BYTE DS:493750], 0
0043FE6D v JNZ SHORT WinRAR2.0043FEB3
0043FE6F > CMP [BYTE DS:4B5060], 0
0043FE76 v JNZ SHORT WinRAR2.0043FEB3
0043FE78 > CMP [BYTE DS:49D03C], 0
0043FE7F v JNZ SHORT WinRAR2.0043FEB3
0043FE81 MOV EAX, [DWORD DS:4B1A30]
0043FE86 CMP EAX, 28
0043FE89 v JG SHORT WinRAR2.0043FE8F
0043FE8B TEST EAX, EAX
0043FE8D v JGE SHORT WinRAR2.0043FEB3
0043FE8F > MOV [BYTE DS:493750], 1
0043FE96 PUSH 0 ; /lParam = NULL
0043FE98 PUSH WinRAR2.00443F14 ; |DlgProc = WinRAR2.00443F14
0043FE9D PUSH [DWORD DS:4AEC88] ; |hOwner = 003301DA ('Desktop - WinRAR (evaluation ...',class='WinRarWindow')
0043FEA3 PUSH WinRAR2.00493CC9 ; |pTemplate = "REMINDER"
0043FEA8 PUSH [DWORD DS:49D060] ; |hInst = 00400000
0043FEAE CALL <JMP.&USER32.DialogBoxParamA> ; \DialogBoxParamA <-- ecco la chiamata fatidica
0043FEB3 > CMP [DWORD DS:4B10F8], 0
0043FEBA v JNZ SHORT WinRAR2.0043FEE9
0043FEBC > CMP [DWORD DS:4B10F0], 0
Le freccine verso destra segnate con dei ">" (nel
debugger appena a sinistra degli indirizzi) sono dei punti che sono raggiunti da
una delle istruzioni di jump (gi�mp, diminutivo di giampietro :p) (JMP, JGE, JL,
JO, etc.) e che quindi per esempio da qualche parte qualcuno fa un jump
(incondizionato o condizionato) a 0043FE5D perch� ha la freccina.
In
prossimit� dei jump, ci sono delle freccine verso il basso o verso l'alto che
determinano dove si trova il punto di salto. Qui per esempio sono tutti pi� in
basso.
Dopo questa digressione, guardiamo il codice. Ora vi starete
chiedendo... "Perch� non togliamo la chiamata alla API?". Si potrebbe fare, ma
occhio che prima di questa ci sono anche dei PUSH da togliere, pena impallare il
programma, e ci sarebbero quindi molte istruzioni da modificare, cosa che non
vogliamo fare, vero? "Noooo", risponderete. :P Meno si tocca, meglio � e fa l33t
:)
Usiamo un po' di logica. Pi� in alto OllyDbg ci informa che questo � un
Case (avete presente in C lo "switch"?) e che il suo valore � WM_TIMER, pi� in
alto altri case con valori plausibili, quindi si pu� razionalmente pensare che
questa sia la funzione di gestione dei messaggi di una qualche finestra,
sicuramente quella principale. Perch� WM_TIMER non lo sappiamo e non ci
interessa (per i pi� curiosi: non avete notato che essa esce in ritardo rispetto
alla partenza del programma? :)
Resta il fatto che prima della
DialogBoxParamA ci sono alcuni controlli e che quindi abbiamo qualche speranza
che non � il timer da togliere ma forse qui possiamo gi� fare qualcosa.
Osserviamo l'istruzione dopo la CALL. Vi lascio 10 secondi e poi voglio la
risposta giusta...
Cos'ha di speciale? 1..2..3..4..5..6..7..8..9..10! La
FRECCINA!!!
Qualcuno o qualcosa ha voluto che per un qualche motivo la
DialogBoxParamA possa essere bypassata e non ci vuole tanto per capire quando
viene saltata... (per chi non l'avesse capito, si salta quando non sono passati
i 40 giorni) Comunque sia, cliccate su quella istruzione e nel riquadro sotto al
codice vi dice dove sono i jumps che giungono l�: "Jumps from 0043FE64,
0043FE6D, 0043FE76, 0043FE7F, 0043FE8D", che sono tutti mostrati nel riquadro
qui sopra.
Abbiamo capito dove dobbiamo saltare, abbiamo capito
perch� dobbiamo saltare e abbiamo capito cosa dobbiamo saltare, che
aspettiamo?!?!?!! Mettiamo un break all'inizio dello switch (cliccatelo e
premete F2. L'indirizzo diventa rosso), 0043FE5D, facciamo un Restart. Il break
al DialogBoxParamA � partito di nuovo ma non ci importa. Run...
La finestra
di WinRAR parte normalmente e dopo un po' eccoci da OllyDbg. Il breakpoint �
stato raggiunto all'evento WM_TIMER. Bene.
Beh gente ora mi sfogo, nella
vita bisogna andare d'intuito, si setta, si breakka, si smanetta, si formatta.
Avrei potuto spendere ore sul problema prima di raggiungere questo punto perch�
l� avrei avuto la soluzione perfetta, qui non so ancora se andr�. Ma l'hacking e
il cracking � fatto di smanetto. Niente da fare. E non scoraggiatevi (Flames dai
puristi del reversing ignorati totalmente :p)
Dopo questa cosa, andiamo
avanti. Siamo al CMP e dopo al JNZ che ci pu� permettere o non permettere la
Libert�. Eseguiamo l'istruzione CMP con uno step (scegliete lo Step Into (F7) o
lo Step Over (F8), tanto sono uguali, cambiano solo davanti all'istruzione
CALL).
Bene. Anzi male. Nel riquadro sotto al codice OllyDbg ci avverte
"Jump is NOT taken". Dannazione. Niente Libert�!! Non ci sar� il salto del
DialogBoxParamA, quindi bisogna rimediare in qualche modo. Premete la barra
spaziatrice quando l'istruzione JNZ � selezionata (cliccate...) e vi esce una
finestra che vi permette di modificare l'istruzione.
Bisogna forzare il
processore a saltare a 0043FEB3, voglia o non voglia :P
Dobbiamo quindi
metterci un salto incondizionato che gli dica "O salti, o salti e non rompi i
maroni" :P Modifichiamo nella casella che � uscita il JNZ in JMP (maiuscolo,
minuscolo, misto, � uguale) e premete invio. L'istruzione � stata cambiata.
Premiamo lo Step e ha saltato il DialogBoxParamA, togliamo il break del case
(premete F2), premiamo Run e... Miracolo!!!! Niente finestra! Fantastico.
Segnamoci l'indirizzo dove abbiamo modificato e i bytes modificati: Indirizzo
0043FE64, byte "75" in "EB".
Bisogna calcolare che
posizione nell'eseguibile corrisponda all'indirizzo che abbiamo modificato.
Dobbiamo avere informazioni sulla struttura dell'eseguibile.
Aprite il
vostro tool per vedere le sezioni del programma, io user� PE Explorer.
Aprite
PE Explorer e selezionate View->Section headers. Avete cos� la lista delle
sezioni, in ordine di indirizzo. (ora calcoler� tutto in esadecimale) C'�
".text" con indirizzo virtuale (che ci interessa) 00401000, mentre quello
successivo � ".data" con indirizzo virtuale 0048F000. Il nostro indirizzo, che �
0043FE64, si trova quindi in .text. Ok. Il nostro indirizzo si trova al byte
0043FE64 - 00401000 = 3EE64 dall'inizio della sezione .text. Perfetto.
Solo che la sezione non si trova all'inizio del file ma � anch'essa spostata un
po' rispetto all'inizio dell'eseguibile. Di quando? Ce lo dice il Pointer to Raw
Data: 600. L'offset nell'eseguibile sar� quindi 3EE64 + 600 = 3F464.
Apriamo ora il nostro editor esadecimale, che il mio � XVI32. Una volta
aperto l'eseguibile andate all'indirizzo 3F464, che in XVI32 si raggiunge
premendo Ctrl+G, scegliendo Hexadecimal nella finestra che appare e scrivendo il
valore.
Come vedete, l� troviamo il "75" da togliere. Scrivete al suo posto
"EB" e salvate!
Mailatemi x info,
helpz. Byez ppl!
The Neuromancer
Knowledge is power
Note finali |
Grazie principalmente ai Red Hot Chili Peppers
(molto citati nel tute) e a Bob Marley che mi hanno accompagnato nella stesura
di questo testo.
Grazie alla UIC che mi ha fornito tanti crackme da sbloccare
:) (non � lecchinaggio questo :p~~~)
Grazie all'autore di OllyDbg che quel
SoftICE mi sta proprio sui maroni e non gira con la mia scheda video
:/
Grazie alla mia migliore amica ma non mi vuole presentare la sua
ragazza... :P
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 che ogni sviluppatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly.