[JavaScript] Снова обфускация

Вариантов обфускации кода тысячи. А может и больше. Сейчас будет рассмотрен один из них. Он не новый, но все же достаточно интересный, так как является уж очень легко узнаваемым и отпугивающим (но это только на первый взгляд).
В одном из квестов было задание, связанное с виджетом для Оперы (ссылка на виджет). Известно, что внутри виджета есть js. Заданием было получить ответ.
1
Виджет анализировал введенный текст и, если он соответствует требуемому, то выводится ответ, если не соответствует, то выводится то, что ввел пользователь.
Практически весь внутренний код не представляет трудностей, кроме одной строки (файл index.html строка 27):

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"\\"+$.__$+$.$_$+$.__$+$.$$$$+"\\"+$.$__+$.___+"("+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.___+$.$_$+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.__$+$.___+$._$_+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.__$+$.__$+$.$$_$+"('"+$.$$$$+"\\"+$.__$+$.$$_+$._$_+$._$+"\\"+$.__$+$.$_$+$.$$_+$.__+(![]+"")[$._$_]+$.$_$_+$.$_$$+$.$$$_+(![]+"")[$._$_]+"').\\"+$.__$+$.$$_+$.$$_+$.$_$_+(![]+"")[$._$_]+$._+$.$$$_+"\\"+$.$__+$.___+"==\\"+$.$__+$.___+"'\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+$.$$_$+$._$+"\\"+$.__$+$.$$_+$.$$$+"."+(![]+"")[$._$_]+$._$+$.$$__+$.$_$_+$.__+"\\"+$.__$+$.$_$+$.__$+$._$+"\\"+$.__$+$.$_$+$.$$_+".\\"+$.__$+$.$_$+$.___+"\\"+$.__$+$.$$_+$._$_+$.$$$_+$.$$$$+"')\\"+$.$__+$.___+"{\\"+$.__$+$.$_$+"\\"+$.__$+$._$_+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.___+$.$_$+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.__$+$.___+$._$_+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.__$+$.__$+$.$$_$+"('\\"+$.__$+$.$_$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+$.__+$.$$$_+"\\"+$.__$+$.$$$+$.___+$.__+"')."+$.__+$.$$$_+"\\"+$.__$+$.$$$+$.___+$.__+"\\"+$.__$+$.___+$._$$+$._$+"\\"+$.__$+$.$_$+$.$$_+$.__+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.$__+$.___+"=\\"+$.$__+$.___+"'"+$.$$$$+"*"+$.$$__+"\\"+$.__$+$.$_$+$._$$+"_\\"+$.__$+$.$$$+$.__$+$.$$$_+$.$_$_+"';\\"+$.__$+$.$_$+"\\"+$.__$+$._$_+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"}\\"+$.__$+$.$_$+"\\"+$.__$+$._$_+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+$.$$$_+(![]+"")[$._$_]+"\\"+$.__$+$.$$_+$._$$+$.$$$_+"\\"+$.$__+$.___+"{\\"+$.__$+$.$_$+"\\"+$.__$+$._$_+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.___+$.$_$+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.__$+$.___+$._$_+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.__$+$.__$+$.$$_$+"('\\"+$.__$+$.$_$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+$.__+$.$$$_+"\\"+$.__$+$.$$$+$.___+$.__+"')."+$.__+$.$$$_+"\\"+$.__$+$.$$$+$.___+$.__+"\\"+$.__$+$.___+$._$$+$._$+"\\"+$.__$+$.$_$+$.$$_+$.__+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.$__+$.___+"=\\"+$.$__+$.___+$.$$_$+$._$+$.$$__+$._+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+".\\"+$.__$+$.$__+$.$$$+$.$$$_+$.__+"\\"+$.__$+$.___+$.$_$+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$_$+$.$_$+$.$$$_+"\\"+$.__$+$.$_$+$.$$_+$.__+"\\"+$.__$+$.___+$._$_+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.__$+$.__$+$.$$_$+"('"+$.$$$$+"\\"+$.__$+$.$$_+$._$_+$._$+"\\"+$.__$+$.$_$+$.$$_+$.__+(![]+"")[$._$_]+$.$_$_+$.$_$$+$.$$$_+(![]+"")[$._$_]+"').\\"+$.__$+$.$$_+$.$$_+$.$_$_+(![]+"")[$._$_]+$._+$.$$$_+";\\"+$.__$+$.$_$+"\\"+$.__$+$._$_+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"\\"+$.__$+$.__$+"}"+"\"")())();

Первое, что мы делаем, это прогоняем код через http://jsbeautifier.org/:

