samedi 5 mai 2012

Interpréter du Javascript avec Chome v8 en console

Il existe différentes façons d'interpréter du Javascript.
Par exemple dans le cas d'une chaîne qui a été encodée avec un appel à escape(), on aimerait retrouver la chaîne originale.

Appel à alert()

Celle qui demande le moins de modification, consiste à ajouter un appel à alert() dans le code source de la page à la place de eval() si il y en a un, et de recharger la page:
eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));

devient
alert(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));

 Et on obtient le code dechiffré dans une fenêtre modale du navigateur. Ce n'est pas forcément très propre mais c'est la méthode la plus rapide et elle va marcher partout.

Document.write()

Au lieu de eval(), on peut modifier le DOM et écrire le texte dans le document lui-même.
Il vaut mieux dans ce cas, extraire juste la partie du code qui pose problème, et créer un document complet vierge.

<html>
<head>
<title>Exemple de document.write</title>

<script type="text/javascript">

function nouveauContenu()
{
document.open();
document.write(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;"));
document.close();
}

</script>
</head>

<body onload="nouveauContenu();">
<p>Ceci est le contenu original du document.</p>
</body>
</html>

Ardoise Javascript


Firefox contient un évaluateur Javascript dans outil/Développeur Web.
Il suffit de coller le code incriminé dedans et faire:

Exécuter, puis afficher.

L'interprétation du code est faite, et le résultat est écrit entouré par des commentaires.

Chrome v8 et l'interpréteur d8

Google Chrome fournit le code source de son interpréteur v8, et il est possible avec le programme d8, d'interpréter du Javascript dans une console.

Installation de Chome d8:
svn co http://v8.googlecode.com/svn/trunk v8-trunk
scons console=readline d8

./d8
V8 version 3.10.8.3 [console: readline]
d8> quit()

On a maintenant le programme d8 que l'on peut utiliser pour interpréter  du Javascript dans un terminal:
echo "write(3*7);" | ./d8 
V8 version 3.10.8.3 [console: readline]
21

Have fun!

vendredi 4 mai 2012

Copier du HTML protégé avec HTML Guard



Vers la fin des années 90, il était de coutume d'essayer de protéger les articles que l'on avait passé du temps à écrire, pour éviter de se faire piller. Cela semblait une bonne idée d'empêcher l'utilisateur d'interagir avec la page avec des Clics droits/copier, tout sélectionner.

Certains ont donc eu la merveilleuse idée de créer le DOM (le texte que l'on voit affiché pour simplifier) de façon dynamique en Javascript, et de modifier les handlers d'événement pour empêcher l'utilisateur d'interagir de façon classique avec la page. C'est aussi l'époque des plugins Netscape pour Windows qui permettaient d'afficher des images, mais apparaissaient comme gris lors d'une capture d'écran. On pourrait croire cette époque révolue, mais il existe encore certains qui y croient; enfin de façon modérée à en croire leurs propres propos:

Before applying HTML Guard's encrypting functions, you should be aware that these can have a negative effect on your site's search engine ranking. The encryption of your source code not only makes it unreadable for human eyes, but also keeps search engines from indexing its content. You should therefore apply encryption only after due consideration, and only on the pages and regions that you definitely want to conceal.

C'est certain qu'avec cette méthode, personne ne va copier votre texte, car personne ne va le voir!

En effet, aujourd'hui ça serait complètement absurde de montrer aux moteurs de recherche du Javascript qui génère du contenu, au lieu du contenu lui-même. Cela condamne la page à ne jamais être indexée.
Il est possible que le bot de Google interprète un peu la page pour avoir le rendu final même si c'ets peu probable; mais dans tous les cas c'est une forme de cloacking, donc un signal négatif.

Analysons cette petite merveille de code.
$ wget http://htmlguard.com/sample.html

Si l'on ouvre cet fichier avec un éditeur HTML, Aptana par exemple, on voit une première protection, certes ridicule, mais existante: la totalité du texte est en bloc non indenté, au milieu du fichier, avec 250 retours chariots avant et après, et des espaces blancs pour faire croire à une sorte de magie.. Genre, il n'y a PAS de code source. On dirait que l'auteur a suivi des cours de cryptologie sur Le Site du Zéro, le site où des professeurs de 13 ans enseignent à des élèves de 12 ans, car comme ils le pensent, dès que l'on sait quelque chose, même si ce savoir se résume à une ligne, il est de leur devoir d'écrire un "cours", avec des "TP", ou un "tutoriel", rempli d'astuces nazes et parfois fausses ou dangereuses, tout en inventant des termes là où il existe déjà une nomenclature bien définie. Bref..

Fichier initial:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>HTML Guard Sample Page</title><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><link href="style.css" rel="stylesheet" type="text/css" media="all" /> <script type="text/javascript"><!--
a92g=document.all;dfqw=a92g&&!document.getElementById;nmia=a92g&&document.getElementById;x9oq=!a92g&&document.getElementById;p3hs=document.layers;if(window.location.protocol=="file:"){document.location="about:blank";try{alert(unescape("This page is protected and can only be displayed from its original address."));}catch(e){}}function o90e(){try{return top.location.hostname;}catch(e){return "";}}if(document.getElementById){iou8=o90e();}else{iou8=top.location.hostname;}if(document.location.hostname.toLowerCase()!=iou8.toLowerCase()){top.location.href=self.location.href;}function hy1f(g5zs){try{if(dfqw)alert("");}catch(e){}if(g5zs&&g5zs.stopPropagation)g5zs.stopPropagation();return false;}function avnd(){if(event.button==2||event.button==3)hy1f();}function woya(e){return(e.which==3)?hy1f():true;}if(nmia||x9oq){document.oncontextmenu=hy1f;}else if(dfqw){document.onmousedown=avnd;}else if(p3hs){window.captureEvents(Event.MOUSEDOWN);window.onmousedown=woya;}function vxc8(e){r8zq=e.srcElement!=null?e.srcElement.tagName:"";if(r8zq!="INPUT"&&r8zq!="TEXTAREA"&&r8zq!="BUTTON"){return false;}}function akpk(){return false}if(a92g){document.onselectstart=vxc8;document.ondragstart=akpk;}if(document.addEventListener){document.addEventListener('copy',function(e){r8zq=e.target.tagName;if(r8zq!="INPUT"&&r8zq!="TEXTAREA"){e.preventDefault();}},false);}function c69c(){window.status=" ";return true;}function NN4ClearStatusBar(){c69c();setTimeout("NN4ClearStatusBar()",50);};if(a92g||x9oq){document.onmouseover=c69c;}else{NN4ClearStatusBar();}function l80v(evt){if(evt.preventDefault){evt.preventDefault();}else{evt.keyCode=37;evt.returnValue=false;}}var fv31=1;var eoas=2;var ecal=4;var ggps=new Array();ggps[0]=new Array(eoas,65);ggps[1]=new Array(eoas,67);ggps[2]=new Array(eoas,80);ggps[3]=new Array(eoas,83);ggps[4]=new Array(eoas,85);ggps[5]=new Array(fv31|eoas,73);ggps[6]=new Array(fv31|eoas,74);ggps[7]=new Array(fv31,121);ggps[8]=new Array(0,123);function v3wg(evt){evt=(evt)?evt:((event)?event:null);if(evt){var jg5c=evt.keyCode;if(!jg5c&&evt.charCode){jg5c=String.fromCharCode(evt.charCode).toUpperCase().charCodeAt(0);}for(var ou9v=0;ou9v<ggps.length;ou9v++){if((evt.shiftKey==((ggps[ou9v][0]&fv31)==fv31))&&((evt.ctrlKey|evt.metaKey)==((ggps[ou9v][0]&eoas)==eoas))&&(evt.altKey==((ggps[ou9v][0]&ecal)==ecal))&&(jg5c==ggps[ou9v][1]||ggps[ou9v][1]==0)){l80v(evt);break;}}}}if(document.addEventListener){document.addEventListener("keydown",v3wg,true);document.addEventListener("keypress",v3wg,true);}else if(document.attachEvent){document.attachEvent("onkeydown",v3wg);}
--></script> <meta http-equiv="imagetoolbar" content="no" /><link rel="stylesheet" type="text/css" href="_nil.css" /><style type="text/css"><!-- input,textarea{-moz-user-select:text;-khtml-user-select:auto} *{-moz-user-select:-moz-none;-khtml-user-select:none;user-select:none} --></style><style type="text/css" media="print"><!-- body{display:none} --></style> <!--[if gte IE 5]><frame></frame><![endif]--></head><body><script type="text/javascript"><!--
function mzjy(ojd0){var
vkvv="",ivfl,m898,ih22,qdmc="O{_S,j/=(ah p\"f28-k5q\nWTl&H©PAr)x:M0s\r1Len.imocDt7w>NFUYGu;dy9g4v}bCK<",a3mo=qdmc.length;eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));for(ih22=0;ih22<ojd0.length;ih22++){m898=ojd0.charAt(ih22);ivfl=qdmc.indexOf(m898);if(ivfl>-1){ivfl-=(ih22+1)%a3mo;if(ivfl<0){ivfl+=a3mo;}xufh(qdmc.charAt(ivfl));}else{xufh(m898);}}eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;"));}mzjy("O9cK87b2Wyn\n&HYcr<r5h}-0K2MnnLT_0phtw51cr2\r&Gos\ni9lnyC))PsA)LjmjvYeghiya8fo2btLTgTpud(PU7bP0bKMkCv0U/l(/D=A>wqf)\nUNdg4.4ggT©Db0}_jhj,S5m, &T0nfyg2\rCq©Wa;Hj©otvK9K{COC1.,y.USr{a2(jFNtlYmGgA(ryp.}0APAx)FS2M9xecL AxtNoNY>U>hkTAb©8ji)v r\rb0\n{\nLaj(jt-t\r4\"WnNYY/-gG4lT.l-PCs:f,i5LLsb,(>O(©DG-/xN\nusWw>Trv/w>gv_©1sq<x,hS(t-sDww{pu>;0-H;Tjk&v:r {e\r)e_\r5xb,(>O(©DG-/xN9h\nlloG)&xab_vtO08OL(jGc2p -a42w).wU©cUSTx4N(P\rGCOO\nx={(n©uLrip>tA5;(L<>.GY=2T©O5©cbjs&>{hAeiivjwm>F79fFW5OyAN\r4vPf:Y4CedC8so/}\nnw<h\"\"Moqf\nk/G<98_NdPCvo0,F\n{f/efC)Li80igp\nNn7)<©;DYLlcM}UorNO:w</\rsx\rcp>p{\".Ga8N\nM>TnT=GP-Yxr4,sY{jKj({\nmr&D49SaNPrFj0cU2gyTMF9b&LOdC>s;c}4Phc& Lep5Fx75n&lqb2/9\")v r\r9<8K&L9Mu,7fw5wLr2\rY\nOGf2uvkHi&Nxq_n_9N\rd=iW(s\ra8Nwkqd(8OY=}H2/9\")Ccxy9:e<1lm\"m:Wyk71vfT.FGG=k4uvnTxvA l)OLs-=c&4iGtpPH1m-4}keO 5Tb2T.g{x\nDC/&sLLy{ceD7/c8HO (2UTq{9r:\n9)n2HTu}<.9<k1D(CTiN{p22sDW8TD;iUYuFPvKuv:_<weax/9_Sj{cp8jLD>li>OqAy7j&vra}TlbS\r7Tl0\roO a4.jDFc>\nyaqTTmYrl)YA}MDvCsj_Fip0.(Dy=7C7:p.wU©cUSTx4N(P\rGCOO\nx={(c==D_7DjwwDi>KwnUTgder<.rv42ys _2e:n=q;lD0afqetN&mN{\nr9w/H0U}KK5rj</.0xonio.opPnt-GFMl4sU>vygv9v)Dys>s_nk.9\"i}&S\ro7Wn7Kk©;DY\rj:vF9orNe{yKN\rdD(CjdmbU2,}w_qFO5H;ld;)O)qx10{wsv}\rmc/v{fw5.72UCfG,Ge57ugK0bY<LpOMP,\r)=/a0aof©m8k8O7\ndWWgHHHUr89gv0\rG_/</a_WoW_ha)>C}=\"GxMuaLT>dbsYc)F{M>O=)jnhTeSoD\"Ccqd(FY,lwogl)gvrf4y)1Oy<USl/ttDcg-DUYUwHoF\rWmx4Nbsax<\rr©e,UeF©amw.\"2\"Cci5dFdWle1wGAj=rNpPs&sLLy{ceDl -a42w)7U\rp-HsgTW2lK\r:pxsaSSM&sb,(>pwt2v>u7:Yq{lg&GPx/mopM1pCS/_j_nuol/ \"wM _a-q-5DYgx>diPw1<;G\nSLk,x:jpc&.pMk-\"d(8OY=}H2/9\")v r\r\r05K)H/h aa7k\roAfslYm0q.yTedbKr)0P5S.Sg>5D(CTiN<t8}swO5;WLlN/=:0MYd\rMTM\r\r;<m1oip\"tOmoq\nW2lxO9flvAlAAAgO<\r<\nU:._a<vTa.q8Y©4)WoY&ypqlC8li4_:WtK=H\ree9_DnttC :7-xohTY&kTqWr&v:r {ek\n0uSnG({Da7.DmcU/fk9hk\rub©8.g)Ccxy9:eN1baof:mDDKaUtYCf\rY{wq&A&Al©b0x\"S.):G,q(wmtmtiS 2;=2MU4l\"\nSn<r5© bk/\rHMkS&\"m");
--></script><noscript><p>To display this page you need a browser that supports JavaScript.</p></noscript><script type="text/javascript">
var gaJsHost=(("https:"==document.location.protocol)?"https://ssl.":"http://www.");document.write(unescape("%3Cscript src='"+gaJsHost+"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script><script type="text/javascript"><!--
mzjy("p{Lw075Gq;{lF\nPvuwCHH)-:9_u{n(m\"OY\"b©L:7{FYF\r8O(;H<W\"9utbs)gFxn-&ji8Lra2u:WYK<DHr©rNPDjrPp9oF:{mC;{xag.hFvcraMfpTN/M.l;P©g9l28kdUdCPLl1(o7");
--></script><noscript><p>To display this page you need a browser that supports JavaScript.</p></noscript></body></html>


Donc ce fichier, on commence par le nettoyer avec tidy Cela permet d'y voir tout de suite un peu plus clair.
Voici le résultat:


$ tidy sample.html > sample.tidied.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 15.6), see www.w3.org" />
<meta http-equiv="Content-Type" content=
"text/html; charset=us-ascii" />
<title>HTML Guard Sample Page</title>
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<link href="style.css" rel="stylesheet" type="text/css" media=
"all" />
<script type="text/javascript">
//<![CDATA[
<!--
a92g=document.all;dfqw=a92g&&!document.getElementById;nmia=a92g&&document.getElementById;x9oq=!a92g&&document.getElementById;p3hs=document.layers;if(window.location.protocol=="file:"){document.location="about:blank";try{alert(unescape("This page is protected and can only be displayed from its original address."));}catch(e){}}function o90e(){try{return top.location.hostname;}catch(e){return "";}}if(document.getElementById){iou8=o90e();}else{iou8=top.location.hostname;}if(document.location.hostname.toLowerCase()!=iou8.toLowerCase()){top.location.href=self.location.href;}function hy1f(g5zs){try{if(dfqw)alert("");}catch(e){}if(g5zs&&g5zs.stopPropagation)g5zs.stopPropagation();return false;}function avnd(){if(event.button==2||event.button==3)hy1f();}function woya(e){return(e.which==3)?hy1f():true;}if(nmia||x9oq){document.oncontextmenu=hy1f;}else if(dfqw){document.onmousedown=avnd;}else if(p3hs){window.captureEvents(Event.MOUSEDOWN);window.onmousedown=woya;}function vxc8(e){r8zq=e.srcElement!=null?e.srcElement.tagName:"";if(r8zq!="INPUT"&&r8zq!="TEXTAREA"&&r8zq!="BUTTON"){return false;}}function akpk(){return false}if(a92g){document.onselectstart=vxc8;document.ondragstart=akpk;}if(document.addEventListener){document.addEventListener('copy',function(e){r8zq=e.target.tagName;if(r8zq!="INPUT"&&r8zq!="TEXTAREA"){e.preventDefault();}},false);}function c69c(){window.status=" ";return true;}function NN4ClearStatusBar(){c69c();setTimeout("NN4ClearStatusBar()",50);};if(a92g||x9oq){document.onmouseover=c69c;}else{NN4ClearStatusBar();}function l80v(evt){if(evt.preventDefault){evt.preventDefault();}else{evt.keyCode=37;evt.returnValue=false;}}var fv31=1;var eoas=2;var ecal=4;var ggps=new Array();ggps[0]=new Array(eoas,65);ggps[1]=new Array(eoas,67);ggps[2]=new Array(eoas,80);ggps[3]=new Array(eoas,83);ggps[4]=new Array(eoas,85);ggps[5]=new Array(fv31|eoas,73);ggps[6]=new Array(fv31|eoas,74);ggps[7]=new Array(fv31,121);ggps[8]=new Array(0,123);function v3wg(evt){evt=(evt)?evt:((event)?event:null);if(evt){var jg5c=evt.keyCode;if(!jg5c&&evt.charCode){jg5c=String.fromCharCode(evt.charCode).toUpperCase().charCodeAt(0);}for(var ou9v=0;ou9v<ggps.length;ou9v++){if((evt.shiftKey==((ggps[ou9v][0]&fv31)==fv31))&&((evt.ctrlKey|evt.metaKey)==((ggps[ou9v][0]&eoas)==eoas))&&(evt.altKey==((ggps[ou9v][0]&ecal)==ecal))&&(jg5c==ggps[ou9v][1]||ggps[ou9v][1]==0)){l80v(evt);break;}}}}if(document.addEventListener){document.addEventListener("keydown",v3wg,true);document.addEventListener("keypress",v3wg,true);}else if(document.attachEvent){document.attachEvent("onkeydown",v3wg);}
-->
//]]>
</script>
<meta http-equiv="imagetoolbar" content="no" />
<link rel="stylesheet" type="text/css" href="_nil.css" />
<style type="text/css">
/*<![CDATA[*/
<!-- input,textarea{-moz-user-select:text;-khtml-user-select:auto} *{-moz-user-select:-moz-none;-khtml-user-select:none;user-select:none} -->
/*]]>*/
</style>

<style type="text/css" media="print">
/*<![CDATA[*/
<!-- body{display:none} -->
/*]]>*/
</style>
<!--[if gte IE 5]><frame></frame><![endif]-->
</head>
<body>
<script type="text/javascript">
//<![CDATA[
<!--
function mzjy(ojd0){var
vkvv="",ivfl,m898,ih22,qdmc="O{_S,j/=(ah p\"f28-k5q\nWTl&H©PAr)x:M0s\r1Len.imocDt7w>NFUYGu;dy9g4v}bCK<",a3mo=qdmc.length;eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));for(ih22=0;ih22<ojd0.length;ih22++){m898=ojd0.charAt(ih22);ivfl=qdmc.indexOf(m898);if(ivfl>-1){ivfl-=(ih22+1)%a3mo;if(ivfl<0){ivfl+=a3mo;}xufh(qdmc.charAt(ivfl));}else{xufh(m898);}}eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;"));}mzjy("O9cK87b2Wyn\n&HYcr<r5h}-0K2MnnLT_0phtw51cr2\r&Gos\ni9lnyC))PsA)LjmjvYeghiya8fo2btLTgTpud(PU7bP0bKMkCv0U/l(/D=A>wqf)\nUNdg4.4ggT©Db0}_jhj,S5m, &T0nfyg2\rCq©Wa;Hj©otvK9K{COC1.,y.USr{a2(jFNtlYmGgA(ryp.}0APAx)FS2M9xecL AxtNoNY>U>hkTAb©8ji)v r\rb0\n{\nLaj(jt-t\r4\"WnNYY/-gG4lT.l-PCs:f,i5LLsb,(>O(©DG-/xN\nusWw>Trv/w>gv_©1sq<x,hS(t-sDww{pu>;0-H;Tjk&v:r {e\r)e_\r5xb,(>O(©DG-/xN9h\nlloG)&xab_vtO08OL(jGc2p -a42w).wU©cUSTx4N(P\rGCOO\nx={(n©uLrip>tA5;(L<>.GY=2T©O5©cbjs&>{hAeiivjwm>F79fFW5OyAN\r4vPf:Y4CedC8so/}\nnw<h\"\"Moqf\nk/G<98_NdPCvo0,F\n{f/efC)Li80igp\nNn7)<©;DYLlcM}UorNO:w</\rsx\rcp>p{\".Ga8N\nM>TnT=GP-Yxr4,sY{jKj({\nmr&D49SaNPrFj0cU2gyTMF9b&LOdC>s;c}4Phc& Lep5Fx75n&lqb2/9\")v r\r9<8K&L9Mu,7fw5wLr2\rY\nOGf2uvkHi&Nxq_n_9N\rd=iW(s\ra8Nwkqd(8OY=}H2/9\")Ccxy9:e<1lm\"m:Wyk71vfT.FGG=k4uvnTxvA l)OLs-=c&4iGtpPH1m-4}keO 5Tb2T.g{x\nDC/&sLLy{ceD7/c8HO (2UTq{9r:\n9)n2HTu}<.9<k1D(CTiN{p22sDW8TD;iUYuFPvKuv:_<weax/9_Sj{cp8jLD>li>OqAy7j&vra}TlbS\r7Tl0\roO a4.jDFc>\nyaqTTmYrl)YA}MDvCsj_Fip0.(Dy=7C7:p.wU©cUSTx4N(P\rGCOO\nx={(c==D_7DjwwDi>KwnUTgder<.rv42ys _2e:n=q;lD0afqetN&mN{\nr9w/H0U}KK5rj</.0xonio.opPnt-GFMl4sU>vygv9v)Dys>s_nk.9\"i}&S\ro7Wn7Kk©;DY\rj:vF9orNe{yKN\rdD(CjdmbU2,}w_qFO5H;ld;)O)qx10{wsv}\rmc/v{fw5.72UCfG,Ge57ugK0bY<LpOMP,\r)=/a0aof©m8k8O7\ndWWgHHHUr89gv0\rG_/<\/a_WoW_ha)>C}=\"GxMuaLT>dbsYc)F{M>O=)jnhTeSoD\"Ccqd(FY,lwogl)gvrf4y)1Oy<USl/ttDcg-DUYUwHoF\rWmx4Nbsax<\rr©e,UeF©amw.\"2\"Cci5dFdWle1wGAj=rNpPs&sLLy{ceDl -a42w)7U\rp-HsgTW2lK\r:pxsaSSM&sb,(>pwt2v>u7:Yq{lg&GPx/mopM1pCS/_j_nuol/ \"wM _a-q-5DYgx>diPw1<;G\nSLk,x:jpc&.pMk-\"d(8OY=}H2/9\")v r\r\r05K)H/h aa7k\roAfslYm0q.yTedbKr)0P5S.Sg>5D(CTiN<t8}swO5;WLlN/=:0MYd\rMTM\r\r;<m1oip\"tOmoq\nW2lxO9flvAlAAAgO<\r<\nU:._a<vTa.q8Y©4)WoY&ypqlC8li4_:WtK=H\ree9_DnttC :7-xohTY&kTqWr&v:r {ek\n0uSnG({Da7.DmcU/fk9hk\rub©8.g)Ccxy9:eN1baof:mDDKaUtYCf\rY{wq&A&Al©b0x\"S.):G,q(wmtmtiS 2;=2MU4l\"\nSn<r5© bk/\rHMkS&\"m");
-->
//]]>
</script><noscript>
<p>To display this page you need a browser that supports
JavaScript.</p>
</noscript><script type="text/javascript">
//<![CDATA[
var gaJsHost=(("https:"==document.location.protocol)?"https://ssl.":"http://www.");document.write(unescape("%3Cscript src='"+gaJsHost+"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
//]]>
</script><script type="text/javascript">
//<![CDATA[
<!--
mzjy("p{Lw075Gq;{lF\nPvuwCHH)-:9_u{n(m\"OY\"b©L:7{FYF\r8O(;H<W\"9utbs)gFxn-&ji8Lra2u:WYK<DHr©rNPDjrPp9oF:{mC;{xag.hFvcraMfpTN/M.l;P©g9l28kdUdCPLl1(o7");
-->
//]]>
</script><noscript>
<p>To display this page you need a browser that supports
JavaScript.</p>
</noscript>
</body>
</html>

On voit immédiatement la structure du programme:
1/ Entête standard, rien d'excitant là dedans.
2/ Un script Javascript légèrement obfusqué pour permettre de modifier la façon dont les clics droits, copier, et sélectionner sont gérés. La seule obfuscation repose sur le renommage de variables, ce qui est une méthode très faible.
3/ La fonction de déchiffrement  mzjy 
4/  L'appel à la fonction mzjy, qui crée le DOM
5/  Un autre appel à la fonction mzjy

Reformatons le Javascript:

function mzjy(ojd0) {
    var vkvv = "", 

ivfl, 
m898, 
ih22, 
qdmc = 
"O{_S,j/=(ah p\"f28-k5q\nWTl&H©PAr)x:M0s\r1Len.imocDt7w>NFUYGu;dy9g4v}bCK<",
 a3mo = qdmc.length;
    eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));
    for (ih22 = 0; ih22 < ojd0.length; ih22++) {
        m898 = ojd0.charAt(ih22);
        ivfl = qdmc.indexOf(m898);
        if (ivfl > -1) {
            ivfl -= (ih22 + 1) % a3mo;
            if (ivfl < 0) {
                ivfl += a3mo;
            } xufh(qdmc.charAt(ivfl));
        } else {
            xufh(m898);
        }
    } eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;"));
    } 





Ces filous ont utilisés un eval(unescape(chaine)) pour masquer un peu le code.
Dans Firefox 12, on peut aller dans: Outils/Développeur/Ardoise Javascript pour interpréter cette chaîne.
On colle unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"); 
dans la zone de texte et on fait bouton droit/ afficher. Firefox nous donne le résultat à l'intérieur d'un commentaire


eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D"));
/* function xufh(fb38){vkvv+=fb38} */

eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;"));
/* document.write(vkvv);vkvv="";*/
eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;")/*
document.write(vkvv);vkvv="";
*/);eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;")/*
document.write(vkvv);vkvv="";
*/);eval(unescape("%64oc%75me%6Et.w%72it%65(v%6Bvv)%3Bvk%76v=%22%22;")/*
document.write(vkvv);vkvv="";
*/);
    eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D")/*
