PDA

View Full Version : Codice offuscato


M4rk191
15-11-2009, 18:40
Sono venuto a conoscenza del codice offuscato, purtroppo non trovo molte informazioni in rete e ho deciso di chiedere spiegazioni a voi.
So che si tratta di codice tipicamente scritto in C, allo scopo di confondere il lettore. So che esiste anche del codice Assembly offuscato. Quello che mi chiedo è in cosa consista l'offuscamento del codice; mi spiego, si tratta di scrivere il codice utile in maniera da renderne difficile l'interpretazione, o si tratta di scrivere porzioni non strettamente utili di codice insieme al codice utile in modo da renderne difficile la lettura?

A cosa serve offuscare il codice?
Eseguendo il reverse engineering di un binario ottenuto dalla compilazione di codice offuscato, si ottiene codice offuscato?
Se no, dov'è il vantaggio dell'offuscamento del codice?

cdimauro
15-11-2009, 21:09
Succede principalmente per due motivi. Il primo è che si fanno delle gare (http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest) per vedere chi riesce a tirare fuori programmi funzionanti aventi codice offuscato in modo "bello" (tipo che vengono fuori disegni, simmetrie o robe simili).

Il secondo motivo è che a volte i programmatori sono talmente scarsi nello scrivere codice, che gli viene fuori offuscato in maniera naturale. E questo dipende molto anche dal linguaggio di programmazione. Il C ti può portare a scrivere codice così compatto che diviene poco o per nulla leggibile. Poi ci sono linguaggi come Perl che sono naturalmente illeggibili. :asd:

kurts
15-11-2009, 22:19
Succede principalmente per due motivi. Il primo è che si fanno delle gare (http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest) per vedere chi riesce a tirare fuori programmi funzionanti aventi codice offuscato in modo "bello" (tipo che vengono fuori disegni, simmetrie o robe simili).

Il secondo motivo è che a volte i programmatori sono talmente scarsi nello scrivere codice, che gli viene fuori offuscato in maniera naturale. E questo dipende molto anche dal linguaggio di programmazione. Il C ti può portare a scrivere codice così compatto che diviene poco o per nulla leggibile. Poi ci sono linguaggi come Perl che sono naturalmente illeggibili. :asd:

lol

fero86
16-11-2009, 01:58
offuscare il codice nel senso piu comune dell'espressione non ha la benché minima utilitá pratica, serve solo in quei contest particolarissimi a cui ha fatto riferimento cdimauro.

esistono tuttavia alcune forme di offuscamento che hanno degli scopi di security by obscurity; ne conosco un paio. la prima si fa a livello di codice macchina (non di assembly) ed é attuabile solamente con le architetture Intel o in generale con tutte le architetture che non hanno una dimensione prefissata per le istruzioni (per esempio non é attuabile coi PowerPC); consiste nell'introdurre all'interno del codice macchina dei bytes "a cavolo" che disallineano tutto il codice seguente facendo capire ad un eventuale disassemblatore istruzioni completamente diverse; il motivo per cui invece la CPU esegue le istruzioni giuste é che c'é un JMP relativo che salta al byte giusto. naturalmente un hacker armato di tanta pazienza, dopo aver perso una marea di ore a capire istruzioni totalmente insensate, puó comunque notare quel JMP e quei bytes inutili e capire l'inghippo :D ed inoltre c'é la controindicazione che a volte le istruzioni dopo un tot si riallineano per caso; ah, e tra l'altro alcuni disassemblatori neanche ci cascano. quindi in definitiva non é un granché come tecnica peró almeno é facilissima da attuare.

l'altra forma di offuscamento, se cosi vogliamo chiamarla, con l'obiettivo della security by obscurity consiste nello scrivere algoritmi di protezione in Brainfuck o qualche altro linguaggio esoterico del genere :D
a scrivere un interprete di Brainfuck ci vogliono 30 minuti scarsi, a scrivere uno script in Brainfuck da includere nel programma finale ci vuole un po' di piu e per scrivere un altro programma che complica volutamente un programma Brainfuck esistente l'unico limite é la propria fantasia :asd:
il risultato é potenzialmente qualche decina di KB di codice Brainfuck che magari il programma finale esegue in pochi secondi, peró se l'hacker é veramente costretto a rompere quell'algoritmo puó dichiarare la resa :asd:

