DVDToolbox 0.13.7
(Unpacking Protection- Upx - e via la Nag...)

Data

by "Lonely Wolf"

 

01/12/2003

UIC's Home Page

Published by Quequero


Se non ti uccide ti rafforza - Nicolo' Machiavelli

Beh lone, mi devo complimentare, sei stato esemplare tanto nella compilazione del form quanto nella stesura, bravo lone!

Chi dice di essere spacciato, lo è già per metà - Lord Byron

....

E-mail: [email protected]
LonelyWolf #crack-it #cryptorev

....

Difficoltà

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

 

Per cominciare dovremo unpackare il programma con upx e dopo aver domato il prog che non gradisce il fatto di essere stato decompresso, si procede con la rimozione della tediosa Nag Screen e al bloccaggio del contatore nel file dvdtoolbox.ini che si salva il numero di volte che lo usiamo...e a noi questo non piace molto, e poi che gliene frega no? :)


DVDToolbox 0.13.7
(Unpacking Protection- Upx - e via la Nag...)
Written by Lonely Wolf

Introduzione

Scopriamo come gli amici tedeschi abbiano cercato di metterci il bastone tra le ruote e proseguiamo l'opera di bonifica del programma. Il resto poi vien da se' ;)

Tools usati

Heaven Tools PE Explorer
Upx
Softice
Il buon vecchio W32Dasm, + che sufficiente per oggi
Un qualunque Hex Editor

URL o FTP del programma

Se non sbaglio è www.dvdtoolbox.de (l'ho sull'altro computer, non me lo fate accendere :p)

Notizie sul programma

Onestamente non ho usato neanche una volta questo simpatico programmino che ci arriva dalla Germania, sul pc sul quale sto lavorando non ho il lettore dvd purtroppo, cmq a quanto vedo è un'utility molto leggera e a quanto mi ha detto un amico, molto utile per smanettare con i dvd per fare strip & split, boh :)  

Essay

Iniziamo vedendo un po' con chi abbiamo a che fare... avviamo il prog e appare subito la nag con tanto di pulsante Ok che si attiva dopo 10 secondi (countdown visibile proprio sul pulsante che poi diventa Ok). Cmq il prog è completo, funziona tutto, niente serial da inserire, le solite stringhe Unregistered Version, ma niente di + a prima vista.
Nella directory del programma non appare alcun file .ini tanto per la cronaca. Siccome sono curioso, una delle prime cose che faccio sempre è aprire il file in questione con il PE Explorer e vedere un po'le funzioni che importa, le risorse...giusto per dare un'occhiata, sapete come vanno queste cose ;)
Ma, ma cosa accade?
Quando provo a vedere le bitmap o le dialog mi dice che la risorsa può essere danneggiata o.... compressa!
Guardiamo Section Header...e chi ti vedo?

UPX 0
UPX 1

Non ci rimane che usare upx (per chi ne fosse sprovvisto lo trovate su protools.cjb.net assieme a tanta altra robina tattica :P) per decomprimere l'exe e lavorare su quello. (oddio, volendo se ne potrebbe fare a meno e lavorare solo con softice direttamente in memoria, ma proviamo a fare le cose a modino :D )
Da riga di comando digitate: upx -d dvdtoolbox.exe
Se ora lo riaprite con PE Explorer vedrete tutte le risorse senza rogne :)
Bene, diciamo che a questo punto provo ad eseguirlo, doppioclikko ma...qualcosa è andato storto! La fortuna è dalla mia come sempre...