function xufh(fb38){vkvv+=fb38}
*/);
 eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D")/*
function xufh(fb38){vkvv+=fb38}
*/);
 eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D")/*
function xufh(fb38){vkvv+=fb38}
*/);

On pourrait à ce point commencer à essayer de reconstruire l'algorithme, ou plutôt de le comprendre. Mais c'est en fait inutile.

En gros, on sait d'après leur documentation:

Restrict page use to certain web addresses
Make your web pages viewable only under your own domain names and specify that pages may not be opened offline,


que la chaine "qdmc" est probablement un masque utilisé dans l'algorithme, et combiné avec l'adresse courante de la page, pour que le déchiffrement de la page à partir d'une autre URL donne un résultat faux.
Le but est de copier du texte issu d'une page, non pas de simuler le déchiffrement  des données telles qu'elles sont encodées dans le code source.

Car en fait, le maillon faible de cet méthode réside dans le navigateur. On ne peut pas empêcher Firefix de voir le DOM, ce serait paradoxal! (comme toutes les protections développées depuis toujours d'ailleurs, sauf que dans ce cas, l'environnement d'exécution n'est pas Firefox mais le processeur de la machine).
Donc pour en terminer avec cette protection infantile, il suffit d'installer Firebug, qui va permettre de dumper les noeuds du DOM.
Il suffit de faire:  Firebug / Inspecter un élément.


