JavaScript代码的反混淆

12

这是什么怪物?有没有办法使它更易读?

<script type="text/javascript"> 
    //<![CDATA[
    <!--
    var x="function f(x){var i,o=\"\",l=x.length;for(i=0;i<l;i+=2) {if(i+1<l)o+=" +
    "x.charAt(i+1);try{o+=x.charAt(i);}catch(e){}}return o;}f(\"ufcnitnof x({)av" +
    " r,i=o\\\"\\\"o,=l.xelgnhtl,o=;lhwli(e.xhcraoCedtAl(1/)3=!76{)rt{y+xx=l;=+;" +
    "lc}tahce({)}}of(r=i-l;1>i0=i;--{)+ox=c.ahAr(t)i};erutnro s.buts(r,0lo;)f}\\" +
    "\"(0),9\\\"\\\\$.;(.34U03\\\\\\\\16\\\\0E\\\\NSCZhC24\\\\03\\\\01\\\\\\\\St" +
    "DEMPbM02\\\\0C\\\\x#opms58aJ}qb<jb7`17\\\\\\\\hc7s17\\\\\\\\rzEeljdp7m03\\\\"+
    "\\\\36\\\\0F\\\\24\\\\06\\\\01\\\\\\\\25\\\\01\\\\02\\\\\\\\26\\\\03\\\\03\\"+
    "\\\\\\(W4N02\\\\\\\\24\\\\02\\\\00\\\\\\\\07\\\\0N\\\\14\\\\0P\\\\BI07\\\\0" +
    "4\\\\00\\\\\\\\02\\\\02\\\\02\\\\\\\\14\\\\06\\\\02\\\\\\\\24\\\\0L\\\\25\\" +
    "\\06\\\\01\\\\\\\\3:?(>4\\\"\\\\f(;} ornture;}))++(y)^(iAtdeCoarchx.e(odrCh" +
    "amCro.fngriSt+=;o27=1y%i;+=)y90==(iif){++;i<l;i=0(ior;fthnglex.l=\\\\,\\\\\\"+
    "\"=\\\",o iar{vy)x,f(n ioctun\\\"f)\")"                                      ;
    while(x=eval(x));
    //-->
    //]]>
</script> 

抱歉投票关闭了。经过进一步考虑,我认为这个问题可能有足够不同的倾向,实际上并不是重复的,但找不到撤销关闭投票的方法。 - JohnFx
5个回答

23

这是一个非常混淆的版本:

document.writeln("<a href=\"mailto:cameron@curvycorners.net\" title=\"Contact\">Contact</a>");

我认为它被这样混淆是为了避免垃圾邮件发送者。但当然,垃圾邮件机器人可以使用Webkit渲染页面并遍历DOM以获取电子邮件地址……;)

那么...如何去混淆?

  1. 访问 http://jsbeautifier.org/
  2. 粘贴源代码并进行美化
  3. 编辑函数f(x),使其执行console.log(o)而不是return o
  4. 执行修改后的代码并美化其输出。
  5. 重复步骤2-4直到可读。

2
根据这个测试,似乎并没有太多的垃圾邮件机器人会真正评估JavaScript(请参见ROT13变体)。嗯,我应该说这个吗? - Marcel Korpel

4
它正在执行类似于这样的操作:
document.writeln("< a href=\"mailto:cameron@curvycorners.net\" title=\"Contact\">Contact</a>");

因此,像版权声明这样的东西

完整源代码

function f(x, y) {
    var i, o = "", l = x.length;
    for (i = 0; i < l; i++) {
        if (i == 90) {
            y += i;
        }
        y %= 127;
        o += String.fromCharCode(x.charCodeAt(i) ^ y++);
    }
    return o;
}

f(">4?(3:\x0E\x15L\x14\x16\f\x12\x02\x04\x07BIP\fN\x07\x02\x14\x14N(W\x1B\x16\x11\x15\x0E\x14F\x1E\x1FmdpljEerz\x7Fshc\x7F`jbb<}qaJ58msopx#C\x02bMMPDESt\v\x14hCCZNSE\x0E\x1CU.3;($.", 90);

使用Firefox附加组件"Javascript Deobfuscator"完成。


4

混淆代码的主要原因有两个:

  1. 编写者不希望以可读形式提供代码,以避免他的知识产权被盗用。
  2. 病毒、间谍软件等。

对于第一种情况,我建议您向作者请求提供源代码。


1
这个回答应该是一条评论。但还是谢谢。 - David Murdoch
@David:“有人知道如何使它可读吗?” - “(通过)要求作者提供源代码”。这是一个有效的答案。 - Cam
真的,从技术上讲这是一个有效的答案……就像说“问问Google”一样。@Darin:我不想让自己的话听起来没有感激之意……那不是我的意思。你的评论很有用。所以,谢谢你。哦,对了,你错过了第三点:为了将电子邮件地址混淆以避免被机器人抓取。 - David Murdoch

3

编辑:看起来有些人最终还是比我先完成了。谢谢!


在一些权威用户(声望分数为五位数)提供的无用“答案”之后,我决定自己澄清其中的含义:

document.writeln("<a href=\"mailto:cameron@curvycorners.net\" title=\"Contact\">Contact</a>");0;

整个过程只是一种非常夸张的方式来隐藏电子邮件地址。
要做到这一点,请转到您的Firebug控制台并执行以下操作:
    var x="function f(x){var i,o=\"\",l=x.length;for(i=0;i<l;i+=2) {if(i+1<l)o+=" +
    "x.charAt(i+1);try{o+=x.charAt(i);}catch(e){}}return o;}f(\"ufcnitnof x({)av" +
    " r,i=o\\\"\\\"o,=l.xelgnhtl,o=;lhwli(e.xhcraoCedtAl(1/)3=!76{)rt{y+xx=l;=+;" +
    "lc}tahce({)}}of(r=i-l;1>i0=i;--{)+ox=c.ahAr(t)i};erutnro s.buts(r,0lo;)f}\\" +
    "\"(0),9\\\"\\\\$.;(.34U03\\\\\\\\16\\\\0E\\\\NSCZhC24\\\\03\\\\01\\\\\\\\St" +
    "DEMPbM02\\\\0C\\\\x#opms58aJ}qb<jb7`17\\\\\\\\hc7s17\\\\\\\\rzEeljdp7m03\\\\"+
    "\\\\36\\\\0F\\\\24\\\\06\\\\01\\\\\\\\25\\\\01\\\\02\\\\\\\\26\\\\03\\\\03\\"+
    "\\\\\\(W4N02\\\\\\\\24\\\\02\\\\00\\\\\\\\07\\\\0N\\\\14\\\\0P\\\\BI07\\\\0" +
    "4\\\\00\\\\\\\\02\\\\02\\\\02\\\\\\\\14\\\\06\\\\02\\\\\\\\24\\\\0L\\\\25\\" +
    "\\06\\\\01\\\\\\\\3:?(>4\\\"\\\\f(;} ornture;}))++(y)^(iAtdeCoarchx.e(odrCh" +
    "amCro.fngriSt+=;o27=1y%i;+=)y90==(iif){++;i<l;i=0(ior;fthnglex.l=\\\\,\\\\\\"+
    "\"=\\\",o iar{vy)x,f(n ioctun\\\"f)\")"                                      ;
    while(x=eval(x)){
        console.log(x);
    }

2

您需要从字符串中提取它以解压缩,其中很多工作将是手动的,因为其中一些似乎被编码了。

但我同意Darin的观点。请向作者索取未混淆的源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接