Cos`è il Reverse Engineering Cos`è il reverse

Transcript

Cos`è il Reverse Engineering Cos`è il reverse
Tutorial #1 : Cos'è il Reverse Engineering
Prima di continuare a leggere.
La traduzione e la revisione di questi tutorial mi hanno portato via molto tempo. Mi farebbe dunque
molto piacere sapere cosa voi lettori pensiate del risultato finale. Siete liberi di esprimere giudizi,
opinioni, pareri, critiche e consigli al seguente link https://it.surveymonkey.com/r/D7CWWYW. Si
tratta di un piccolo sondaggio che mi sarà utile per capire se valga davvero la pena di continuare
questa serie. Detto questo non mi rimane che augurarvi una buona lettura!
Cos'è il reverse engineering?
Il reverse engineering è il processo di prendere un binario compilato e tentare di ricreare (o
semplicemente capire) il modo in cui un programma funziona. Un programmatore inizialmente
scrive un programma, di solito in un linguaggio di alto livello come C ++ o Visual Basic (o Dio non
voglia, Delphi). Poiché il computer di per sé non parla queste lingue, il codice che il programmatore
scrive viene assemblato in un formato specifico per la macchina, un formato che il computer non
parla. Questo codice viene chiamato, abbastanza originariamente, linguaggio macchina. Questo
codice non è molto accogliente per gli umani, e spesso richiede grande abilità e concentrazione per
capire esattamente ciò che il programmatore aveva in mente.
Per cosa è utilizzato il reverse engineering?
Il reverse engineering può essere applicato a molti settori della scienza informatica, ecco un paio di
categorie generiche nella quale può essere adoperato;