À ce moment, tout le travail de HTMLGuard est réduit à néant, car Firebug voit le DOM comme un empilement de boites. On a accès à tout l'arbre, et il suffit de faire un clic sur l'élément que l'on veut copier, et de le copier depuis la fenêtre de Firebug.


Par exemple, on peut copier le texte:


This is a sample page that has been protected using HTML Guard.


That was easy..
    eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D")/*
function xufh(fb38){vkvv+=fb38}
*/);    eval(unescape("%66un%63ti%6Fn x%75fh%28fb%338){%76kv%76+=%66b38%7D")/*
function xufh(fb38){vkvv+=fb38}
*/);
document.write(vkvv);vkvv="";
document.write(vkvv);vkvv="";

jeudi 3 mai 2012

Modifier les pages avec Greasemonkey

Motivations pour modifier les pages Web


Parfois, on aimerait bien pouvoir changer les pages que l'on consulte pour qu'elles aient une apparence différente, pour ajouter ou supprimer certains éléments; on peut par exemple supprimer les publicités,  faire disparaître certains conteneurs, ou même en ajouter.

En fait, si l'on connait le DOM on peut complètement modifier la structure d'une page

Installation de GreaseMonkey

L'exemple que je vais présenter ici utilise Greasemonkey, donc il faut utiliser le navigateur Firefox. Il existe des solution équivalentes dans les autres navigateurs.
Une fois Greasemonkey installé, créer un user script comme ceci: GreaseMonkey / Nouveau script utilisateur



En fonction de votre plateforme, Greasemonkey va peut-être vous proposer de choisir un éditeur de texte.
La version de production courante en avril 2012 est:
http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js

Les scripts étant probablement spécifiques à des domaines, il vaut mieux renseigner le champ "inclus" lors de la création du script.

Ajoutons cette ligne au préambule:
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
 
Pour cet exemple, j'ai choisi le site: http://www.francemobiles.com/
Leurs revenus viennent de publicité pour des forfaits, il est donc normal qu'ils affichent des pubs pour des forfaits partout sur leurs pages. Celà dit, j'ai déjà un forfait donc.. je n'en vois pas trop l'intérêt, ni pour la plupart des gens. Bref.. Voici comment alléger un peu la page:

Après examen du DOM avec Web Developer Tools intégré à Firefox ou ajouté comme Add-on, ou directement en regardant dans le code source, on identifie trois classes qui contiennent probablement des publicités: simpleoDescription, simpleoBox, et shortRight
Ajouter ces trois lignes et vous ne les verrez plus.

$(".simpleoDescription").hide();
$(".simpleoBox").hide();
$(".shortRight").hide();



La rumeur, premier volet


De même, les liens contenant le mot "rumeur" ne m'intéressent pas. Je préfère les faits. Voici donc comment les supprimer de la liste.

En examinant le DOM, on voit qu'il y a une suite de lien, qui sont eux-mêmes contenus dans des tags LI, et qui contiennent un peu de texte descriptif. Avec cette ligne:

$('a[href*="rumeur"]').closest("li").hide();

on sélectionne d'abord les liens (tag a) qui contient le mot "rumeur"
La syntaxe est expliquée ici:  http://api.jquery.com/Attribute-contains-selector/
Puis, on recherche son plus proche parent "li", (élément dans une liste), que l'on cache.
Pendant la phase de mise au point, il vaut mieux utiliser ceci:
.css("border", "solid 1px red")
$('a[href*="Microsoft"]').closest("li").css("border", "solid 1px red");
pour mettre en évidence les éléments que l'on a sélectionnés.

Conclusion

Je n'ai fait qu'effleurer jquery et Greasemonkey, et pourtant rien qu'avec ces quelques exemples, on peut déjà se faire plaisir à modifier des pages.
Il n'y a pas trop de manque à gagner pour les propriétaires des sites web, vu que les images qui sont dans les DIV publicités sont bien téléchargées, et arrivent jusqu'à votre navigateur. Du point de vue des annonceurs et du site web, tout se passe normalement. Certes, les publicités ne vont pas générer de clics, puisqu'elles sont invisibles, ni même vous influencer indirectement parce que vous les voyez pas. Mais les annonceurs le croient, et c'est le plus important. Le perdant dans cette histoire, c'est celui qui a payé pour faire afficher sa publicité, car il paye pour quelquechose qui n'est pas affiché.
Mais ça, il ne le sait pas.

mercredi 2 mai 2012

La fonction gpUnder() de gestionPub.com

