Деобфускация 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> 

person David Murdoch    schedule 19.05.2010    source источник
comment
Извините за близкое голосование. После дальнейшего рассмотрения я думаю, что в этом вопросе может быть достаточно другой оттенок, что на самом деле он не является дубликатом, но не может найти способ отозвать закрытое голосование.   -  person JohnFx    schedule 19.05.2010


Ответы (5)


Это действительно запутанная версия:

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

Я предполагаю, что это настолько запутано, чтобы избежать спамеров. Но, конечно, спам-боты могут просто отображать страницу с помощью Webkit и просматривать DOM в поисках адресов электронной почты... ;)

Итак... как деобфускировать?

  1. Перейдите на страницу http://jsbeautifier.org/.
  2. Вставьте исходник и украсьте его
  3. Отредактируйте функцию f(x), чтобы она выполняла console.log(o) вместо return o.
  4. Выполните измененный код и украсьте его вывод.
  5. Повторяйте шаги 2-4, пока он не станет читаемым.
person Matt    schedule 19.05.2010
comment
Согласно этому тесту, похоже, не так много спам-ботов, которые действительно оценивают JavaScript (см. вариант ROT13). Хммм, я должен сказать это? - person Marcel Korpel; 19.05.2010

Есть две основные причины запутывания кода:

  1. Человек, написавший это, не хотел предоставлять код в читаемом виде, чтобы избежать кражи его интеллектуальной собственности.
  2. Вирусы, шпионское ПО, ...

В первом случае я бы посоветовал вам попросить автора предоставить вам исходный код.

person Darin Dimitrov    schedule 19.05.2010
comment
Этот ответ должен был быть комментарием. Но спасибо. - person David Murdoch; 19.05.2010
comment
@David Кто-нибудь знает, как сделать его читабельным? - (путем) просьбы автора предоставить вам исходный код. Это был правильный ответ. - person Cam; 19.05.2010
comment
Правда, технически это верный ответ... Это так же верно, как сказать «Спроси у Google». @Darin: Я не хочу показаться неблагодарным... я не об этом. Ваши комментарии полезны. Так что спасибо тебе. о, и вы пропустили пункт 3: чтобы скрыть адрес электронной почты от robots. - person David Murdoch; 19.05.2010

Он делает что-то вроде этого:

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"

person user345201    schedule 19.05.2010

Редактировать: Похоже, некоторые люди все-таки опередили меня. Спасибо!


После бесполезных «Ответов», полученных от некоторых из больших орудий (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);
    }
person David Murdoch    schedule 19.05.2010

Вам придется извлечь его из этой строки, чтобы распаковать, и большая часть этой работы будет выполняться вручную, поскольку некоторые из них, по-видимому, закодированы.

Но я согласен с Дариным. Спросите автора о незапутанном источнике.

person Robert Harvey    schedule 19.05.2010