DVDTOOLBOX ha provocato un errore di pagina non valida nel modulo DVDTOOLBOX.EXE in 0167:00401b22.
Registri:
EAX=00000001 CS=0167 EIP=00401b22 EFLGS=00000202
EBX=00000008 SS=016f ESP=0066faec EBP=00894240
ECX=00000005 DS=016f ESI=00000000 FS=11af
EDX=00400000 ES=016f EDI=0066fb01 GS=0000
Byte all'indirizzo CS:EIP:
c6 02 00 e8 17 44 01 00 55 e8 b8 42 01 00 83 c4
Immagine dello stack:
00000000 00000000 00000000 0066fe38 00560000 bf1ad24e 1fbfbc6c dbd89ac5 c771e2cd bbbab900 00000006 00031000 8c1ab2fb cafae16f ab5f66d3 a84498ce

Pbacco!
Avrò skazzato con upx eppure non mi sembra...cmq per scaramanzia mi riprendo l'exe originale, ripeto l'operazione e di nuovo l'errore. (Nota: Windows98 da questo errore, windows xp si limita a chiudere a diritto il programma)

Eppure con PE Explorer leggo perfettamente il file...ergo il file non è danneggiato.
Vuoi vedere che è una protezione, e si accorge che la verginità del programma è in pericolo? :D

errore di pagina non valida nel modulo DVDTOOLBOX.EXE in 0167:00401b22.

Iniziamo proprio da questo indirizzo, cerchiamo di scoprire perchè viene fuori una pagina non valida.

Io prendo w32dasm, + che sufficiente per il nostro scopo (Que mica te ne hai a male se uso il pre nell'html qui?)


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401B0E(C)
|
:00401B15       xor esi, esi
:00401B17       cmp eax, esi <- non ho (ancora) la + pallida idea di COSA cmp
:00401B19       je 00401B2A <- ma so che se non salta ...
:00401B1B       mov edx, dword ptr [00429AE0]
:00401B21       push esi
:00401B22  	mov byte ptr [edx], 00 <- ...arriva qui e si inkazza come una jena
:00401B25 	call 00415F41

Cambiamo il jump e via...
Con calma, prima cerchiamo di capire cosa succede e per farlo iniziamo da

Referenced by ... Jump at Address: :00401B0E <--- !!
Ma è qualche riga sopra!
Guardiamo, guardiamo BENE ...



:00401AE1      push 00000000
:00401AE3      push 00000000
:00401AE5      push 00000011
:00401AE7      push ebx

* Reference To: KERNEL32.SetFilePointer, Ord:0000h
                                  |
:00401AE8      Call dword ptr [0041F148]
:00401AEE      lea ecx, dword ptr [esp+24]
:00401AF2      push 00000000
:00401AF4      push ecx
:00401AF5      push 00000006
:00401AF7      push ebp
:00401AF8      push ebx


 Reference To: KERNEL32.ReadFile, Ord:0000h <- Salve :)

(dai parametri pushati sopra realizzo che il file in questione è...l'exe del prog
                                  
:00401AF9     Call dword ptr [0041F144]
:00401AFF     mov ecx, 00000006 <- Lunghezza stringa per cmpsb
:00401B04     lea edi, dword ptr [esp+10] <- carica la prima dalla memoria
:00401B08     mov esi, ebp <- la seconda letta dal file
:00401B0A     xor eax, eax
:00401B0C     repz
:00401B0D     cmpsb <- e le confronta
:00401B0E     je 00401B15 <- zompa (vedi sopra)
:00401B10     sbb eax, eax
:00401B12     sbb eax, FFFFFFFF

Siccome sono un fan di softice :) a questo punto possiamo anche mettere un bpx su readfile e seguire passo passo - chiudete pure il disassemblatore :p ... (premete F12 tante volte quante necessario per arrivare nel modulo del dvdtoolbox)
Ora, la tentazione è quella di limitarsi a cambiare il jump che ci manda in corto circuito il programma e andare avanti, ma non ero contento se non capivo perchè mi tirasse fuori un errore di quel tipo (e qui scatta doveroso il ringraziamento a Ntoskrnl per avermi aiutato a concentrarmi meglio sul programma dandomi una saggia indicazione).