$ = ~ [];
$ = {
    ___: ++$,
    $$$$: (![] + "")[$],
    __$: ++$,
    $_$_: (![] + "")[$],
    _$_: ++$,
    $_$$: ({} + "")[$],
    $$_$: ($[$] + "")[$],
    _$$: ++$,
    $$$_: (!"" + "")[$],
    $__: ++$,
    $_$: ++$,
    $$__: ({} + "")[$],
    $$_: ++$,
    $$$: ++$,
    $___: ++$,
    $__$: ++$
};
$.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$;
$.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$;
$.$ = ($.___)[$.$_][$.$_];
$.$($.$($.$$ + "\"" + "\\" + $.__$ + $.$_$ + $.__$ + $.$$$$ + "\\" + $.$__ + $.___ + "(" + $.$$_$ + $._$ + $.$$__ + $._ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + ".\\" + $.__$ + $.$__ + $.$$$ + $.$$$_ + $.__ + "\\" + $.__$ + $.___ + $.$_$ + (![] + "")[$._$_] + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.__$ + $.___ + $._$_ + "\\" + $.__$ + $.$$$ + $.__$ + "\\" + $.__$ + $.__$ + $.__$ + $.$$_$ + "('" + $.$$$$ + "\\" + $.__$ + $.$$_ + $._$_ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + (![] + "")[$._$_] + $.$_$_ + $.$_$$ + $.$$$_ + (![] + "")[$._$_] + "').\\" + $.__$ + $.$$_ + $.$$_ + $.$_$_ + (![] + "")[$._$_] + $._ + $.$$$_ + "\\" + $.$__ + $.___ + "==\\" + $.$__ + $.___ + "'\\" + $.__$ + $.$$_ + $.$$$ + "\\" + $.__$ + $.$_$ + $.__$ + "\\" + $.__$ + $.$_$ + $.$$_ + $.$$_$ + $._$ + "\\" + $.__$ + $.$$_ + $.$$$ + "." + (![] + "")[$._$_] + $._$ + $.$$__ + $.$_$_ + $.__ + "\\" + $.__$ + $.$_$ + $.__$ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + ".\\" + $.__$ + $.$_$ + $.___ + "\\" + $.__$ + $.$$_ + $._$_ + $.$$$_ + $.$$$$ + "')\\" + $.$__ + $.___ + "{\\" + $.__$ + $.$_$ + "\\" + $.__$ + $._$_ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + $.$$_$ + $._$ + $.$$__ + $._ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + ".\\" + $.__$ + $.$__ + $.$$$ + $.$$$_ + $.__ + "\\" + $.__$ + $.___ + $.$_$ + (![] + "")[$._$_] + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.__$ + $.___ + $._$_ + "\\" + $.__$ + $.$$$ + $.__$ + "\\" + $.__$ + $.__$ + $.__$ + $.$$_$ + "('\\" + $.__$ + $.$_$ + $.___ + $.$$$_ + (![] + "")[$._$_] + (![] + "")[$._$_] + $._$ + $.__ + $.$$$_ + "\\" + $.__$ + $.$$$ + $.___ + $.__ + "')." + $.__ + $.$$$_ + "\\" + $.__$ + $.$$$ + $.___ + $.__ + "\\" + $.__$ + $.___ + $._$$ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.$__ + $.___ + "=\\" + $.$__ + $.___ + "'" + $.$$$$ + "*" + $.$$__ + "\\" + $.__$ + $.$_$ + $._$$ + "_\\" + $.__$ + $.$$$ + $.__$ + $.$$$_ + $.$_$_ + "';\\" + $.__$ + $.$_$ + "\\" + $.__$ + $._$_ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "}\\" + $.__$ + $.$_$ + "\\" + $.__$ + $._$_ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + $.$$$_ + (![] + "")[$._$_] + "\\" + $.__$ + $.$$_ + $._$$ + $.$$$_ + "\\" + $.$__ + $.___ + "{\\" + $.__$ + $.$_$ + "\\" + $.__$ + $._$_ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + $.$$_$ + $._$ + $.$$__ + $._ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + ".\\" + $.__$ + $.$__ + $.$$$ + $.$$$_ + $.__ + "\\" + $.__$ + $.___ + $.$_$ + (![] + "")[$._$_] + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.__$ + $.___ + $._$_ + "\\" + $.__$ + $.$$$ + $.__$ + "\\" + $.__$ + $.__$ + $.__$ + $.$$_$ + "('\\" + $.__$ + $.$_$ + $.___ + $.$$$_ + (![] + "")[$._$_] + (![] + "")[$._$_] + $._$ + $.__ + $.$$$_ + "\\" + $.__$ + $.$$$ + $.___ + $.__ + "')." + $.__ + $.$$$_ + "\\" + $.__$ + $.$$$ + $.___ + $.__ + "\\" + $.__$ + $.___ + $._$$ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.$__ + $.___ + "=\\" + $.$__ + $.___ + $.$$_$ + $._$ + $.$$__ + $._ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + ".\\" + $.__$ + $.$__ + $.$$$ + $.$$$_ + $.__ + "\\" + $.__$ + $.___ + $.$_$ + (![] + "")[$._$_] + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$_$ + $.$$$_ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + "\\" + $.__$ + $.___ + $._$_ + "\\" + $.__$ + $.$$$ + $.__$ + "\\" + $.__$ + $.__$ + $.__$ + $.$$_$ + "('" + $.$$$$ + "\\" + $.__$ + $.$$_ + $._$_ + $._$ + "\\" + $.__$ + $.$_$ + $.$$_ + $.__ + (![] + "")[$._$_] + $.$_$_ + $.$_$$ + $.$$$_ + (![] + "")[$._$_] + "').\\" + $.__$ + $.$$_ + $.$$_ + $.$_$_ + (![] + "")[$._$_] + $._ + $.$$$_ + ";\\" + $.__$ + $.$_$ + "\\" + $.__$ + $._$_ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "\\" + $.__$ + $.__$ + "}" + "\"")())();