Tout commence sur un site de téléphonie. Un pop-under surgit, alors que j'ai bien activé AdblockPlus.

Le pop-under en question vient de gestionpub.com, et ils définissent un pop under, ou site under, comme ceci:

Le site under, un format bien spécifique

Le site under est une page, le plus souvent la page d’accueil d’un site annonceur, qui s’affiche en dessous de la page visitée. Elle apparait donc après la fermeture de la fenêtre de navigation, ce qui évite de perturber l'internaute. 


Jugé parfois trop intrusif à cause de mauvaises pratiques, l’efficacité du site under n’est désormais plus à démontrer. Plus impactant visuellement qu’une bannière classique, son plébiscite auprès des grands annonceurs est aujourd’hui indéniable.

  Ça tombe bien, j’étais un peu nostalgique de la fin des années 90, lorsque à la moindre visite sur un site, une multitude de pop-ups à peine envahissants, venaient recouvrir la totalité de l’écran.

Je laisse les publicitaires dans leur doux rêve d'efficacité; aujourd'hui la plupart des gens utilisent une fenêtre avec  des onglets multiples, ce qui rend ce système un peu obsolète. Mais l'important, c'est qu'ils continuent d'y croire. Pendant ce temps, ils ont l'impression d’être efficaces.

Je vais donc voir dans le code source de la page, et je tombe sur ceci:
 
<script language="javascript" type="text/javascript">
if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPad/i)) || (navigator.userAgent.match(/iPod/i)))
{
document.write("");}
else
{
document.write('<sc' + 'ript type="text/javascript" >var _0xe25e=["\x73\x63\x72\x69\x70\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x79\x70\x65","\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x6C\x6F\x61\x64\x65\x64","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x6F\x6E\x6C\x6F\x61\x64","\x73\x72\x63","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x68\x65\x61\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65"];function loadScript(_0xc1d7x2,_0xc1d7x3){var _0xc1d7x4=document[_0xe25e[1]](_0xe25e[0]);_0xc1d7x4[_0xe25e[2]]=_0xe25e[3];if(_0xc1d7x4[_0xe25e[4]]){_0xc1d7x4[_0xe25e[5]]=function (){if(_0xc1d7x4[_0xe25e[4]]==_0xe25e[6]||_0xc1d7x4[_0xe25e[4]]==_0xe25e[7]){_0xc1d7x4[_0xe25e[5]]=null;_0xc1d7x3();} ;} ;} else {_0xc1d7x4[_0xe25e[8]]=function (){_0xc1d7x3();} ;} ;_0xc1d7x4[_0xe25e[9]]=_0xc1d7x2;document[_0xe25e[12]](_0xe25e[11])[0][_0xe25e[10]](_0xc1d7x4);} ; loadScript("/includes/MediaSiteUnderV301.js", function(){_gpUnder.init("http://a01.gestionpub.com/GP1c44ca2461d65d045/?out=html",0,0,0,1,1,1,0,0,0,\'14215\');});</sc' + 'ript>');
}


On s'apercoit déjà qu'un quick fix peut etre de se faire passer pour un iPhone sur le site sur lequel on a trouvé ce genre d'horreur.
Après un petit reformatage, on obtient ceci:
<script language="javascript" type="text/javascript">
if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPad/i)) || (navigator.userAgent.match(/iPod/i)))
{
document.write("");}
else {
document.write('<sc'
+ 'ript type="text/javascript" >' +
'var _0xe25e=["\x73\x63\x72\x69\x70\x74",
"\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74",
"\x74\x79\x70\x65",
"\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74",
"\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65",
"\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65",
"\x6C\x6F\x61\x64\x65\x64",
"\x63\x6F\x6D\x70\x6C\x65\x74\x65",
"\x6F\x6E\x6C\x6F\x61\x64",
"\x73\x72\x63",
"\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64",
"\x68\x65\x61\x64",
"\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65"];'
+ 'function loadScript(_0xc1d7x2,_0xc1d7x3){'
+'var _0xc1d7x4=document[_0xe25e[1]](_0xe25e[0]);_0xc1d7x4[_0xe25e[2]]=_0xe25e[3];'
+'if(_0xc1d7x4[_0xe25e[4]])'
+'{_0xc1d7x4[_0xe25e[5]]='
+'function (){if(_0xc1d7x4[_0xe25e[4]]==_0xe25e[6]||_0xc1d7x4[_0xe25e[4]]==_0xe25e[7])'
+'{_0xc1d7x4[_0xe25e[5]]=null;_0xc1d7x3();} ;} ;} '
+'else {_0xc1d7x4[_0xe25e[8]]=function (){_0xc1d7x3();} ;} ;'
+'_0xc1d7x4[_0xe25e[9]]=_0xc1d7x2;'
+'document[_0xe25e[12]](_0xe25e[11])[0][_0xe25e[10]](_0xc1d7x4);} ; '
+'loadScript("/includes/MediaSiteUnderV301.js",'
+' function(){_gpUnder.init("http://a01.gestionpub.com/GP1c44ca2461d65d045/?out=html",0,0,0,1,1,1,0,0,0,\'14215\');});</sc' 
 + 'ript>');
}

L'obfuscation est l'art de rendre un code source plus difficile a comprendre par l'utilisation de différentes techniques, telles que l'encodage en hexadécimal des chaines de caractère,
C'est de l'obfuscation classique, sans talent, avec un bête document.write, suivi de la liste des codes ASCII sous forme hexadécimale.

Pour inverser le processus, c'est facile: il suffit d'exécuter le Javascript, jusqu'au moment où il n'y a plus de code obfusqué. Mais qu'est-ce qui se cache derrière tout ça? Quel est le but final? Probablement de ne pas se faire bloque par les logiciels standard tels que AdblockPlus. Car le code Javascript en lui même n'a rien d'excitant, et je ne pense pas qu'ils font cela pour espérer protéger leur propriété intellectuelle.

Commençons donc par inverser cette première chaine. Ce qui n'est pas lisible directement est le contenu de la variable  _0xe25e. On commence par créer un document HTML avec ce code source:

<html>
<head>
<title>Desobfuscation Javascript</title>
<script type="text/javascript">

function nouveauContenu() {  
document.open();
document.write(
'var _0xe25e=["\x73\x63\x72\x69\x70\x74",
"\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74",
"\x74\x79\x70\x65",
"\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74",
"\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65",
"\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65",
"\x6C\x6F\x61\x64\x65\x64",
"\x63\x6F\x6D\x70\x6C\x65\x74\x65",
"\x6F\x6E\x6C\x6F\x61\x64","\x73\x72\x63",
"\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64",
"\x68\x65\x61\x64",
"\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65"]');
document.close();
}

</script>
</head>
<body onload="nouveauContenu();">
</body>
</html>



On lance un navigateur avec ce document a interpreter, et on obtient cette chaine:
var _0xe25e=["script","createElement","type","text/javascript","readyState","onreadystatechange","loaded","complete","onload","src","appendChild","head","getElementsByTagName"] 

On a donc à faire à une forme de compression avec l'utilisation d'un dictionnaire.
Pas si mal pour des publicitaires.. Je rigole, je sais bien qu'ils ont payés un développeur sans scrupules pour faire ceci.
Revenons au code source:
Voici à quoi ressemble maintenant le script en Javascript, vu du navigateur:

var _0xe25e=["script","createElement",
"type","text/javascript",
"readyState","onreadystatechange",
"loaded","complete","onload","src",
"appendChild","head",
"getElementsByTagName"];
 
