Phoenix2 |
||
Data |
by "x86" |
|
20/03/2005
|
Published by Quequero |
|
Come, Quando, Fiori, Piove |
Grazie x86, ineccepibile come al solito!!! |
Buio, Contro Buio |
.... |
|
.... |
Difficoltà |
( )NewBies (*)Intermedio ( )Avanzato ( )Master |
Introduzione |
Tools usati |
URL o FTP del programma |
Essay |
Sommario delle cose che dobbiamo fare:
Dopo questa piccola premessa, iniziamo subito con caricare il Phoenix2 in Olly e andare a steppare il loader del Pex, dopo un pò che steppiamo arriviamo al seguente codice:
|
Un'altra cosa da notare, della quale nn riporto il codice, dato che è una cosa semplicissima, in esi viene caricato il valore 4647h e in edi il valore 4A4Dh (chiamati anche Magic-Value), da questo si può intuire che subito dopo l'installazione della seh ci sarà un trick Anti-Sice, infatti dopo un step arriviamo alla seguente istruzione:
|
Se non avete capito perchè quando sice è caricato l'INT3 non genera alcuna Exception, basta che andiamo a vedere la lista di Ralf Brown, nella quale possiamo vedere che con i Magic Value caricati possiano utilizzare l'INT3 per fare varie cose (Soft-ICE - BACK DOOR COMMANDS), tipo visualizzare stringhe, ecc., è per questo che non genera alcuna exception perchè viene visto come un comando; Adesso dato che noi siamo con Olly l'INT3 genera un exception che verra trappata dalla seh e ci farà saltare all'indirizzo 4161F1h dove viene rimessa a posto la seh e si prosegue all'indirizzo 41615Bh, adesso dato che non ci interessa studiare il packer Pex, possiamo cliccare su F9 lasciarlo fare i suoi sporchi comodi e vedere dove si va a finire... tada.. ci blocchiamo su:
004161EE UD2 <-- Non fa altro che generare una exception e farci andare nuovamente all'indirizzo del Seh handler a 4161F1h Riporto un pezzo di testo preso dal sito x86.org : ..... ( hihihi il mio omonimo :D ) UD2: There is a new exception called UD2, and a new opcode, which is guaranteed to generate the UD2 expection. |
Il packer PeX 0.99 in tutto il suo loader ha solo due punti che utilizzano le seh, il primo con l'INT3 (Utilizzato anche come trick Anti-sice e quello appena descritto sopra con UD2), quindi la prima cosa nella nostra routine di debugger dobbiamo dirgli di far gestire queste eccezzioni direttamente dal loader di Phoenix2 e non dal nostro, iniziamo a vedere come si fa buttando giù un po di codice:
Tralascio sempre lo scheletro del file di masm32: invoke CreateProcessA, offset nome_file, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS+CREATE_SUSPENDED, NULL, NULL, offset sinfo, offset pi .while TRUE invoke WaitForDebugEvent, addr debug_ev, INFINITE .if debug_ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
.elseif debug_ev.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.elseif debug_ev.u.Exception.pExceptionRecord.ExceptionCode == 0C000001Dh
.endif invoke ContinueDebugEvent, debug_ev.dwProcessId, debug_ev.dwThreadId, DBG_EXCEPTION_NOT_HANDLE .endw invoke ExitProcess, 0 end start |
Questo è più o meno un pezzo dello scheletro del ciclo di loop del nostro debugger (ho tralasciato tutte le chiusure del while, e degli if, tanto è solo per far capire che una volta verificato le prime due exception (quelle del PeX), verificando anche gli indirizzi, così siamo più che sicuri che siano quelle e non altre, dobbiamo rispondere con un DBG_EXCEPTION_NOT_HANDLED, in modo da farle gestire direttamente dal suo loader e non dal nostro ciclo di debugger altrimenti uscirebbe un casino;A questo punto siamo quasi a posto, adesso per stepparci tutto il loader senza troppa fatica, saltando i vari controlli del byte CCh (quando nei debugger, come Olly e Sice si mette un BPX nome_api , si va a sostituire il primo byte originale con CCh, quello che poi andremo a fare anche noi con il nostro :) ) sugli indirizzi delle Api, possiamo tranquillamente mettere un hardware breakpoint sull'api VirtualFree ( questo lo so dato che ho già steppato tutto il loader, ed è secondo me la cosa più conveniente da fare...), quando viene eseguita questa Api, siamo sicuri che all'indirzzo del Oep, ci sia tutto il codice in chiaro, ( se pensate di dumpare e di avere l'exe pronto, ve lo potete scordare, dovete mettere a posto la IT), una volta brekkato su quell'api possiamo togliere l'hardware breakpoint e settare un BPX all'Oep, così siamo pronti per partire con il crackme vero e proprio. Al nostro debugger loop dobbiamo aggiungere alcune cose fondamentali, quando andremo ad inserire un hardware breakpoint dobbiamo verificare l'EXCEPTION_SINGLE_STEP, quindi avremo:
Tralascio sempre lo scheletro del file di masm32: invoke CreateProcessA, offset nome_file, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS+CREATE_SUSPENDED, NULL, NULL, offset sinfo, offset pi .while TRUE invoke WaitForDebugEvent, addr debug_ev, INFINITE .if debug_ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
.elseif debug_ev.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.endif invoke ContinueDebugEvent, debug_ev.dwProcessId, debug_ev.dwThreadId, DBG_EXCEPTION_NOT_HANDLE .endw invoke ExitProcess, 0 end start |
Ok, adesso lo scheletro del nostro debugger loop è quasi completo, dato che mancano solo alcune zone di codice, che ci consentiranno tramite dei breakpoint di far decryptare delle routine dell'algo di controllo e di creazione del seriale!, inoltre ci consentiranno di modificare il codice del crackme, in modo da avere il seriale corretto direttamente in un buffer di memoria, pronto per essere letto e visualizzato da una messagebox; Adesso siamo pronti e possiamo iniziare ad inseririre tutti passaggi:
Tralascio sempre lo scheletro del file di masm32: invoke CreateProcessA, offset nome_file, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS+CREATE_SUSPENDED, NULL, NULL, offset sinfo, offset pi .while TRUE invoke WaitForDebugEvent, addr debug_ev, INFINITE .if debug_ev.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
.elseif debug_ev.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
.endif invoke ContinueDebugEvent, debug_ev.dwProcessId, debug_ev.dwThreadId, DBG_CONTINUE .endw invoke ExitProcess, 0 end start |
Con questo è tutto, ad ogni modo allego al presente anche il loader già compilato e funzionante (testato su WinXp e vari Sp1 e Sp2 ..., su Win2K (testato su VM) il crackme deve avere qlc problema dato ke genera un errore quando si va ad inserire i valori del serial, altrimenti funzionerebbe anche su questo, mentre in Win9x, per delle limitazione del SO nn si possono settare hardware breakpoint sugli address delle Api... avrei dovuto aggirare il problema, cosa che per questioni di tempo nn ho fatto...), per farlo funzionare szippatelo in una cartella assieme al crackme Phoenix2 e lanciate il loader, inserite un nick (Chiaramente solo char composti da lettere!) e un serial di 16 char e cliccate su register, vi uscira una messagebox con il serial, adesso potete avviare un secondo Phoenix2 mettere il nick che avevate scelto prima e inserire il serial visualizzato nella MsgBox.
Byz x86
Note finali |
Come al solito saluto in primis Adri e a seguire d31m0s, Que (che sarà ancora incazzato per la buca ke gli ho tirato in chat ... speriamo sia generoso, e che trovi ancora il tempo per discutere dello St.........) Il Q non si incazza mai tranquillo :) NdQue Yado, Andre e per finire come posso dimenticarmi di Paco.
Mandi Mandi biei..
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.