Togliamo il nag screen di WinRAR 3.30
(extreme newbie level)

Data

by The Neuromancer

 

06/Jan/2005

UIC's Home Page

Published by Quequero

If you have to ask, ya'll never know... - Red Hot Chili Peppers

Grazie tante neuro, ottimo lavoro

Sex, music, hacking.

....

Home page: http://www.evilmafia.org
E-mail: neuromancer at paranoici d0t org
Nick: neur0mancer on #phreak, irc.azzurra.org (praticamente mai, meglio una mail)

....

Difficolt�

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

 

Introduzione

Salve gente, questo � il mio primo tute sul cracking e spero di fornirne altri al publico dominio (underground) man mano che ne ho il tempo e aumentano le mie capacit�. Questo tutorial � rivolto a tutti coloro che piano piano si stanno avvicinando all'affascinante (come Penelope Cruz :)) mondo del reversing.
Sicuramente vi sar� capitato di cercare un doc che spiega dettagliatamente come sbloccare una protezione e spiega passo passo come giungere al cuore dell'algoritmo di criptazione o dove trovare il seriale esatto... e sicuramente vi sarete chiesti "Ma come fanno questi diavolo di crackerz ad arrivarci subito?".
La realt� � che, almeno nel mio caso, quando si cerca una protezione si hanno decine di falsi allarmi, di routine che si analizzano per poi scoprire che sono totalmente inutili o sono soltanto versioni ben ottimizzate del strcpy (che potreste scambiare con l'algo del Blowfish :P )
Una volta raggiunto il problema da aggirare, questi crackerz patchano, testano e poi scrivono il tute eliminando (o forse censurando) i loro errori.

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

Tools usati:
OllyDbg
XVI32, il miglior hex editor del mondo. Va bene comunque qualunque hex editor.
Un qualunque programma che vi permetta di vedere le sezioni di un programma, con le loro opzioni. Provate PeExplorer

URL o FTP del programma

Qui dovreste trovare la versione 3.30 di WinRAR. Tanto si trova dappertutto (io l'ho preso da un CD di Giochi Per Il Mio Computer)
Comunque il crack dovrebbe andare x qualunque versione (con ovviamente qualche modifica). Se ci riuscite, mandatemi una mail.

Essay

Eccoci qui.
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)

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)
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...)

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

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

Bene. Il nostro stack � poco affollato, abbiamo una sola entry, dite che ci bloccheremo? :PPPPP
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


Eccoci qui. Col senno di poi vi dir� che � tutto qui il nocciolo della situazione. Analizziamo.
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.

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
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".

Eccoci qui. Modificando 1 solo byte del WinRAR siamo riusciti a farlo andare come volevamo. Ora bisogna patchare il programma.
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!

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