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="";

Aucun commentaire:

Enregistrer un commentaire