Вроде бы что то поменялось, но легче стало не на много. Надо бы разобраться, что вообще происходит.
[] — создание пустого массива.
~[] — берется побитовое НЕ (Заменяет каждый бит операнда на противоположный). Получается -1.
$ = {…} — теперь переменной $ присваивается объект.

  • ___: ++$ — свойство ___ получает значение 0.
  • $$$$: (![] + «»)[$] — свойство $$$$ получает значение f. Почему f? ![] возвращает false. Прибавляя пустую строку получаем false (но уже строку). Далее из нее берем первый символ ($ на данный момент 0). Вот так и получается f.
  • __$: ++$ — свойство __$ получает значение 1.
  • $_$_: (![] + «»)[$] — свойство $_$_ получает значение a. Тут аналогично свойству $$$$ (но берется уже не первый, а второй символ)
  • _$_: ++$ -свойство _$_ получает значение 2.
  • $_$$: ({} + «»)[$] — свойство $_$$ получает значение b. Здесь создается объект {} (получается [object]). Далее прибавлением пустой строки получается строка «[object]». Далее с нее берется третий символ. Это b.
  • $$_$: ($[$] + «»)[$] — свойство $$_$ получает значение d. $[$] — это неопреденная величина, посему — undefined. Снова прибавляет пустую строку и получаем строку «undefined». И берем третий символ. Это d.
  • _$$: ++$ — свойство _$$ получает значение 3.
  • $$$_: (!»» + «»)[$] — свойство $$$_ получает значение e. !»» — это true. Прибавили пустую строку — получили строку «true». И берем ее четвертый символ.
  • $__: ++$ — свойство $__ получает значение 4.
  • $_$: ++$ — свойство $_$ получает значение 5.
  • $$__: ({} + «»)[$] — свойство $$__ получает значение c. Аналогично свойству $_$$. Только берем 6 символ.
  • $$_: ++$ — $$_ = 6
  • $$$: ++$ — $$$ = 7
  • $___: ++$ — $___ = 8
  • $__$: ++$ — $__$ = 9

Вот наши «исходные» данные.
Идем дальше.

$.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$;

Свойству $_ объекта $ присваивается значение «constuctor».
Разбирать каждый символ не буду, так как логика здесь такая, как и выше.

$.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$;

Свойству $$ объекта $ присваивается значение «return».

$.$ = ($.___)[$.$_][$.$_];

Далее объявляем функцию.
И теперь используем ее для выполнения зашифрованного кода.
Вначале мы получаем код, который надо выполнить, через «внутренний» вызов $.$. Получается такое:

return "\151f\40(docu\155e\156t.\147et\105le\155e\156t\102\171\111d('f\162o\156tlabel').\166alue\40==\40'\167\151\156do\167.locat\151o\156.\150\162ef')\40{\15\12\11\11\11\11\11\11\11docu\155e\156t.\147et\105le\155e\156t\102\171\111d('\150ellote\170t').te\170t\103o\156te\156t\40=\40'f*c\153_\171ea';\15\12\11\11\11\11\11\11}\15\12\11\11\11\11\11\11el\163e\40{\15\12\11\11\11\11\11\11\11docu\155e\156t.\147et\105le\155e\156t\102\171\111d('\150ellote\170t').te\170t\103o\156te\156t\40=\40docu\155e\156t.\147et\105le\155e\156t\102\171\111d('f\162o\156tlabel').\166alue;\15\12\11\11\11\11\11\11}"

Далее «внешний» вызов $.$ выполняет его. А что же тут скрыто? «\xxx» — это восьмиричный код ascii-символа. Берем таблицу ascii-кодов и получаем скрытый фрагмент (несколько tab’ов я убрал):

if (document.getElementById('frontlabel').value == 'window.location.href') {
	document.getElementById('hellotext').textContent = 'f*ck_yea';
}
else {
	document.getElementById('hellotext').textContent = document.getElementById('frontlabel').value;
}

Вот он — требуемый результат!

P.S. Конечно, вручную такую обфускацию делать не резонно. Японцы уже это автоматизировали — клац.

, ,

Оставить комментарий

Top ↑ | Main page | Back