par
@rthur » 10 janv. 2008, 01:21
Par ailleurs, je pense qu'on a un problème de définition...
Pour réduire la taille d'un code informatique on fait de la compression (en retirant les espaces inutiles ou en diminuant la taille des noms de fonctions/variables) ou de la factorisation de code... même si ça peut y ressembler, ça n'a rien à voir avec l'obfuscation.
L'
obfuscation de code n'a pas pour objectif de réduire sa taille. C'est d'ailleurs même souvent l'inverse où l'obfuscateur va ressortir un code plus verbeux en rajoutant des fonctions qui ne servent à rien, juste pour embrouiller les pistes...

Le
seul objectif de l'obfuscation est de
rendre illisible un code source afin qu'il ne puisse pas être réutilisé par d'autres facilement...
Si vous n'en êtes pas convaincu, je vous renvoie à la définition Wikipédia:
http://en.wikipedia.org/wiki/Obfuscated_code
Enfin, comme un exemple est toujours plus parlant, voici un code javascript (850 caractères; 648 sans les commentaires):
Code : Tout sélectionner
// Cette fonction permet de retourner le nom de l'objet en paramètre
function OBJNAME(n) { return n; }
// Cette fonction affiche dans la page le paramètre str
function dw(str) { document.write(str); }
// Fonction affichant un objet dans une table HTML
function dumptbl(obj,row_callback_str,cell_callback_str)
{
dw('<table border=1>');
for(var i=0;i<obj.length;++i)
{
var tr = '<tr>';
eval(row_callback_str);
dw(tr);
for(var j=0;j<obj[i].length;++j)
{
var td_s = '<td>', td_e = '</td>';
eval(cell_callback_str);
dw(td_s); dw(obj[i][j]); dw(td_e);
}
}
dw('</table>');
}
dumptbl([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]],
OBJNAME('tr') + "= '<tr style=\"background: ' + ( "
+ OBJNAME('i') + '%2 ? "red" : "yellow") + \'">\';',
"");
Et voici après
obfuscation exactement le même code (c'est à dire qu'il aura le même comportement dans le navigateur web):
Code : Tout sélectionner
function z8c231aa888(z14851c4b0f){return z14851c4b0f;}function z0ab1f0a49e(
z0721975593){document.write(z0721975593);}function zcd8c17c79d(z4716861143,
z500f443098,z9bc82e0042){z0ab1f0a49e(
"\x3c\x74\x61\x62\x6c\x65\x20\x62\x6f\x72\x64\x65\x72\x3d\x31\x3e");for(var
zd1ea46315e=(0x8e9+2039-0x10e0);zd1ea46315e<z4716861143.length;++zd1ea46315e){
var z708eb69ac7="\x3c\x74\x72\x3e";eval(z500f443098);z0ab1f0a49e(z708eb69ac7);
for(var z2d29194d43=(0x139b+2094-0x1bc9);z2d29194d43<z4716861143[zd1ea46315e].
length;++z2d29194d43){var z23b8891aeb="\x3c\x74\x64\x3e",z7f5411ee29=
"\x3c\x2f\x74\x64\x3e";eval(z9bc82e0042);z0ab1f0a49e(z23b8891aeb);z0ab1f0a49e(
z4716861143[zd1ea46315e][z2d29194d43]);z0ab1f0a49e(z7f5411ee29);}}z0ab1f0a49e(
"\x3c\x2f\x74\x61\x62\x6c\x65\x3e");}zcd8c17c79d([[(0x2d7+5314-0x1798),
(0xf7c+295-0x10a1),(0x900+1599-0xf3c)],[(0x1e8+1063-0x60b),(0xfc1+580-0x1200),
(0x1cf5+1843-0x2422)],[(0x9f9+4410-0x1b2c),(0x1c6+8452-0x22c2),
(0x28a+2774-0xd57)],[(0xcc0+2614-0x16ec),(0x7ee+1483-0xdae),(0xab2+6657-0x24a7)]
,[(0xa14+2966-0x159d),(0x63c+7549-0x23ab),(0x7e2+5079-0x1baa)],[
(0x14bc+296-0x15d4),(0x720+6090-0x1ed9),(0xfba+3045-0x1b8d)]],
"\x7a\x37\x30\x38\x65\x62\x36\x39\x61\x63\x37"+
"\x3d\x20\x27\x3c\x74\x72\x20\x73\x74\x79\x6c\x65\x3d\x22\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x20\x27\x20\x2b\x20\x28\x20"
+"\x7a\x64\x31\x65\x61\x34\x36\x33\x31\x35\x65"+
"\x25\x32\x20\x3f\x20\x22\x72\x65\x64\x22\x20\x3a\x20\x22\x79\x65\x6c\x6c\x6f\x77\x22\x29\x20\x2b\x20\x27\x22\x3e\x27\x3b"
,"");Le code obfusqué fait alors 1533 caractères...
Alors effectivement, il existe des softs de dé-obfuscation mais le résultat n'est jamais très probant (expérience inside). Rien que le fait de perdre tous les commentaires, les noms de fonctions et les noms de variables, ça rends le rétro-engineering très complexe...