gbhu
16-11-2009, 12:22
Io ho sempre saputo che l'offuscamento del codice è una tecnica utilizzata per applicazioni java.
Infatti tale linguaggio viene compilato in uno pseudocodice che consente tramite reverse engineering di riprodurre in modo abbastanza semplice i sorgenti nativi, e questo può non essere gradito.
Per i linguaggi compilati in codice macchina il reverse engineering non è così semplice, mi pare.

fero86
16-11-2009, 12:43
Io ho sempre saputo che l'offuscamento del codice è una tecnica utilizzata per applicazioni java.
Infatti tale linguaggio viene compilato in uno pseudocodice che consente tramite reverse engineering di riprodurre in modo abbastanza semplice i sorgenti nativi, e questo può non essere gradito. giusto, esiste anche questa forma: offuscare un programma in bytecode significa cambiare tutti gli identificatori che ci sono rimasti dentro in maniera tale che una eventuale decompilazione produca del codice algoritmicamente identico all'originale ma pieno di nomi insignificanti o illeggibili. si fa sia per Java che per .NET.

tra l'altro alcuni offuscatori di bytecode non si limitano all'offuscamento ma cercano anche di ottimizzare il codice ed eliminare parti non necessarie.

M4rk191
16-11-2009, 14:57
Grazie per le risposte, mi avete chiarito i dubbi :D

Per quanto riguarda il brainfuck, avendo visto qualche pezzo di codice, ho immaginato fin da subito che si sarebbe potuto usare per scrivere codice relativamente sicuro dal punto di vista della leggibilità :asd:

Trovo molto ingegnoso l'offuscamento del linguaggio macchina, credo riesca a scoraggiare quasi tutti i tentativi di hacking.

Ho dato un'occhiata la link riguardante i conteste sono rimasto così :eek: guardando i codici d'esempio, soprattutto perché non sembrano avere una sintassi corretta. L'ultimo esempio è veramente una cosa pazzesca.

In conclusione, sarà anche inutile, ma sicuramente è molto curiosa quest'attività
:D

tomminno
16-11-2009, 19:06
offuscare il codice nel senso piu comune dell'espressione non ha la benché minima utilitá pratica, serve solo in quei contest particolarissimi a cui ha fatto riferimento cdimauro.


Che non è assolutamente vero.
In .NET è praticamente obbligatorio, pena la divulgazione totale dei sorgenti di un programma. Reflector non perdona.
E ci sono casi in cui viene fatto anche in C++, ad esempio se dai ad un cliente i "sorgenti" per ricompilarsi una libreria, se glieli passassi in chiaro è inutile.
A volte poi ci sono clienti che non pagano per i sorgenti ma che ne hanno bisogno per le certificazioni, ecco che gli dai il contentino e gli giri i codici offuscati (senza soluzione, nè dipendenze), ovvero un pò di file di testo del tutto inutilizzabili.

M4rk191
16-11-2009, 19:31
un pò di file di testo del tutto inutilizzabili.

questo ovviamente è relativo, perché a quanto ho capito, per quanto difficile è sempre possibile risalire al codice sorgente

fero86
16-11-2009, 21:02
In .NET è praticamente obbligatorio, pena la divulgazione totale dei sorgenti di un programma. Reflector non perdona. offuscare l'IL e offuscare il sorgente originale sono due cose diverse, io con quella frase mi riferivo al secondo caso.

fero86
16-11-2009, 21:04
questo ovviamente è relativo, perché a quanto ho capito, per quanto difficile è sempre possibile risalire al codice sorgente il codice sorgente offuscato é codice sorgente, non c'é nulla a cui risalire. piuttosto si puó dire che la sua comprensione e l'eventuale riuso/abuso di proprietá intellettuale puó richiedere risorse temporali molto piu elevate.

cdimauro
17-11-2009, 07:16
offuscare l'IL e offuscare il sorgente originale sono due cose diverse, io con quella frase mi riferivo al secondo caso.
Idem.

tomminno
17-11-2009, 08:28
offuscare l'IL e offuscare il sorgente originale sono due cose diverse, io con quella frase mi riferivo al secondo caso.

Guarda che per offuscare l'IL vengono prima offuscati i sorgenti e poi compilati, per generare un IL incomprensibile se guardato con Reflector o similari.

