giovedì 14 giugno 2012

Manual Unpacking, il gradino indispensabile

Parlando di reverse engineering non si può non parlare dello scalino forse più difficile da sorpassare prima di potersi definire effettivamente un buon reverser e abbandonare definitivamente il mondo del newbie.
Questo gradino è il manual unpacking, di cui forse per vari scopi avrete già sentito.

Dovete sapere che la maggior parte dei software commerciali sia di alto che di basso livello sono dotati di protezioni, che servono proprio per impedire il reverse engineering e prendono il nome di "packer". Questi vanno a modificare il codice del programma in vari modi che cambiano a seconda del packer che si usa.
Il più delle volte il packer crea un code-cave nel programma nel quale poi scriverà un algoritmo per criptare o packare il programma. Prima di andare troppo a fondo nell'argomento, dovete sapere 2 termini che in questo ambito sono indispensabili: "l'EntryPoint" (EP) e "l'Original EntryPoint"(OEP). Il primo è, come è facile intuire, l'inizio vero e proprio del programma, cioè la prima parte di codice che viene scritta in memoria ed elaborata. Il secondo invece, è un termine che si usa riferendosi a programmi packati per indicare il vero EntryPoint, cioè il punto di inizio del programma il quale essendo packato non è uguale all'EP (proprio perché il packer crea il code-cave all'inizio del programma per criptare l'intero programma prima di farlo elaborare).

Quindi in un programma packato OEP != EP, mentre in un programma non packato EP == OEP, questo dovrebbe essere abbastanza chiaro.
Benissimo, chiarito questo concetto potete capire, all'incirca, cosa fa il più delle volte un packer.  Solitamente questo, va a scrivere un algoritmo di criptazione che si sostituisce all'EP originale del programma filtrando ogni parte del programma tramite appunto questo codice (abbiamo già visto lo XOR ENCODER che serviva per eludere VirusTotal).

Fino a qui non dovreste aver problemi a capire, ma la parte più difficile (più da fare che da capire) è il dump del programma, cioè l'estrazione del codice del packer dal programma. Per fare un dump abbiamo a disposizione vari programmi, ma per le prime volte io consiglio di usare OllyDump, il quale è un semplice ed intuitivo plug-in per OllyDBG. Una volta fatto il dump del programma arriva l'ultima cosa da fare, cioè la ricostruzione delle import, che è la parte più semplice perché ci viene in aiuto il miglior programma per questo genere di cose cioè ImpRec (illustrato nell'immagine).

Quindi riassumendo il manual unpacking si divide in 3 parti:


1-Comprensione del funzionamento del packer
2-Individuazione dell'OEP
3-Dump del programma
4-Ricostruzione delle Import

Ovviamente, come ho già detto, l'intenzione di questo articolo non era darvi istruzioni dettagliate sul manual unpacking, perché per farlo ci vorrebbero un bel PDF corposo, ma, come cerco di fare sempre, era di intrudurvi in questo argomento, illustrndovelo approssimativamente.

Consiglio di leggere principalmente questa guida: Manual Unpacking UIC, dove vengono introdotte bene le basi (il PE e la sua analisi) e le varie tecniche anti-debugging, e dove viene data una strada un po più concreta da seguire per unpackare un programma.

Infine consiglio di andarvi a vedere qualche tutorial sempre della UIC sul manual unpacking di alcuni CrackMes, prima di passare a provare un UnpackMe vero e proprio senza nessun aiuto. Buona fortuna...

Nessun commento:

Posta un commento

Ti potrebbero anche interessare

Related Posts Plugin for WordPress, Blogger...