Par ailleurs, je pense qu'on a un problème de définition... :-k
Pour réduire la taille d'un code informatique on fait de la compression (en retirant les espaces inutiles ou en diminuant la taille des noms de fonctions/variables) ou de la factorisation de code... même si ça peut y ressembler, ça n'a rien à voir avec l'obfuscation.
L'[b]obfuscation de code [color=red]n'a pas[/color][/b] pour objectif de réduire sa taille. C'est d'ailleurs même souvent l'inverse où l'obfuscateur va ressortir un code plus verbeux en rajoutant des fonctions qui ne servent à rien, juste pour embrouiller les pistes...
:arrow: Le [b]seul[/b] objectif de l'obfuscation est de [b]rendre illisible un code source[/b] afin qu'il ne puisse pas être réutilisé par d'autres facilement...
Si vous n'en êtes pas convaincu, je vous renvoie à la définition Wikipédia: :idea:
http://en.wikipedia.org/wiki/Obfuscated_code
Enfin, comme un exemple est toujours plus parlant, voici un code javascript (850 caractères; 648 sans les commentaires):
[code]// Cette fonction permet de retourner le nom de l'objet en paramètre
function OBJNAME(n) { return n; }
// Cette fonction affiche dans la page le paramètre str
function dw(str) { document.write(str); }
// Fonction affichant un objet dans une table HTML
function dumptbl(obj,row_callback_str,cell_callback_str)
{
dw('<table border=1>');
for(var i=0;i<obj.length;++i)
{
var tr = '<tr>';
eval(row_callback_str);
dw(tr);
for(var j=0;j<obj[i].length;++j)
{
var td_s = '<td>', td_e = '</td>';
eval(cell_callback_str);
dw(td_s); dw(obj[i][j]); dw(td_e);
}
}
dw('</table>');
}
dumptbl([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]],
OBJNAME('tr') + "= '<tr style=\"background: ' + ( "
+ OBJNAME('i') + '%2 ? "red" : "yellow") + \'">\';',
"");[/code]
Et voici après [b]obfuscation[/b] [u]exactement le même code[/u] (c'est à dire qu'il aura le même comportement dans le navigateur web):[code] function z8c231aa888(z14851c4b0f){return z14851c4b0f;}function z0ab1f0a49e(
z0721975593){document.write(z0721975593);}function zcd8c17c79d(z4716861143,
z500f443098,z9bc82e0042){z0ab1f0a49e(
"\x3c\x74\x61\x62\x6c\x65\x20\x62\x6f\x72\x64\x65\x72\x3d\x31\x3e");for(var
zd1ea46315e=(0x8e9+2039-0x10e0);zd1ea46315e<z4716861143.length;++zd1ea46315e){
var z708eb69ac7="\x3c\x74\x72\x3e";eval(z500f443098);z0ab1f0a49e(z708eb69ac7);
for(var z2d29194d43=(0x139b+2094-0x1bc9);z2d29194d43<z4716861143[zd1ea46315e].
length;++z2d29194d43){var z23b8891aeb="\x3c\x74\x64\x3e",z7f5411ee29=
"\x3c\x2f\x74\x64\x3e";eval(z9bc82e0042);z0ab1f0a49e(z23b8891aeb);z0ab1f0a49e(
z4716861143[zd1ea46315e][z2d29194d43]);z0ab1f0a49e(z7f5411ee29);}}z0ab1f0a49e(
"\x3c\x2f\x74\x61\x62\x6c\x65\x3e");}zcd8c17c79d([[(0x2d7+5314-0x1798),
(0xf7c+295-0x10a1),(0x900+1599-0xf3c)],[(0x1e8+1063-0x60b),(0xfc1+580-0x1200),
(0x1cf5+1843-0x2422)],[(0x9f9+4410-0x1b2c),(0x1c6+8452-0x22c2),
(0x28a+2774-0xd57)],[(0xcc0+2614-0x16ec),(0x7ee+1483-0xdae),(0xab2+6657-0x24a7)]
,[(0xa14+2966-0x159d),(0x63c+7549-0x23ab),(0x7e2+5079-0x1baa)],[
(0x14bc+296-0x15d4),(0x720+6090-0x1ed9),(0xfba+3045-0x1b8d)]],
"\x7a\x37\x30\x38\x65\x62\x36\x39\x61\x63\x37"+
"\x3d\x20\x27\x3c\x74\x72\x20\x73\x74\x79\x6c\x65\x3d\x22\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x3a\x20\x27\x20\x2b\x20\x28\x20"
+"\x7a\x64\x31\x65\x61\x34\x36\x33\x31\x35\x65"+
"\x25\x32\x20\x3f\x20\x22\x72\x65\x64\x22\x20\x3a\x20\x22\x79\x65\x6c\x6c\x6f\x77\x22\x29\x20\x2b\x20\x27\x22\x3e\x27\x3b"
,"");[/code]Le code obfusqué fait alors 1533 caractères...
Alors effectivement, il existe des softs de dé-obfuscation mais le résultat n'est jamais très probant (expérience inside). Rien que le fait de perdre tous les commentaires, les noms de fonctions et les noms de variables, ça rends le rétro-engineering très complexe... :twisted: