2010-05-19 10 views
12

這是什麼怪物?任何人都知道一種使其可讀性的方法?Deobfuscating Javascript

<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> 
+0

對不起,我接近的選票。經過進一步的考慮,我認爲這個問題可能有足夠的不同,它實際上並不重複,但無法找到收回近距離投票的方式。 – JohnFx 2010-05-19 15:58:10

回答

21

這是一個真正混淆的版本:

document.writeln("<a href=\"mailto:[email protected]\" title=\"Contact\">Contact</a>"); 

我認爲這是混淆這大大避免了垃圾郵件發送者。但當然spambots可能只是使用Webkit渲染頁面並遍歷DOM的電子郵件地址...;)

那麼..如何去混淆?

  1. 轉到http://jsbeautifier.org/
  2. 粘貼源和美化它
  3. 編輯功能f(x)它確實是這樣的console.log(o)代替return o
  4. 執行修改後的代碼和美化其輸出。
  5. 重複步驟2-4,直到它可讀。
+2

根據[本測試],(http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/),似乎並不多那些實際評估JavaScript的垃圾郵件(請參閱ROT13變體)。嗯,我應該這樣說嗎? – 2010-05-19 18:51:36

4

有用於混淆那些代碼主要有兩個原因:

  1. 是誰寫的並不想提供可讀形式的代碼竊取他的知識產權
  2. 病毒,以避免此人,間諜軟件,...

在第一種情況下,我會建議你問筆者爲您提供的源代碼。

+1

這個答案應該是一個評論。但是,謝謝。 – 2010-05-19 15:47:07

+0

@大衛「任何人都知道一種使其可讀性的方法?」 - 「(通過)要求作者爲您提供源代碼」。這是一個有效的答案。 – Cam 2010-05-19 15:50:13

+0

誠然,技術上來說,它是一個有效的答案......它只是一個有效的說「問Google」。 @達琳:我不想聽起來那麼不值得去......這不是我所知道的。您的意見非常有用。所以謝謝。哦,你錯過了第3點:模糊機器人的電子郵件地址。 – 2010-05-19 16:01:39

2

你必須從這個字符串中解開它,大部分工作都是手動的,因爲它的一部分看起來是編碼的。

但我同意Darin。詢問作者未混淆的來源。

4

這是做這樣的事情:

document.writeln("< a href=\"mailto:[email protected]\" 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

3

編輯:看起來有些人打敗了我。謝謝!


從一些大槍(5位代表分)接收到的無用的「答案」後,我決定去混淆它自己:

document.writeln("<a href=\"mailto:[email protected]\" 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); 
    }