:00401B19       je 00401B2A 
:00401B1B       mov edx, dword ptr [00429AE0]
:00401B21       push esi
:00401B22  	 mov byte ptr [edx], 00 

E che mai ci avranno messo in questo edx da farlo svarionare così? C'è un solo modo per scoprirlo...d edx :P e per farlo ovviamente dobbiamo settare il bp su readfile come detto prima (nella versione decompressa naturalmente, visto che dubito che il flusso del prog passi di la quando è compresso) e dare un'occhiata.
Ci siete? il contenuto dell'indirizzo 00429AE0 che poi mette in edx è 00400000. Quindi, edx = 00400000. Facciamo un po'sto d edx... Naaaaaaaaahhhhhhhhhhhh!!!
4D 5A ... (MZ..) ma è l'header di un eseguibile, anzi, è l'header del nostro programma in esecuzione!! Infatti, è il valore del campo Image Base (presumo bene?) nell'header del PE!!(Per verificarlo usate pure il wark o lo stesso PE Explorer). Ora pasto da quel gran bel lavoro che ha fatto Ntoskrnl IMO :) sui PE: "...Innanzitutto dovete sapere che quando il loader carica un PE in memoria non lo carica come è sul disco ma per quanto riguarda le sezioni le carica dove la Section Table gli dice di caricarle. Inoltre vi è un altro campo nel PE che specifica l'indirizzo al quale deve essere mappato il PE (il campo si chiama Image Base), in genere per gli exe l'ImageBase è 00400000h e questo è un Virtual Address."
Il prog legge da se'stesso e riconosce agilmente se è stato decompresso (basandosi su delle sequenze di byte che legge), se si, sposta in edx il valore dell'Image Base e poi cerca di azzerarlo! Te credo che si incazza :D
Ma anche la IDA :) ha qualcosa da dirci in merito, infatti dice che dword ptr [00429AE0] per lei è hInstance!!
Capito sti furbacchioni?
Se volete potete fare la contro prova, avviate l'eseguibile compresso con un bpx su readfile, dopo n F12 potete verificare quanto ho detto, il flag Z viene settato per cui arrivato a je 00401B15 (dopo xor eax,eax che come sanno anche le pietre azzera eax) salta e eax resta 0 validando il cmp per il salto successivo a :00401B19 je 00401B2A altrimenti, se l'eseguibile è quello decompresso, xor eax, eax lo azzera ma je 00401B15 non salta, tira diritto e sbb eax, FFFFFFFF rende eax = 1 invalidando il cmp per il salto successivo buttandoci fori a calci :) e provocando l' errore
Ora abbiamo l'imbarazzo della scelta :)
Io cmq ho cambiato il salto più interno, :00401B19 740F je 00401B2A in jmp e cioè ho cambiato il 74h in EBh (ho usato l'hex editor, ma si fa anche da softice direttamente in memoria con il comando a, per info h a, così lo riscrivete direttamente in asm :D. Naturalmente se lo fate in memoria quando riavviate il pc siete punto e a capo.
Per modificarlo con l'hex editor mi sono segnato i valori hex delle istruzioni che precedono e seguono il salto incriminato, per essere sicuro di beccare quello giusto, quindi 33F63BC6740F8B15E09A4200, aprite l'editor andate su trova e inserite quel valore hex che diventerà quindi 33F63BC6EB0F8B15E09A4200). Ma prima di andare avanti, se scorrete verso l'alto dal punto in cui poppa ice dopo il bpx readfile, vedrete oltre alla call getfilesize (chissà a che serve ;P) anche una GetPrivateProfileInt con la relativa write...

Ora, nella directory del programma c'è un filettino, DVDToolbox.ini:

[Main]
StartupCount=7

