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.