Questo sito utilizza cookie di terze parti per inviarti pubblicità in linea con le tue preferenze. Se vuoi saperne di più clicca QUI 
Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all'uso dei cookie. OK

Tecniche di decompilazione e offuscamento

La decompilazione è il processo inverso della compilazione, in pratica si ricostruisce il codice sorgente ad alto livello partendo dal programma eseguibile e quindi dal codice macchina/assembler.
La decompilazione può essere utile per:
1. Recuperare codici sorgenti perduti: si potrebbe aver scritto un programma per il quale si ha ormai solo l’eseguibile, nel caso in cui, per esempio, c’è la necessità di modificarlo, allora tornano utili i decompilatori che permettono di recuperare il codice sorgente. Dato che siamo i proprietari ovviamente non ci saranno problemi di copyright.
2. Si ha il sorgente di linguaggi per i quali non disponiamo più del compilatore.
3. Migrare un’applicazione in linguaggio assembler in una nuova piattaforma hardware
4. Tradurre codice scritto in linguaggi obsoleti non più supportati dagli strumenti di compilazione attuali
5. Determinare l’esistenza di virus e software maligni nei programmi
6. Recuperare il codice scritto da qualcun altro (p.e.: per risalire all’algoritmo utilizzato)
Normalmente tutti i software sono sotto copyright da parte degli autori. Questo significa che copiare la stessa idea su un altro programma è proibito dalla legge.
Oltre però alla legge ci sono degli altri strumenti/tecniche che possono essere utilizzati per difendersi da decompilazioni indesiderate e sono gli offuscatori.
Per questo motivo in questa tesi tratterò non solo il discorso dei decompilatori ma anche quello, strettamente connesso al primo, degli offuscatori di codice.
Bisogna innanzitutto dire che i decompilatori si suddividano principalmente in due categorie quelli per eseguibili compilati specificamente per un tipo di macchina e quelli di classi che devono essere eseguiti su macchine virtuali (Virtual Machine).
Per quanto riguarda i decompilatori di eseguibili si sono riusciti ad avere dei risultati ma che si limitano ad esperimenti accademici a causa delle condizioni che impongono al programma che li fanno risultare all’atto pratico poco utili.
Per questo motivo ho concentrato la mia tesi maggiormente sui programmi per macchine virtuali, sia per quanto riguarda il discorso decompilatori che per quanto riguarda quello degli offuscatori.
Le classi generate dai compilatori per macchine virtuali presentano numerosi vantaggi rispetto a quelli per macchine reali perché le informazioni contenute nel bytecode delle classi riguardo al sorgente sono più dettagliate confronto a quelle contenute nel codice macchina degli eseguibili.
Per quanto riguarda i decompilatori per macchine virtuali quindi i risultati ottenuti sono molto più incoraggianti tanto che in molti casi si riesce ad ottenere un sorgente pressoché identico all’originale senza che vi siano particolari limitazioni riguardo alle caratteristiche del programma stesso.
Esistono molte macchine virtuali, io per comodità mi sono principalmente riferito per i miei test alla “Java virtual machine” e quindi a decompilatori Java. Questo scelta è dovuta sia al fatto che è il linguaggio per macchine virtuali che conosco meglio che al fatto che i risultati che si sono ottenuti riguardo alla java virtual machine sono per molti versi analoghi a quelli che si potrebbero ottenere per altre macchine virtuali come .NET per esempio perché la filosofia alla base è la stessa.
I test sui decompilatori descritti nel capitolo 3 sono serviti quindi a mettere in luce lo stato avanzato a cui si è arrivati con i decompilatori attuali.
Per quanto riguarda il discorso di offuscamento del codice sono state inventate molte tecniche:
• L’offuscamento del layout
• L’offuscamento dei dati
• L’offuscamento del flusso di controllo
Nell’ultima parte della tesi mi sono occupato degli offuscatori che attualmente sono stati implementati e in particolare di Jshrink e dello Zelix Klassmaster.
Dai miei test su programmi da me compilati ho potuto constatare come entrambi riescono ad offuscare efficacemente il programma ma mentre il primo ottiene solo il risultato di rendere difficile la comprensione dello stesso decompilato il secondo addirittura ne rende impossibile la decompilazione proprio perché riesce ad applicare a differenza del primo le tecniche di offuscamento del flusso di controllo.
Un ulteriore sviluppo del mio lavoro di tesi, aspetto che per motivi di tempo non ho affrontato, sarebbe quello di verificare anche la qualità degli offuscamenti attuati.
Infatti spesso, soprattutto nel caso dell’offuscamento del flusso di controllo, per raggiungere la protezione del software se ne vanno a perdere le qualità in efficienza.

Mostra/Nascondi contenuto.
Tecniche di Decompilazione e Offuscamento Tesi di laurea di: Nappo Marco Relatore: Giovanni Pighizzini

Tesi di Laurea

Facoltà: Scienze dell'informazione

Autore: Marco Nappo Contatta »

Composta da 144 pagine.

 

Questa tesi ha raggiunto 3013 click dal 25/10/2005.

 

Consultata integralmente una volta.

Disponibile in PDF, la consultazione è esclusivamente in formato digitale.