Il valore viene letto, incrementato e scritto. Giusto per verificarne l'utilizzo, ho impostato questo count a 414 e sapete che fa il prog quando viene riavviato? Invece che attendere 10 secondi prima di poter chiudere la nag, ce ne sta 120!!secondo +, secondo - !!!
Facciamo un passetto indietro, mettiamo un bpx getprivateprofileinta e riavviamo il prog.
Ice poppa. In eax c'è il valore che legge dal file ini ogni volta che poi incrementa di 1 con inc eax, lo vedete? :) e poi salva sul file ini il nuovo valore con la relativa write. Io ho sostituito inc eax con un bel nop :) così ogni volta che il prog viene avviato, legge StartupCount e lo riscrive tale e quale :p Quindi prendete, apri il file ini e ci scrivete 1
Ma non abbiamo ancora finito, ora dobbiamo togliere di mezzo la nag screen che ci appare e ci fa aspettare 10 secondi prima di poter iniziare ad usare il programma (uhmmm quanta fretta :D). Su quale Api dovremmo piazzare il breakpoint ?
Su una di quelle che crea una nuova finestra o una nuova dialog box, ma andiamo a dare un'occhiata con il PE Explorer alle imports...user32.dll. Abbiamo una CreateDialogParamA e DialogBoxParamA ergo presumo debba essere una delle 2.
Proviamo a mettere un bp sulla prima.
Nah, la prima non è, questa viene chiamata dopo, proviamo la seconda....si è lei.
Ice poppa come al solito nel corrispondente codice in user32.dll, premo f12 per andare invece sul codice del dvdtoolbox ma...torna al programma! Niente codice :( Aspetto che passino i 10 secondi, premo ok e ice poppa di nuovo, proprio sotto la call a DialogBoxParamA :) e c'è un ret, antipatico :) ahhh, sti teteschi :) Reversing macht frei :D Il Reversing rende liberi... :P
Uscendo dal ret, qualche riga sopra vediamo

mov eax,[00429D00]
test eax,eax
jne 40179B
call 406CA0 <- la call da cui siamo appena usciti

E'evidente che la nag viene chiamata se non fa il salto, quindi facciamo come sopra, trasformiamo il jne in jmp e auf wiedersen (Nt l'ho scritto bene? Non parlo/scrivo tedesco da anni e anni) nag all'avvio del programma! :) Credo di aver finito...invece no.
Avviamo il programma, bene, parte tranquillo e motivato senza nag, clicchiamo su esegui e si apre tranquillamente, sembra che funzioni tutto alla perfezione ma se clicchiamo sul pulsante strip...di nuovo un messaggio di errore su win 98 (su xp si chiude senza troppi complimenti).
Ripartiamo dall'indirizzo dell'errore e... uguale identico a sopra! fa lo stesso tipo di controllo con tanto di readfile. Beh, a questo punto sapete cosa fare :)
That's all Folks!

                                                                                                                 Lonely Wolf

Note finali

Ancora non mi sembra vero, il primo tutorialino, qui! :) Salutoni a Que (aka l'uomo ombra :D ihih), Andreageddon, albe, evilcry (lo aggiorni o no cryptorev? :P eheh), N0body88 (hai visto bro?:*), NitroTheDemon, Quake2_AM, Ntoskrnl (grazie anche per il supporto tecnico notturno:D), Zairon, Pincopall, Ironspark (grazie x sopportarmi ;D), Kratorius, ph0bbino (don't worry, be happy), mrcode, Zerobyte, k0rn[CSA], Giulia__87...e tutti quelli che mi sfuggono. Ciao #crack-it!!!

Disclaimer

L'autore non si ritiene lontanamente responsabile per usi impropri delle informazioni esposte, scritte per il solo scopo didattico. Naturalmente siete tutti incoraggiati a procurarvi il prog originale, a rimettere pure la marmitta originale al motorino ecc.. e nel caso, ad aspettare quei 10 secondi prima che possiate cliccare sul pulsante ok, perchè questo programma è stato studiato anche per insegnarvi l'antica arte zen della pazienza. Boni, fate i bbravi miraccomando...