In programmazione, l'offuscamento del codice è l'atto di creare deliberatamente codice sorgente difficile da comprendere per un lettore umano. L'offuscamento può avere diverse motivazioni:
- la volontà di proteggere la proprietà intellettuale rendendo difficile il reverse engineering e il riutilizzo non autorizzato del proprio codice da parte di terzi;
- rendere più difficile la modifica malevola del codice, come l'inserimento di malware o la realizzazione di crack;
- rendere più difficili azioni di violazione della licenza d'uso, come la creazione di keygen;
- a scopo ricreativo, per creare rompicapo destinati alla comunità dei programmatori.
L'offuscamento può essere realizzato direttamente dal programmatore o introdotto attraverso un offuscatore, ovvero un programma specificatamente progettato per modificare il codice sorgente introducendo variazioni che ne complicano la lettura.
Offuscatori
[modifica | modifica wikitesto]Esistono una grande varietà di programmi di offuscamento ("offuscatori"), che variano da strumenti accademici e open source a prodotti commerciali, per molti linguaggi, inclusi JavaScript,[1] PHP,[2] Java,[3], .NET,[4][5], e C/C++[6][7].
Esistono anche alcuni deoffuscatori, ovvero strumenti che tentano di eseguire le trasformazioni inverse rispetto a quelle tipicamente attuate dagli offuscatori.
Offuscamento a scopo ricreativo
[modifica | modifica wikitesto]Scrivere (e comprendere) codice offuscato può essere inteso come un genere di rompicapo per programmatori. Esistono un certo numero di gare internazionali che premiano gli esempi più creativi di offuscamento: fra i più noti si possono citare l'International Obfuscated C Code Contest, l'Obfuscated Perl Contest, e l'International Obfuscated Ruby Code Contest.
Frammenti di codice offuscato in modo creativo possono essere introdotti nel codice da programmatori per svolgere la funzione di una sorta di "firma".
Esempi
[modifica | modifica wikitesto]Il seguente programma C, scritto da Ian Phillips, ha vinto l'International Obfuscated C Code Contest nel 1988.[8] Il programma (insospettabilmente) stampa a video i 12 versi della canzone Twelve Days of Christmas.
/*
LEAST LIKELY TO COMPILE SUCCESSFULLY:
Ian Phillipps, Cambridge Consultants Ltd., Cambridge, England
*/
#include <stdio.h>
main(t,_,a)
char
*
a;
{
return!
0<t?
t<3?
main(-79,-13,a+
main(-87,1-_,
main(-86, 0, a+1 )
+a)):
1,
t<_?
main(t+1, _, a )
:3,
main ( -94, -27+t, a )
&&t == 2 ?_
<13 ?
main ( 2, _+1, "%s %d %d\n" )
:9:16:
t<0?
t<-72?
main( _, t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;\
#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;\
q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; \
r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\
\
n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;\
{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\
#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:
t<-50?
_==*a ?
putchar(31[a]):
main(-65,_,a+1)
:
main((*a == '/') + t, _, a + 1 )
:
0<t?
main ( 2, 2 , "%s")
:*a=='/'||
main(0,
main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry")
,a+1);}
Offuscamento e licenze copyleft
[modifica | modifica wikitesto]Il rilascio di codice offuscato in licenza copyleft è stato oggetto di controversia, in quanto l'offuscamento ostacola (o rende impossibile) la riusabilità del codice da parte di terzi prevista esplicitamente da questo tipo di licenze. Il consenso generale sul tema è che il rilascio di codice offuscato in copyleft non sia tecnicamente una violazione dei requisiti della licenza, pur qualificandosi come non eticamente corretto. In seguito a questa discussione, il testo della GNU General Public License è stato modificato aggiungendo la nota secondo cui la versione del codice reso disponibile deve essere quella preferibile (cioè, quella non offuscata).[9]
Note
[modifica | modifica wikitesto]- ^ Open Directory - Computers: Programming: Languages: JavaScript: Tools: Obfuscators
- ^ Open Directory - Computers: Programming: Languages: PHP: Development Tools: Obfuscation and Encryption
- ^ Open Directory - Computers: Programming: Languages: Java: Development Tools: Obfuscators
- ^ Open Directory - Computers: Programming: Component Frameworks: .NET: Tools: Obfuscators
- ^ GuardIT for .NET, su arxan.com. URL consultato il 17 gennaio 2013 (archiviato dall'url originale il 18 agosto 2012).
- ^ Cloakware Application Security Archiviato il 25 maggio 2011 in Internet Archive.
- ^ Morpher - Compiler Driven Obfuscation
- ^ "International Obfuscated C Code Winners 1988 - Least likely to compile successfully", su ioccc.org. URL consultato il 17 gennaio 2013 (archiviato dall'url originale il 9 aprile 2009).
- ^ Reasoning behind the "preferred form" language in the GPL [LWN.net]