Rendere possibile l'interfacciarsi con il legacy code (di cui non si ha il codice sorgente
originale).
Rompere le protezioni (ie. Stupire i vostri amici e risparmiare qualche $$).
Studiare virus e malware.
Valutare la qualità e la solidità di un software.
Aggiungere funzionalità ad un software esistente.
La prima categoria è reversare il codice quando il sorgente non è disponibile, al fine di interfacciarsi
con binari già esistenti. Non discuterò molto di questo argomento, in quanto è noioso.
La seconda categoria (la più grande) consiste nel rompere le protezioni. Con questo si intende
bypassare i Trial/Demo, oltrepassare i sistemi di controllo delle licenze, o comunque tutto ciò che ci
permette di ottenere un software commerciale in modo gratuito. Di questo discuteremo a lungo.
La terza categoria ci dà la possibilità di studiare virus e codice malware. è richiesto il reverse
engineering, perché non sono molti i programmatori di virus che danno informazioni su come
hanno scritto il codice, quello che fà, e come lo farà (a meno che non siano veramente stupidi).
Questo è un campo piuttosto eccitante, ma richiede una grande quantità di conoscenze. Di questo
parleremo in seguito.
La quarta categoria ci dà la possibilità di testare la sicurezza e le vulnerabilità del software. Durante
la creazione di software di grandi dimensioni (il sistema operativo Windows per esempio), il
reverse engineering è usato per fare in modo che il sistema non contenga importanti vulnerabilità,
falle di sicurezza, e di renderlo il più difficile possibile da craccare.
L'ultima categoria permette l'aggiunta di funzionalità a un software già esistente. Personalmente,
penso che sia una delle più divertenti. Non ti piace la grafica utilizzata nel software di web design
che utilizzi? cambiala. Vuoi aggiungere una voce di menu per crittografare i documenti del vostro
programma di videoscrittura preferito? Aggiungila. Vuoi infastidire i tuoi colleghi a non finire con
l'aggiunta di finestre di messaggio sprezzanti alla calcolatrice di Windows? Allora facciamolo!
Vedremo come più in avanti nella serie.
Quali conoscenze sono richieste?
Com'è facilmente intuibile, una grande quantità di conoscenze è necessaria per poter essere un
valido reverse engineer. Fortunatamente però, queste conoscenze non sono indispensabili per poter
'iniziare' con il reverse engineering. Detto questo, per divertirsi con il reversing e imparare qualcosa
da questi tutorial, dovreste almeno avere una conoscenza di base di come funziona il flusso di un
programma (per esempio, si dovrebbe sapere cosa un semplice IF ... THEN fa, cos'è un'array, e aver
visto almeno una volta un programma hello world). In secondo luogo, familiarizare con il
linguaggio Assembly è altamente consigliato; Anche senza farlo potrete ugualmente seguire questi
tutorial, ma a un certo punto vorrete diventare dei guru in ASM per sapere esattamente ciò state
facendo. Inoltre, un sacco di tempo sarà dedicato a imparare a usare i vari tools. Questi strumenti
hanno un valore inestimabile per un reverse engineer, ma richiedono del tempo per apprendere le
scorciatoie(shortcuts)difetti e peculiarità di ognuno di essi. Infine, il reverse engineering richiede
una notevole quantità di sperimentazione; giocare con diversi tipi di packers/protectors/encryption,
riconoscere i programmi originariamente scritti in diversi linguaggi di programmazione(anche il
Delphi), decifrare i trucchi anti-reverse engineering… L'elenco potrebbe continuare all'infinito. Alla
fine di questo tutorial ho aggiunto una sezione chiamata 'Letture consigliate' con alcune fonti
suggerite. Se volete veramente diventare bravi nel reversing, vi consiglio vivamente di leggere
qualche libro tra quelli consigliati.
Che genere di tools sono utilizzati?
C'è una vasta varietà di tools utilizzati nel reversing. Molti sono specifici per i tipi di protezione che
devono essere superate per reversare un binario. Ma ce ne sono diversi che hanno il solo obbiettivo
di semplificarvi la vita. E poi ci sono quelli che io considero „staple‟ . Ovvero quelli usati
regolarmente. Per la maggior parte dei casi, questi strumenti rientrano in questa lista di categorie:
1. Disassemblers
I disassemblatori tentano di prendere il codice macchina da un eseguibile e di visualizzarlo in un
formato più amichevole. Sono anche in grado di estrapolare dati come le chiamate di funzione, le
variabili passate e le stringhe di testo. Questo rende il look e il codice di un'eseguibile più leggibile
rispetto a una serie di numeri legati insieme. Ci sono molti disassemblatori , alcuni dei quali
specializzati in cose specifiche (come ad esempio i binari scritti in Delphi). Per lo più si tratta di
usare quello a voi più comodo. Mi sono sempre ritrovato a lavorare con IDA (c'è una versione
gratuita disponibile su http://www.hex-rays.com/), così come con un paio di disassemblatori meno
noti che posso aiutarci in situazioni particolari.
2. Debuggers
I Debugger sono come il pane e il burro per i reverse engineers. In primo luogo analizzano il
binario, in modo molto simile a un disassembler Debugger quindi consentono di eseguire il codice,
riga per riga dandoci modo di studiare i risultati prodotti. Questo ha un valore importantissimo al
fine di scoprire come funziona un programma. Infine, alcuni debugger consentono di modificare
alcune istruzioni nel codice e di eseguire nuovamente il programma con questi cambiamenti in atto.
Esempi di debugger sono Windbg e OllyDbg. Uso quasi esclusivamente OllyDbg
(http://www.ollydbg.de/), salvo per il debug in modalità kernel , ma a questo penseremo più avanti.
3. Hex editors
Gli editor esadecimali(o hex editors) consentono di visualizzare i byte effettivi di un binario, e di
modificarli. Forniscono inoltre la possibilità di cercare dei byte specifici, risparmiando le sezioni di
un binario su disco e molto altro ancora. Ci sono molti editor esadecimali gratuiti, e la maggior
parte di loro andrà bene. Non li useremo moltissimo , ma in seguito ci torneranno sicuramente di
grande aiuto.
4. PE and resource viewers/editors
Ogni binario progettato per funzionare su una macchina Windows (e Linux del resto) all'inizio
contiene una sezione molto specifica di dati che dice al sistema operativo come impostare e
inizializzare il programma. Comunica al il sistema operativo la quantità di memoria che sarà
necessaria, da quale tipo di DLL il programma ha bisogno di prendere il codice in prestito,
informazioni su finestre di dialogo e così via. Questo è chiamato Portable Executable, e tutti i
programmi progettati per funzionare su Windows ne hanno uno.
Nel mondo del reverse engineering, tale struttura di byte diventa molto importante, in quanto
fornisce al reverser le informazioni necessarie sul binario. Eventualmente, se volete (o necessitate
di) modificare queste informazioni, sia per rendere il programma in grado di poter fare cose diverse
da quelle per la quale era inizialmente ideato, sia per modificare il programma in modo da farlo
tornare com'era originariamente (per esempio prima che una protezione rendesse difficile il codice
da capire). Ci sono una miriade di PE viewers ed editors. Io uso CFF Explorer
(http://www.ntcore.com/exsuite.php) e LordPE
(http://www.woodmann.com/collaborative/tools/index.php/LordPE), ma sentitevi liberi di usare
quello con cui vi trovate meglio.
La maggior parte dei file hanno anche delle sezioni dedicate alle risorse. Queste includono la
grafica, gli elementi di dialogo, le voci di menu, icone e stringhe di testo. A volte ci si può divertire
anche solo guardando (e alterando;)) le sezioni dedicate alle risorse. Vi mostrerò un esempio, alla
fine di questo tutorial.
5. Strumenti per il monitoraggio del sistema
Quando si reversano i programmi(e quando si studiano i virus e i malware), a volte è importante
vedere quali sono i cambiamenti che un'applicazione rende al sistema; ci sono chiavi di registro
create o interrogate? ci sono file ini creati ? vengono creati processi separati , per contrastare il
reverse engineering del programma? Un'esempio di strumento di monitoraggio di sistema è dato da
procmon , regshot, e process hacker. Discuteremo di questo tipo di tools più avanti nel tutorial.
6. Strumenti e informazioni varie
Ci sono strumenti che prenderemo lungo il cammino, come gli script, unpackers, identificatori di
packer etc. Anche questa categoria è una sorta di riferimento alle API di Windows. Le API sono
enormi, e, a volte, complicate. E 'estremamente utile per il reverse engineering sapere esattamente
cosa stanno facendo le funzioni che vengono chiamate.
7. Birra.
Non perdiamo ulteriore tempo e iniziamo subito!
Anche se stiamo iniziando con delle scarse conoscenze, ci tenevo a dare almeno un piccolo assaggio
di reversing in questo primo tutorial. In allegato a questa guida ho inoltre incluso un resource
viewer/edit (nella cartella Files) chiamato XN Resource Editor.
E' freeware. In sostanza, questo programma permette di visualizzare e modificare le risorse presenti
in un file exe. Ho scoperto che ci si può divertire un sacco con questo tipo di programmi.
Permettono di modificare i menu, le icone, la grafica, le finestre di dialogo, e addirittura i nomi dei
programmi. Proviamone uno noi stessi...
Innanzitutto, eseguite XN. Fate Click sull'icona di caricamento situata in alto, e andate in
Windows\System32\ e caricate calc.exe (La vostra cartella di default di Windows potrebbe essere
diversa.) A questo punto dovreste vedere un mucchio di cartelle disponibili:
Come potete notare ci sono delle cartelle per le bitmap (qualsiasi grafica il programma visualizza),
Menu (le voci di menu in alto), Dialog (le finestre di dialogo, insieme con il testo e i pulsanti),
String Table, IconGroup etc. Sentitevi liberi di pasticciare con queste cose. Solo assicuratevi di
salvare le modifiche in un'altro file (sarebbe davvero odioso dover reinstallare Windows solo per
una stupida calcolatrice). In particolare, provate a fare questo: Fate clic sul segno più accanto al
Menu. Vedrete una cartella con un numero come un nome. Questo è l'ID che Windows userà per
accedere a questa risorsa del programma. Aprite pure questa cartella. Ora dovreste vedere un'icona
per "Inglese (Stati Uniti)", o qualcosa di simile. Se ci fate clic su vedrete un diagramma di come
sarà il menù (potete cliccare dappertutto- funziona proprio come il menu vero e proprio).
Ora, fate clic sul menu "Scientifico". Il campo della Caption dovrebbe cambiare in “&Scientific”.
La e commerciale è lì per dirvi qual'è la 'Hot-Key', in questo caso è 'S'. Se invece volessimo
cambiarla in 'e' , il risultato sarebbe simile a “Sci&entific”. Quindi non vi piaciono le hotkeys
(Tasti di scelta rapida) per la Calcolatrice? Potete cambiarli !! Ma facciamo qualcosa di diverso. Nel
campo Caption, sostituite la &Scientifica con “&Nerd”. Questo cambierà l'opzione di menu a
"Nerd" e la nuova hot-key sarà 'N' (Ho dato un'occhiata alle altre opzioni del menu e nessun'altra
opzione faceva utilizzo di 'N' come hot-key). Dovreste fare questo per tutte le voci del menu.. Ora,
andate in File (in XN Resource) e fate "Salva con nome ..." Salvate la nuova versione della
calcolatrice con un nome diverso (e preferibilmente in una posizione diversa) ed eseguitela.
Naturalmente, non c'è bisogno di fermarsi qui. Con lo scopo di far impazzire i miei colleghi, ho
cambiato tutti i numeri nelle loro calcolatrici.
Come potete vedere, non ci sono limiti.
-R4ndom
ps. I miei ringraziamenti vanno a Lena151, per avermi mostrato la via, A.S.L., Snaker, Qwerton e
Jibz per avermi mostrato i segreti, e Olly, Yoda-mmi, UCF e Colin Wilson per avermi fornito gli
strumenti necessari.
Tradotto con amore da Gmarksa(Versione Beta). Link guida originale in lingua inglese :
http://octopuslabs.io/legend/blog/archives/7.html
Letture consigliate
1. Assembly Language. Assembly Language For Intel Based Computers
is the de-facto book on it . You can also check out some web sites that offer a tremendous amount
of downloads , instruction , sample code , and help . Another good resource is “The Art of
Assembly”. I will be including this in one of the next tutorials, but you can also download it here .
2. The PE file structure. One of the best resources is from Microsoft themselves: “An in-depth
look into the Win32 Portable Executable File Format “. Another good document (with lots of pretty
pictures) is “PE File Structure “. It is a downloadable PDF.
3. Windows Operating System Internals. The de-facto book is “Microsoft Windows Internals” by
Mark Russinovich. It‟s about as exciting as women‟s baseball, but it is THE resource.
4. Cracking tutorials. www.Tuts4You.com is the place to be.