cdimauro
17-11-2009, 09:11
Lo si può fare anche soltanto a livello di IL.

M4rk191
17-11-2009, 09:23
il codice sorgente offuscato é codice sorgente, non c'é nulla a cui risalire. piuttosto si puó dire che la sua comprensione e l'eventuale riuso/abuso di proprietá intellettuale puó richiedere risorse temporali molto piu elevate.

ovviamente intendevo il codice sorgente originario ;)

tomminno
17-11-2009, 09:33
Lo si può fare anche soltanto a livello di IL.

Solo che così ti perdi la Reflection.

vhost87
17-11-2009, 09:56
Lo si può fare anche soltanto a livello di IL.

Si ma .Net lo fa da sorgente in su :) questo intende l'utente.

cdimauro
17-11-2009, 13:08
Solo che così ti perdi la Reflection.
Se non erro ci sono dei tool di offuscamento del bytecode per Java che ne tengono conto. Per l'IL penso si possa realizzare qualcosa di simile.

vhost87
17-11-2009, 18:10
Se non erro ci sono dei tool di offuscamento del bytecode per Java che ne tengono conto. Per l'IL penso si possa realizzare qualcosa di simile.

Ma qui si parla di .NET...

||ElChE||88
17-11-2009, 18:33
Ma qui si parla di .NET...
E secondo te IL cos'è?

vhost87
17-11-2009, 18:47
E secondo te IL cos'è?

Come sei arrogante nelle risposte, lasciatelo dire.

La mia risposta era riferita al riferimento (perdonatemi il gioco di parole) di cdimauro su Java, in quanto non ha senso parlare di Java, si parla di .Net ;)

Non so come avviene l'offuscamento del sorgente e dell'IL in .Net.

||ElChE||88
17-11-2009, 20:00
Come sei arrogante nelle risposte, lasciatelo dire.

La mia risposta era riferita al riferimento (perdonatemi il gioco di parole) di cdimauro su Java, in quanto non ha senso parlare di Java, si parla di .Net ;)
A dire il vero non sembra proprio così (soprattutto dopo aver letto il post prima di quello), ma se ti fa sentire meglio continua pure a darmi dell'arrogante. :D

vhost87
17-11-2009, 21:50
A dire il vero non sembra proprio così (soprattutto dopo aver letto il post prima di quello), ma se ti fa sentire meglio continua pure a darmi dell'arrogante. :D

L'importante è crederci. In ogni tuo intervento che leggo sul forum poni questioni con ironia e arroganza; ma tranquillo, sappiamo tutti che sei superiore alle tue stesse conoscenze. ;)

PS. non mi fa sentire meglio, mi fa solo pensare... :rolleyes: .
Torniamo in topic va.

||ElChE||88
17-11-2009, 21:55
Curioso il "Torniamo in topic va" alla fine del post, ma... non era meglio tornare in topic prima? Ha un non so che di ipocrita così... :D

vhost87
17-11-2009, 22:01
Curioso il "Torniamo in topic va" alla fine del post, ma... non era meglio tornare in topic prima? Ha un non so che di ipocrita così... :D

Va bene, hai ragione.
Se può interessare, all'autore del topic e tutti gli interessati ovviamente, questo link (http://msdn.microsoft.com/it-it/library/ms227212.aspx)
:)

||ElChE||88
17-11-2009, 22:13
link (http://msdn.microsoft.com/it-it/library/ms227212.aspx)
Non è male Dotfuscator... anche se la versione in bundle con VS è abbastanza limitata.

vhost87
17-11-2009, 22:20
Non è male Dotfuscator... anche se la versione in bundle con VS è abbastanza limitata.

Già; esistono delle soluzioni commerciali decisamente migliori, ma costano non poco (non che Visual Studio sia gratis... per intenderci!).

||ElChE||88
17-11-2009, 22:24
(non che Visual Studio sia gratis... per intenderci!).
Se sei uno studente... lo è: https://www.dreamspark.com/default.aspx

vhost87
18-11-2009, 05:45
Se sei uno studente... lo è: https://www.dreamspark.com/default.aspx

Che pro ha offuscare un codice uno studente che non può usarlo per fini commerciali? Nessuno...

cionci
18-11-2009, 07:22
Per favore, cerchiamo di rimanere in topic e limitare i battibecchi.
Grazie