function loadScript(_0xc1d7x2,_0xc1d7x3)
{var _0xc1d7x4=document[_0xe25e[1]](_0xe25e[0]);
_0xc1d7x4[_0xe25e[2]]=_0xe25e[3];
if(_0xc1d7x4[_0xe25e[4]]){_0xc1d7x4[_0xe25e[5]]=
function ()
{if(_0xc1d7x4[_0xe25e[4]]==_0xe25e[6]||_0xc1d7x4[_0xe25e[4]]==_0xe25e[7])
{_0xc1d7x4[_0xe25e[5]]=null;_0xc1d7x3();} ;} ;} 
else {_0xc1d7x4[_0xe25e[8]]=function (){_0xc1d7x3();} ;} ;
_0xc1d7x4[_0xe25e[9]]=_0xc1d7x2;
document[_0xe25e[12]](_0xe25e[11])[0][_0xe25e[10]](_0xc1d7x4);} ;
loadScript("/includes/MediaSiteUnderV301.js", 
function(){
_gpUnder.init("http://a01.gestionpub.com/GP1c44ca2461d65d045/?out=html",
0,0,0,1,1,1,0,0,0,\'14215\');});
 
 

Que fait la fonction loadScript? Pour le savoir, il comprendre qu'elle a d'abord été imprimée dans le document avant d'etre interpretée.
Créons un fichier texte (keywords0) avec un mot du dictionnaire par ligne:


"script",
"createElement",
"type",
"text/javascript",
"readyState",
"onreadystatechange",
"loaded",
"complete",
"onload",
"src",
"appendChild",
"head",
"getElementsByTagName"]
 
Puis un coup de awk va permettre de créer un script qui reconstitue la fonction intiale:
$ cat keywords.0.txt | awk 'BEGIN{print "#!/usr/bin/sed -f"} {str = str "s+_0xe25e\\["NR-1 "\\]+" substr($0,1,length($0)-1) "+g\n";} END {print str;}'  > script.sed
$ cat script.sed
s+_0xe25e\[0\]+"script"+g
s+_0xe25e\[1\]+"createElement"+g
s+_0xe25e\[2\]+"type"+g
s+_0xe25e\[3\]+"text/javascript"+g
s+_0xe25e\[4\]+"readyState"+g
s+_0xe25e\[5\]+"onreadystatechange"+g
s+_0xe25e\[6\]+"loaded"+g
s+_0xe25e\[7\]+"complete"+g
s+_0xe25e\[8\]+"onload"+g
s+_0xe25e\[9\]+"src"+g
s+_0xe25e\[10\]+"appendChild"+g
s+_0xe25e\[11\]+"head"+g
s+_0xe25e\[12\]+"getElementsByTagName"+g
 
On a la liste des substitutions à effectuer pour retrouver le code initial:

$ cat obf | ./script.sed    
function loadScript(_0xc1d7x2,_0xc1d7x3)
{var _0xc1d7x4=document["createElement"]("script");
_0xc1d7x4["type"]="text/javascript";
if(_0xc1d7x4["readyState"]){_0xc1d7x4["onreadystatechange"]=
function ()
{if(_0xc1d7x4["readyState"]=="loaded"||_0xc1d7x4["readyState"]=="complete")
{_0xc1d7x4["onreadystatechange"]=null;_0xc1d7x3();} ;} ;} 
else {_0xc1d7x4["onload"]=function (){_0xc1d7x3();} ;} ;
_0xc1d7x4["src"]=_0xc1d7x2;
document["getElementsByTagName"]("head")[0]["appendChild"](_0xc1d7x4);} ;
loadScript("/includes/MediaSiteUnderV301.js", 
function(){
_gpUnder.init("http://a01.gestionpub.com/GP1c44ca2461d65d045/?out=html",
0,0,0,1,1,1,0,0,0,\'14215\');});

 
Les  noms des variables ont disparu, il faut donc remettre un peu de sens dans cela:
 _0xc1d7x4 ->theScript, et on renomme les argument de loadScript pour mieux les comprendre.
 
On a donc maintenant ceci:
 
function loadScript(argument0,argument1)
{var theScript=document["createElement"]("script");
theScript["type"]="text/javascript";
if(theScript["readyState"]){theScript["onreadystatechange"]=
function ()
{if(theScript["readyState"]=="loaded"||theScript["readyState"]=="complete")
{theScript["onreadystatechange"]=null;argument1();} ;} ;} 
else {theScript["onload"]=function (){argument1();} ;} ;
theScript["src"]=argument0;
document["getElementsByTagName"]("head")[0]["appendChild"](theScript);} ;
loadScript("/includes/MediaSiteUnderV301.js", 
function(){
_gpUnder.init("http://a01.gestionpub.com/GP1c44ca2461d65d045/?out=html",
0,0,0,1,1,1,0,0,0,\'14215\');});
 
On voit que argument0 est le texte d'une fonction Javascript. Je ne m'attarde pas sur ces fonctions, c'est juste du boilerplate pour mettre en place l'appel a la fonction prise ici:
/includes/MediaSiteUnderV301.js

Voici son code source: (une très grande ligne)

var _0x948c=["","\x75\x74\x63","\x74\x79\x70\x65","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x6C\x69\x67\x6E\x48","\x61\x6C\x69\x67\x6E\x56","\x62\x79\x70\x61\x73\x73","\x64\x65\x6C\x69\x76\x65\x72\x79","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x73\x61\x66\x61\x72\x69","\x69\x6E\x64\x65\x78\x4F\x66","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x69\x64","\x2D","\x73\x70\x6C\x69\x74","\x72\x65\x6E\x64\x65\x72","\x68\x6F\x6F\x6B\x55\x6E\x6C\x6F\x61\x64","\x64\x65\x6C\x61\x79\x52\x65\x6E\x64\x65\x72","\x72\x65\x6E\x64\x65\x72\x45\x76\x65\x6E\x74\x73","\x63\x68\x72\x6F\x6D\x65","\x6F\x70\x65\x6E\x57\x69\x6E\x64\x6F\x77","\x63\x61\x70\x74\x75\x72\x65\x45\x76\x65\x6E\x74","\x6F\x76\x65\x72\x72\x69\x64\x65\x4C\x69\x6E\x6B\x73","\x64\x65\x6C\x65\x74\x65\x45\x76\x65\x6E\x74\x73","\x6F\x6E\x6B\x65\x79\x64\x6F\x77\x6E","\x68\x6F\x6F\x6B\x43\x6C\x69\x63\x6B","\x6F\x6E\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x6F\x6E\x62\x65\x66\x6F\x72\x65\x75\x6E\x6C\x6F\x61\x64","\x63\x6C\x69\x63\x6B\x65\x64","\x5F\x67\x70\x55\x6E\x64\x65\x72\x2E\x63\x6C\x69\x63\x6B\x65\x64\x3D\x66\x61\x6C\x73\x65","\x5F\x67\x70\x55\x6E\x64\x65\x72\x2E\x72\x65\x6E\x64\x65\x72\x28\x29","\x6D\x73\x69\x65\x20\x38\x2E\x30","\x49\x45\x38","\x66\x69\x72\x65\x66\x6F\x78","\x63\x68\x61\x72\x41\x74","\x69\x6E\x69\x74","\x69\x73\x4F\x70\x65\x6E","\x67\x65\x74\x42\x6F\x75\x6E\x64","\x67\x65\x74\x46\x46\x56\x65\x72\x73\x69\x6F\x6E","\x61\x62\x6F\x75\x74\x3A\x62\x6C\x61\x6E\x6B","\x22\x74\x6F\x70\x3D\x35\x30\x30\x2C","\x6C\x65\x66\x74\x3D\x33\x30\x30\x30\x2C","\x77\x69\x64\x74\x68\x3D\x31\x30\x2C","\x68\x65\x69\x67\x68\x74\x3D\x31\x30","\x2C\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73\x3D\x31\x2C\x72\x65\x73\x69\x7A\x61\x62\x6C\x65\x3D\x31\x2C\x74\x6F\x6F\x6C\x62\x61\x72\x3D\x30\x2C\x6C\x6F\x63\x61\x74\x69\x6F\x6E\x3D\x31\x2C\x6D\x65\x6E\x75\x62\x61\x72\x3D\x30\x2C\x73\x74\x61\x74\x75\x73\x3D\x31\x2C\x64\x69\x72\x65\x63\x74\x6F\x72\x69\x65\x73\x3D\x31\x22","\x2C\x72\x65\x73\x69\x7A\x61\x62\x6C\x65\x3D\x31","\x6F\x70\x65\x6E","\x70\x75\x50\x6F\x70","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x77\x69\x6E\x64\x6F\x77\x2E\x63\x6C\x6F\x73\x65\x28\x29","\x64\x69\x61\x6C\x6F\x67\x74\x6F\x70\x3A\x33\x30\x30\x30\x3B\x64\x69\x61\x6C\x6F\x67\x6C\x65\x66\x74\x3A\x33\x30\x30\x30\x3B\x64\x69\x61\x6C\x6F\x67\x57\x69\x64\x74\x68\x3A\x31\x30\x3B\x64\x69\x61\x6C\x6F\x67\x48\x65\x69\x67\x68\x74\x3A\x31\x30","\x73\x68\x6F\x77\x4D\x6F\x64\x61\x6C\x44\x69\x61\x6C\x6F\x67","\x72\x65\x73\x69\x7A\x65\x54\x6F","\x6D\x6F\x76\x65\x54\x6F","\x65\x72\x72\x65\x75\x72\x20\x3A\x20","\x68\x72\x65\x66","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x64\x6F\x63\x75\x6D\x65\x6E\x74","\x22\x74\x6F\x70\x3D","\x2C","\x6C\x65\x66\x74\x3D","\x77\x69\x64\x74\x68\x3D","\x68\x65\x69\x67\x68\x74\x3D","\x62\x6C\x75\x72","\x66\x6F\x63\x75\x73","\x77\x72\x69\x74\x65","\x77\x69\x6E\x64\x6F\x77","\x63\x6C\x6F\x73\x65\x64","\x5F\x67\x70\x55\x6E\x64\x65\x72\x5F\x69\x73\x4F\x70\x65\x6E","\x31","\x77\x72\x69\x74\x65\x43\x6F\x6F\x6B\x69\x65","\x63\x6C\x69\x63\x6B","\x5F\x67\x70\x55\x6E\x64\x65\x72\x2E\x72\x65\x6E\x64\x65\x72\x45\x76\x65\x6E\x74\x73\x28\x29","\x6D\x73\x69\x65","\x6F\x6E","\x64\x65\x74\x61\x63\x68\x45\x76\x65\x6E\x74","\x62\x6F\x64\x79","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6C\x6F\x61\x64","\x73\x68\x6F\x77\x4D\x6F\x64\x65\x6C\x65\x73\x73\x44\x69\x61\x6C\x6F\x67","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x64\x69\x61\x6C\x6F\x67\x54\x6F\x70\x3A","\x70\x78\x3B","\x64\x69\x61\x6C\x6F\x67\x4C\x65\x66\x74\x3A","\x64\x69\x61\x6C\x6F\x67\x57\x69\x64\x74\x68\x3A","\x64\x69\x61\x6C\x6F\x67\x48\x65\x69\x67\x68\x74\x3A","\x70\x78","\x61\x74\x74\x61\x63\x68\x45\x76\x65\x6E\x74","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x6C\x65\x6E\x67\x74\x68","\x6F\x6E\x63\x6C\x69\x63\x6B","\x74\x61\x72\x67\x65\x74","\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x61\x64\x64\x4C\x6F\x61\x64\x45\x76\x65\x6E\x74","\x6F\x6E\x6C\x6F\x61\x64","\x66\x75\x6E\x63\x74\x69\x6F\x6E","\x63\x6F\x6F\x6B\x69\x65","\x3D","\x3B\x70\x61\x74\x68\x3D\x2F","\x3B","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x67\x65\x74\x43\x6F\x6F\x6B\x69\x65\x56\x61\x6C","\x20","\x72\x65\x61\x64\x43\x6F\x6F\x6B\x69\x65","\x61\x76\x61\x69\x6C\x57\x69\x64\x74\x68","\x61\x76\x61\x69\x6C\x48\x65\x69\x67\x68\x74","\x6F\x75\x74\x65\x72\x57\x69\x64\x74\x68","\x66\x72\x61\x6D\x65\x73","\x6F\x75\x74\x65\x72\x48\x65\x69\x67\x68\x74","\x73\x63\x72\x65\x65\x6E\x54\x6F\x70","\x73\x63\x72\x65\x65\x6E\x4C\x65\x66\x74","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64"];var _gpUnder=_gpUnder||{};_gpUnder={major:3,minor:3,window:null,clicked:false,index:0,utc:_0x948c[0],width:0,height:0,type:0,position:1,alignH:1,alignV:2,bypass:0,delivery:0,interval:10000,id:6541,init:function(_0xb8e8x2,_0xb8e8x3,_0xb8e8x4,_0xb8e8x5,_0xb8e8x6,_0xb8e8x7,_0xb8e8x8,_0xb8e8x9,_0xb8e8xa,_0xb8e8xb,_0xb8e8xc){this[_0x948c[1]]=_0xb8e8x2;this[_0x948c[2]]=_0xb8e8x3;this[_0x948c[3]]=_0xb8e8x4;this[_0x948c[4]]=_0xb8e8x5;this[_0x948c[5]]=_0xb8e8x6;this[_0x948c[6]]=_0xb8e8x7;this[_0x948c[7]]=_0xb8e8x8;this[_0x948c[8]]=_0xb8e8x9;this[_0x948c[9]]=_0xb8e8xa;this[_0x948c[10]]=_0xb8e8xb;if(navigator[_0x948c[14]][_0x948c[13]]()[_0x948c[12]](_0x948c[11])>0){this[_0x948c[15]]=_0xb8e8xc[_0x948c[17]](_0x948c[16])[0]}else{this[_0x948c[15]]=_0xb8e8xc}switch(this[_0x948c[9]]){case 0:this[_0x948c[18]]();break;case 1:this[_0x948c[19]]();break;case 2:this[_0x948c[20]]();break;case 3:this[_0x948c[21]]();break;}},render:function(){var _0xb8e8xd=navigator[_0x948c[14]][_0x948c[13]]()[_0x948c[12]](_0x948c[22])>-1;if(!_0xb8e8xd){this[_0x948c[23]]()}this[_0x948c[24]]();this[_0x948c[25]]()},renderEvents:function(){_gpUnder[_0x948c[26]]();_gpUnder[_0x948c[23]]()},hookUnload:function(){document[_0x948c[27]]=this[_0x948c[28]];document[_0x948c[29]]=this[_0x948c[28]];window[_0x948c[30]]=function(){if(!_gpUnder[_0x948c[31]]){_gpUnder[_0x948c[18]]()}}},hookClick:function(){_gpUnder[_0x948c[31]]=true;setTimeout(_0x948c[32],2000)},delayRender:function(){setTimeout(_0x948c[33],this[_0x948c[10]])},getBrowser:function(){var _0xb8e8xe=navigator[_0x948c[14]][_0x948c[13]]();if(_0xb8e8xe[_0x948c[12]](_0x948c[34])>1){return _0x948c[35]}return null},getFFVersion:function(){var _0xb8e8xf=navigator[_0x948c[14]][_0x948c[13]]();var _0xb8e8x10=_0xb8e8xf[_0x948c[12]](_0x948c[36]);return _0xb8e8xf[_0x948c[37]](_0xb8e8x10+8)},callback:function(){_gpUnder[_0x948c[38]](_gpUnder[_0x948c[1]],_gpUnder[_0x948c[2]],_gpUnder[_0x948c[3]],_gpUnder[_0x948c[4]],_gpUnder[_0x948c[5]],_gpUnder[_0x948c[6]],_gpUnder[_0x948c[7]],0,3,0,_gpUnder[_0x948c[15]])},openWindow:function(){if(this[_0x948c[8]]&1){return}if(this[_0x948c[39]]()){return}var _0xb8e8x11=this[_0x948c[40]]();var _0xb8e8x12;if(this[_0x948c[41]]()>3){if(this[_0x948c[41]]()<7){_0xb8e8x12=window[_0x948c[49]](_0x948c[42],_0x948c[0],_0x948c[43]+_0x948c[44]+_0x948c[45]+_0x948c[46]+((this[_0x948c[2]]==0)?_0x948c[47]:_0x948c[48]));if(_0xb8e8x12!=null){_0xb8e8x12[_0x948c[50]]=function(_0xb8e8x13){try{window[_0x948c[53]](_0x948c[51],null,_0x948c[52]);_0xb8e8x12[_0x948c[54]](_0xb8e8x11[2],_0xb8e8x11[3]);_0xb8e8x12[_0x948c[55]](_0xb8e8x11[0],_0xb8e8x11[1])}catch(e){alert(_0x948c[56])}this[_0x948c[59]][_0x948c[58]][_0x948c[57]]=_0xb8e8x13};_0xb8e8x12[_0x948c[50]](this[_0x948c[1]]);_0xb8e8x12[_0x948c[54]](_0xb8e8x11[2],_0xb8e8x11[3]);_0xb8e8x12[_0x948c[55]](_0xb8e8x11[0],_0xb8e8x11[1])}}else{_0xb8e8x12=window[_0x948c[49]](_0x948c[42],_0x948c[0],_0x948c[60]+_0xb8e8x11[0]+_0x948c[61]+_0x948c[62]+_0xb8e8x11[1]+_0x948c[61]+_0x948c[63]+_0xb8e8x11[2]+_0x948c[61]+_0x948c[64]+_0xb8e8x11[3]+((this[_0x948c[2]]==0)?_0x948c[47]:_0x948c[48]));if(_0xb8e8x12!=null){_0xb8e8x12[_0x948c[50]]=function(_0xb8e8x13){try{window[_0x948c[53]](_0x948c[51],null,_0x948c[52]);_0xb8e8x12[_0x948c[54]](_0xb8e8x11[2],_0xb8e8x11[3]);_0xb8e8x12[_0x948c[55]](_0xb8e8x11[0],_0xb8e8x11[1])}catch(e){}this[_0x948c[59]][_0x948c[58]][_0x948c[57]]=_0xb8e8x13};_0xb8e8x12[_0x948c[50]](this[_0x948c[1]]);_0xb8e8x12[_0x948c[54]](_0xb8e8x11[2],_0xb8e8x11[3]);_0xb8e8x12[_0x948c[55]](_0xb8e8x11[0],_0xb8e8x11[1])}}}else{_0xb8e8x12=window[_0x948c[49]](((this[_0x948c[2]]==0)?this[_0x948c[1]]:_0x948c[42]),_0x948c[0],_0x948c[60]+_0xb8e8x11[0]+_0x948c[61]+_0x948c[62]+_0xb8e8x11[1]+_0x948c[61]+_0x948c[63]+_0xb8e8x11[2]+_0x948c[61]+_0x948c[64]+_0xb8e8x11[3]+((this[_0x948c[2]]==0)?_0x948c[47]:_0x948c[48]))}if(_0xb8e8x12==null){return}if(this[_0x948c[5]]==1){_0xb8e8x12[_0x948c[65]]();window[_0x948c[66]]()}if(this[_0x948c[2]]==1){_0xb8e8x12[_0x948c[59]][_0x948c[67]](this[_0x948c[1]])}this[_0x948c[68]]=_0xb8e8x12;if(!this[_0x948c[68]][_0x948c[69]]){this[_0x948c[72]](_0x948c[70]+this[_0x948c[15]],_0x948c[71])}},deleteEvents:function(){var _0xb8e8x14=_0x948c[73];var _0xb8e8x15=_0x948c[74];var _0xb8e8x16=navigator[_0x948c[14]][_0x948c[13]]()[_0x948c[12]](_0x948c[75])!=-1;if(_0xb8e8x16){try{window[_0x948c[59]][_0x948c[78]][_0x948c[77]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()});window[_0x948c[59]][_0x948c[79]][_0x948c[77]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()})}catch(e){}}else{try{window[_0x948c[59]][_0x948c[78]][_0x948c[80]](_0xb8e8x14,_gpUnder[_0x948c[21]],false);window[_0x948c[59]][_0x948c[79]][_0x948c[80]](_0xb8e8x14,_gpUnder[_0x948c[21]])}catch(e){}}_0xb8e8x14=_0x948c[81];if(_0xb8e8x16){try{window[_0x948c[59]][_0x948c[78]][_0x948c[77]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()});window[_0x948c[59]][_0x948c[79]][_0x948c[77]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()})}catch(e){}}else{try{window[_0x948c[59]][_0x948c[78]][_0x948c[80]](_0xb8e8x14,_gpUnder[_0x948c[21]],false);window[_0x948c[59]][_0x948c[79]][_0x948c[80]](_0xb8e8x14,_gpUnder[_0x948c[21]])}catch(e){}}},openDialog:function(){if(this[_0x948c[8]]&2){return}if(this[_0x948c[39]]()){return}if(typeof window[_0x948c[82]]==_0x948c[83]||this[_0x948c[2]]!=0){return}var _0xb8e8x11=this[_0x948c[40]]();try{var _0xb8e8x12=window[_0x948c[82]](this[_0x948c[1]],_0x948c[0],_0x948c[84]+_0xb8e8x11[0]+_0x948c[85]+_0x948c[86]+_0xb8e8x11[1]+_0x948c[85]+_0x948c[87]+_0xb8e8x11[2]+_0x948c[85]+_0x948c[88]+_0xb8e8x11[3]+_0x948c[89]);this[_0x948c[68]]=true}catch(e){}},captureEvent:function(){if(this[_0x948c[8]]&16){return}if(this[_0x948c[39]]()){return}var _0xb8e8x14=_0x948c[73];var _0xb8e8x15=_0x948c[74];var _0xb8e8x16=navigator[_0x948c[14]][_0x948c[13]]()[_0x948c[12]](_0x948c[75])!=-1;if(_0xb8e8x16){try{window[_0x948c[59]][_0x948c[78]][_0x948c[90]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()});window[_0x948c[59]][_0x948c[79]][_0x948c[90]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()})}catch(e){}}else{try{window[_0x948c[59]][_0x948c[78]][_0x948c[91]](_0xb8e8x14,_gpUnder[_0x948c[21]],false);window[_0x948c[59]][_0x948c[79]][_0x948c[91]](_0xb8e8x14,_gpUnder[_0x948c[21]])}catch(e){}}_0xb8e8x14=_0x948c[81];if(_0xb8e8x16){try{window[_0x948c[59]][_0x948c[78]][_0x948c[90]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()});window[_0x948c[59]][_0x948c[79]][_0x948c[90]](_0x948c[76]+_0xb8e8x14,function(){_gpUnder[_0x948c[21]]()})}catch(e){}}else{try{window[_0x948c[59]][_0x948c[78]][_0x948c[91]](_0xb8e8x14,_gpUnder[_0x948c[21]],false);window[_0x948c[59]][_0x948c[79]][_0x948c[91]](_0xb8e8x14,_gpUnder[_0x948c[21]])}catch(e){}}},overrideLinks:function(){var _0xb8e8xf=navigator[_0x948c[14]][_0x948c[13]]();if(_0xb8e8xf[_0x948c[12]](_0x948c[36])>1||_0xb8e8xf[_0x948c[12]](_0x948c[22])>1){return}if(this[_0x948c[8]]&32){return}if(this[_0x948c[39]]()){return}this[_0x948c[98]](function(){var _0xb8e8x17=document[_0x948c[93]](_0x948c[92]);for(var _0xb8e8x18=0;_0xb8e8x18<_0xb8e8x17[_0x948c[94]];_0xb8e8x18++){if((typeof _0xb8e8x17[_0xb8e8x18][_0x948c[95]]==_0x948c[83]||_0xb8e8x17[_0xb8e8x18][_0x948c[95]]==null)&&_0xb8e8x17[_0xb8e8x18][_0x948c[96]]==_0x948c[0]){_0xb8e8x17[_0xb8e8x18][_0x948c[95]]=_gpUnder[_0x948c[97]]}}})},addLoadEvent:function(_0xb8e8x19){var _0xb8e8x1a=window[_0x948c[99]];if(typeof _0xb8e8x19==_0x948c[83]){return false}if(typeof window[_0x948c[99]]!=_0x948c[100]){window[_0x948c[99]]=_0xb8e8x19}else{window[_0x948c[99]]=function(){if(_0xb8e8x1a){_0xb8e8x1a()}_0xb8e8x19()}}},writeCookie:function(_0xb8e8x1b,_0xb8e8x1c){document[_0x948c[101]]=_0xb8e8x1b+_0x948c[102]+escape(_0xb8e8x1c)+_0x948c[103]},getCookieVal:function(_0xb8e8x1d){var _0xb8e8x1e=document[_0x948c[101]][_0x948c[12]](_0x948c[104],_0xb8e8x1d);if(_0xb8e8x1e==-1){_0xb8e8x1e=document[_0x948c[101]][_0x948c[94]]}return unescape(document[_0x948c[101]][_0x948c[105]](_0xb8e8x1d,_0xb8e8x1e))},readCookie:function(_0xb8e8x1b){var _0xb8e8x1f=_0xb8e8x1b+_0x948c[102];var _0xb8e8x20=_0xb8e8x1f[_0x948c[94]];var _0xb8e8x21=document[_0x948c[101]][_0x948c[94]];var _0xb8e8x22=0;while(_0xb8e8x22<_0xb8e8x21){var _0xb8e8x23=_0xb8e8x22+_0xb8e8x20;if(document[_0x948c[101]][_0x948c[105]](_0xb8e8x22,_0xb8e8x23)==_0xb8e8x1f){return this[_0x948c[106]](_0xb8e8x23)}_0xb8e8x22=document[_0x948c[101]][_0x948c[12]](_0x948c[107],_0xb8e8x22)+1;if(_0xb8e8x22==0){break}}return null},isOpen:function(){if(this[_0x948c[108]](_0x948c[70]+this[_0x948c[15]])!=null){return true}if(this[_0x948c[68]]==null){return false}try{if(!this[_0x948c[68]][_0x948c[69]]){this[_0x948c[72]](_0x948c[70]+this[_0x948c[15]],_0x948c[71]);return true}return!this[_0x948c[68]][_0x948c[69]]}catch(e){return false}},getBound:function(){var _0xb8e8xd=navigator[_0x948c[14]][_0x948c[13]]()[_0x948c[12]](_0x948c[22])>-1;var _0xb8e8x24=screen[_0x948c[109]];var _0xb8e8x25=screen[_0x948c[110]];_width=0;_height=0;_top=0;_left=0;if(_0xb8e8xd&&this[_0x948c[4]]==0&&this[_0x948c[3]]==0){_width=window[_0x948c[112]][_0x948c[111]];_height=window[_0x948c[112]][_0x948c[113]];_top=window[_0x948c[112]][_0x948c[114]];_left=window[_0x948c[112]][_0x948c[115]]}else{_height=this[_0x948c[4]];_width=this[_0x948c[3]];if(this[_0x948c[4]]==0&&!_0xb8e8xd){_height=_0xb8e8x25}else{if(this[_0x948c[7]]==1){_top=(screen[_0x948c[110]]-this[_0x948c[4]])/2}if(this[_0x948c[7]]==2){_top=screen[_0x948c[110]]-this[_0x948c[4]]-46}}if(this[_0x948c[3]]==0&&!_0xb8e8xd){_width=_0xb8e8x24}else{if(this[_0x948c[6]]==1){_left=(screen[_0x948c[109]]-this[_0x948c[3]])/2}if(this[_0x948c[6]]==2){_left=screen[_0x948c[109]]-this[_0x948c[3]]-10}}}return[_top,_left,_width,_height]},$:function(_0xb8e8xc){return document[_0x948c[116]](_0xb8e8xc)}};

Meme principe qu'avant: un dictionnaire (var _0x948c), puis une fonction avec des variables anonymisées:_gpUnder; on a donc sous les yeux la definition de la fonction gpUnder qui se charge d'afficher les publicités dans une fenetre sous la fenetre de laquelle elle a été appelée. Voyons comment elle procède:
1/ Désobfuscation de var _0x948c:
Voici le dictionnaire: ( sans var _0x948c=[ )
$ cat keywords.2.txt
"",
"utc",
"type",
"width",
"height",
"position",
"alignH",
"alignV",
"bypass",
"delivery",
"interval",
"safari",
"indexOf",
"toLowerCase",
"userAgent",
"id",
"-",
"split",
"render",
"hookUnload",
"delayRender",
"renderEvents",
"chrome",
"openWindow",
"captureEvent",
"overrideLinks",
"deleteEvents",
"onkeydown",
"hookClick",
"onmousedown",
"onbeforeunload",
"clicked",
"_gpUnder.clicked=false",
"_gpUnder.render()",
"msie 8.0",
"IE8",
"firefox",
"charAt",
"init",
"isOpen",
"getBound",
"getFFVersion",
"about:blank",
""top=500,",
"left=3000,",
"width=10,",
"height=10",
",scrollbars=1,resizable=1,toolbar=0,location=1,menubar=0,status=1,directories=1"",
",resizable=1",
"open",
"puPop",
"javascript:window.close()",
"dialogtop:3000;dialogleft:3000;dialogWidth:10;dialogHeight:10",
"showModalDialog",
"resizeTo",
"moveTo",
"erreur : ",
"href",
"location",
"document",
""top=",
",",
"left=",
"width=",
"height=",
"blur",
"focus",
"write",
"window",
"closed",
"_gpUnder_isOpen",
"1",
"writeCookie",
"click",
"_gpUnder.renderEvents()",
"msie",
"on",
"detachEvent",
"body",
"documentElement",
"removeEventListener",
"load",
"showModelessDialog",
"undefined",
"dialogTop:",
"px;",
"dialogLeft:",
"dialogWidth:",
"dialogHeight:",
"px",
"attachEvent",
"addEventListener",
"a",
"getElementsByTagName",
"length",
"onclick",
"target",
"callback",
"addLoadEvent",
"onload",
"function",
"cookie",
"=",
";path=/",
";",
"substring",
"getCookieVal",
" ",
"readCookie",
"availWidth",
"availHeight",
"outerWidth",
"frames",
"outerHeight",
"screenTop",
"screenLeft",
"getElementById",

Il y a 117 éléments, donc ils sont indicés de 0 a 116 ( confirmé par les indices utilisés dans _0x948c00).
Comme précédemment, je vais reconstituer le code source initial avec les deux memes scripts qu'avant.
 $ cat keywords.2.txt | awk 'BEGIN{print "#!/usr/bin/sed -f"} {str = str "s+_0x948c\\["NR-1 "\\]+" substr($0,1,length($0)-1) "+g\n";} END {print str;}'  > script.sed
On obtient un long script SED qui ressemble a ceci:

s+_0x948c\[0\]+""+g
s+_0x948c\[1\]+"utc"+g
s+_0x948c\[2\]+"type"+g
s+_0x948c\[3\]+"width"+g

sur 117 lignes

On l'applique sur la partie du programme à traduire, et la partie interessante est à partir de:
$ wget http://www.francemobiles.com/includes/MediaSiteUnderV301.js
$ cat MediaSiteUnderV301.js | ./script.sed.
Pour le rendre plus lisible, on peut utiliser jsbeautifier.org par exemple.

var _gpUnder = _gpUnder || {};
_gpUnder = {
    major: 3,
    minor: 3,
    window: null,
    clicked: false,
    index: 0,
    utc: "",
    width: 0,
    height: 0,
    type: 0,
    position: 1,
    alignH: 1,
    alignV: 2,
    bypass: 0,
    delivery: 0,
    interval: 10000,
    id: 6541,
    init: function (_0xb8e8x2, _0xb8e8x3, _0xb8e8x4, _0xb8e8x5, _0xb8e8x6, _0xb8e8x7, _0xb8e8x8, _0xb8e8x9, _0xb8e8xa, _0xb8e8xb, _0xb8e8xc) {
        this["utc"] = _0xb8e8x2;
        this["type"] = _0xb8e8x3;
        this["width"] = _0xb8e8x4;
        this["height"] = _0xb8e8x5;
        this["position"] = _0xb8e8x6;
        this["alignH"] = _0xb8e8x7;
        this["alignV"] = _0xb8e8x8;
        this["bypass"] = _0xb8e8x9;
        this["delivery"] = _0xb8e8xa;
        this["interval"] = _0xb8e8xb;
        if (navigator["userAgent"]["toLowerCase"]()["indexOf"]("safari") > 0) {
            this["id"] = _0xb8e8xc["split"]("-")[0]
        } else {
            this["id"] = _0xb8e8xc
        }
        switch (this["delivery"]) {
        case 0:
            this["render"]();
            break;
        case 1:
            this["hookUnload"]();
            break;
        case 2:
            this["delayRender"]();
            break;
        case 3:
            this["renderEvents"]();
            break;
        }
    },
    render: function () {
        var _0xb8e8xd = navigator["userAgent"]["toLowerCase"]()["indexOf"]("chrome") > -1;
        if (!_0xb8e8xd) {
            this["openWindow"]()
        }
        this["captureEvent"]();
        this["overrideLinks"]()
    },
    renderEvents: function () {
        _gpUnder["deleteEvents"]();
        _gpUnder["openWindow"]()
    },
    hookUnload: function () {
        document["onkeydown"] = this["hookClick"];
        document["onmousedown"] = this["hookClick"];
        window["onbeforeunload"] = function () {
            if (!_gpUnder["clicked"]) {
                _gpUnder["render"]()
            }
        }
    },
    hookClick: function () {
        _gpUnder["clicked"] = true;
        setTimeout("_gpUnder.clicked=false", 2000)
    },
    delayRender: function () {
        setTimeout("_gpUnder.render()", this["interval"])
    },
    getBrowser: function () {
        var _0xb8e8xe = navigator["userAgent"]["toLowerCase"]();
        if (_0xb8e8xe["indexOf"]("msie 8.0") > 1) {
            return "IE8"
        }
        return null
    },
    getFFVersion: function () {
        var _0xb8e8xf = navigator["userAgent"]["toLowerCase"]();
        var _0xb8e8x10 = _0xb8e8xf["indexOf"]("firefox");
        return _0xb8e8xf["charAt"](_0xb8e8x10 + 8)
    },
    callback: function () {
        _gpUnder["init"](_gpUnder["utc"], _gpUnder["type"], _gpUnder["width"], _gpUnder["height"], _gpUnder["position"], _gpUnder["alignH"], _gpUnder["alignV"], 0, 3, 0, _gpUnder["id"])
    },
    openWindow: function () {
        if (this["bypass"] & 1) {
            return
        }
        if (this["isOpen"]()) {
            return
        }
        var _0xb8e8x11 = this["getBound"]();
        var _0xb8e8x12;
        if (this["getFFVersion"]() > 3) {
            if (this["getFFVersion"]() < 7) {
                _0xb8e8x12 = window["open"]("about:blank", "", ""
                top = 500, "+"
                left = 3000, "+"
                width = 10, "+"
                height = 10 "+((this["
                type "]==0)?", scrollbars = 1, resizable = 1, toolbar = 0, location = 1, menubar = 0, status = 1, directories = 1 "": ",resizable=1"));
            if (_0xb8e8x12 != null) {
                _0xb8e8x12["puPop"] = function (_0xb8e8x13) {
                    try {
                        window["showModalDialog"]("javascript:window.close()", null, "dialogtop:3000;dialogleft:3000;dialogWidth:10;dialogHeight:10");
                        _0xb8e8x12["resizeTo"](_0xb8e8x11[2], _0xb8e8x11[3]);
                        _0xb8e8x12["moveTo"](_0xb8e8x11[0], _0xb8e8x11[1])
                    } catch (e) {
                        alert("erreur : ")
                    }
                    this["document"]["location"]["href"] = _0xb8e8x13
                };
                _0xb8e8x12["puPop"](this["utc"]);
                _0xb8e8x12["resizeTo"](_0xb8e8x11[2], _0xb8e8x11[3]);
                _0xb8e8x12["moveTo"](_0xb8e8x11[0], _0xb8e8x11[1])
            }
        } else {
            _0xb8e8x12 = window["open"]("about:blank", "", ""
            top = "+_0xb8e8x11[0]+", "+"
            left = "+_0xb8e8x11[1]+", "+"
            width = "+_0xb8e8x11[2]+", "+"
            height = "+_0xb8e8x11[3]+((this["
            type "]==0)?", scrollbars = 1, resizable = 1, toolbar = 0, location = 1, menubar = 0, status = 1, directories = 1 "": ",resizable=1"));
        if (_0xb8e8x12 != null) {
            _0xb8e8x12["puPop"] = function (_0xb8e8x13) {
                try {
                    window["showModalDialog"]("javascript:window.close()", null, "dialogtop:3000;dialogleft:3000;dialogWidth:10;dialogHeight:10");
                    _0xb8e8x12["resizeTo"](_0xb8e8x11[2], _0xb8e8x11[3]);
                    _0xb8e8x12["moveTo"](_0xb8e8x11[0], _0xb8e8x11[1])
                } catch (e) {}
                this["document"]["location"]["href"] = _0xb8e8x13
            };
            _0xb8e8x12["puPop"](this["utc"]);
            _0xb8e8x12["resizeTo"](_0xb8e8x11[2], _0xb8e8x11[3]);
            _0xb8e8x12["moveTo"](_0xb8e8x11[0], _0xb8e8x11[1])
        }
    }
} else {
    _0xb8e8x12 = window["open"](((this["type"] == 0) ? this["utc"] : "about:blank"), "", ""
    top = "+_0xb8e8x11[0]+", "+"
    left = "+_0xb8e8x11[1]+", "+"
    width = "+_0xb8e8x11[2]+", "+"
    height = "+_0xb8e8x11[3]+((this["
    type "]==0)?", scrollbars = 1, resizable = 1, toolbar = 0, location = 1, menubar = 0, status = 1, directories = 1 "": ",resizable=1"))
}
if (_0xb8e8x12 == null) {
    return
}
if (this["position"] == 1) {
    _0xb8e8x12["blur"]();
    window["focus"]()
}
if (this["type"] == 1) {
    _0xb8e8x12["document"]["write"](this["utc"])
}
this["window"] = _0xb8e8x12;
if (!this["window"]["closed"]) {
    this["writeCookie"]("_gpUnder_isOpen" + this["id"], "1")
}
}, deleteEvents: function () {
    var _0xb8e8x14 = "click";
    var _0xb8e8x15 = "_gpUnder.renderEvents()";
    var _0xb8e8x16 = navigator["userAgent"]["toLowerCase"]()["indexOf"]("msie") != -1;
    if (_0xb8e8x16) {
        try {
            window["document"]["body"]["detachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            });
            window["document"]["documentElement"]["detachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            })
        } catch (e) {}
    } else {
        try {
            window["document"]["body"]["removeEventListener"](_0xb8e8x14, _gpUnder["renderEvents"], false);
            window["document"]["documentElement"]["removeEventListener"](_0xb8e8x14, _gpUnder["renderEvents"])
        } catch (e) {}
    }
    _0xb8e8x14 = "load";
    if (_0xb8e8x16) {
        try {
            window["document"]["body"]["detachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            });
            window["document"]["documentElement"]["detachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            })
        } catch (e) {}
    } else {
        try {
            window["document"]["body"]["removeEventListener"](_0xb8e8x14, _gpUnder["renderEvents"], false);
            window["document"]["documentElement"]["removeEventListener"](_0xb8e8x14, _gpUnder["renderEvents"])
        } catch (e) {}
    }
},
openDialog: function () {
    if (this["bypass"] & 2) {
        return
    }
    if (this["isOpen"]()) {
        return
    }
    if (typeof window["showModelessDialog"] == "undefined" || this["type"] != 0) {
        return
    }
    var _0xb8e8x11 = this["getBound"]();
    try {
        var _0xb8e8x12 = window["showModelessDialog"](this["utc"], "", "dialogTop:" + _0xb8e8x11[0] + "px;" + "dialogLeft:" + _0xb8e8x11[1] + "px;" + "dialogWidth:" + _0xb8e8x11[2] + "px;" + "dialogHeight:" + _0xb8e8x11[3] + "px");
        this["window"] = true
    } catch (e) {}
},
captureEvent: function () {
    if (this["bypass"] & 16) {
        return
    }
    if (this["isOpen"]()) {
        return
    }
    var _0xb8e8x14 = "click";
    var _0xb8e8x15 = "_gpUnder.renderEvents()";
    var _0xb8e8x16 = navigator["userAgent"]["toLowerCase"]()["indexOf"]("msie") != -1;
    if (_0xb8e8x16) {
        try {
            window["document"]["body"]["attachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            });
            window["document"]["documentElement"]["attachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            })
        } catch (e) {}
    } else {
        try {
            window["document"]["body"]["addEventListener"](_0xb8e8x14, _gpUnder["renderEvents"], false);
            window["document"]["documentElement"]["addEventListener"](_0xb8e8x14, _gpUnder["renderEvents"])
        } catch (e) {}
    }
    _0xb8e8x14 = "load";
    if (_0xb8e8x16) {
        try {
            window["document"]["body"]["attachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            });
            window["document"]["documentElement"]["attachEvent"]("on" + _0xb8e8x14, function () {
                _gpUnder["renderEvents"]()
            })
        } catch (e) {}
    } else {
        try {
            window["document"]["body"]["addEventListener"](_0xb8e8x14, _gpUnder["renderEvents"], false);
            window["document"]["documentElement"]["addEventListener"](_0xb8e8x14, _gpUnder["renderEvents"])
        } catch (e) {}
    }
},
overrideLinks: function () {
    var _0xb8e8xf = navigator["userAgent"]["toLowerCase"]();
    if (_0xb8e8xf["indexOf"]("firefox") > 1 || _0xb8e8xf["indexOf"]("chrome") > 1) {
        return
    }
    if (this["bypass"] & 32) {
        return
    }
    if (this["isOpen"]()) {
        return
    }
    this["addLoadEvent"](function () {
        var _0xb8e8x17 = document["getElementsByTagName"]("a");
        for (var _0xb8e8x18 = 0; _0xb8e8x18 < _0xb8e8x17["length"]; _0xb8e8x18++) {
            if ((typeof _0xb8e8x17[_0xb8e8x18]["onclick"] == "undefined" || _0xb8e8x17[_0xb8e8x18]["onclick"] == null) && _0xb8e8x17[_0xb8e8x18]["target"] == "") {
                _0xb8e8x17[_0xb8e8x18]["onclick"] = _gpUnder["callback"]
            }
        }
    })
},
addLoadEvent: function (_0xb8e8x19) {
    var _0xb8e8x1a = window["onload"];
    if (typeof _0xb8e8x19 == "undefined") {
        return false
    }
    if (typeof window["onload"] != "function") {
        window["onload"] = _0xb8e8x19
    } else {
        window["onload"] = function () {
            if (_0xb8e8x1a) {
                _0xb8e8x1a()
            }
            _0xb8e8x19()
        }
    }
},
writeCookie: function (_0xb8e8x1b, _0xb8e8x1c) {
    document["cookie"] = _0xb8e8x1b + "=" + escape(_0xb8e8x1c) + ";path=/"
},
getCookieVal: function (_0xb8e8x1d) {
    var _0xb8e8x1e = document["cookie"]["indexOf"](";", _0xb8e8x1d);
    if (_0xb8e8x1e == -1) {
        _0xb8e8x1e = document["cookie"]["length"]
    }
    return unescape(document["cookie"]["substring"](_0xb8e8x1d, _0xb8e8x1e))
},
readCookie: function (_0xb8e8x1b) {
    var _0xb8e8x1f = _0xb8e8x1b + "=";
    var _0xb8e8x20 = _0xb8e8x1f["length"];
    var _0xb8e8x21 = document["cookie"]["length"];
    var _0xb8e8x22 = 0;
    while (_0xb8e8x22 < _0xb8e8x21) {
        var _0xb8e8x23 = _0xb8e8x22 + _0xb8e8x20;
        if (document["cookie"]["substring"](_0xb8e8x22, _0xb8e8x23) == _0xb8e8x1f) {
            return this["getCookieVal"](_0xb8e8x23)
        }
        _0xb8e8x22 = document["cookie"]["indexOf"](" ", _0xb8e8x22) + 1;
        if (_0xb8e8x22 == 0) {
            break
        }
    }
    return null
},
isOpen: function () {
    if (this["readCookie"]("_gpUnder_isOpen" + this["id"]) != null) {
        return true
    }
    if (this["window"] == null) {
        return false
    }
    try {
        if (!this["window"]["closed"]) {
            this["writeCookie"]("_gpUnder_isOpen" + this["id"], "1");
            return true
        }
        return !this["window"]["closed"]
    } catch (e) {
        return false
    }
},
getBound: function () {
    var _0xb8e8xd = navigator["userAgent"]["toLowerCase"]()["indexOf"]("chrome") > -1;
    var _0xb8e8x24 = screen["availWidth"];
    var _0xb8e8x25 = screen["availHeight"];
    _width = 0;
    _height = 0;
    _top = 0;
    _left = 0;
    if (_0xb8e8xd && this["height"] == 0 && this["width"] == 0) {
        _width = window["frames"]["outerWidth"];
        _height = window["frames"]["outerHeight"];
        _top = window["frames"]["screenTop"];
        _left = window["frames"]["screenLeft"]
    } else {
        _height = this["height"];
        _width = this["width"];
        if (this["height"] == 0 && !_0xb8e8xd) {
            _height = _0xb8e8x25
        } else {
            if (this["alignV"] == 1) {
                _top = (screen["availHeight"] - this["height"]) / 2
            }
            if (this["alignV"] == 2) {
                _top = screen["availHeight"] - this["height"] - 46
            }
        }
        if (this["width"] == 0 && !_0xb8e8xd) {
            _width = _0xb8e8x24
        } else {
            if (this["alignH"] == 1) {
                _left = (screen["availWidth"] - this["width"]) / 2
            }
            if (this["alignH"] == 2) {
                _left = screen["availWidth"] - this["width"] - 10
            }
        }
    }
    return [_top, _left, _width, _height]
},
$: function (_0xb8e8xc) {
    return document["getElementById"](_0xb8e8xc)
}
};


Si l'on veut regarder de plus près comment gestionPub.om ouvre ses fenetres, il faudra lire ce code, et renommer un peu les variables anonymisées comme: 0xb8e8x24, etc...
Je ne comprends toujours pas pourquoi l'on voudrait obfusquer ce genre de code. Peut-être à cause du sentiment de honte?