Как весело! Вот мой путь. В основном здесь происходит набор чисел и строк, которые присваиваются переменным. Эти переменные объединяются для формирования закодированной строки. Эта закодированная строка декодируется для формирования строки кода JavaScript. Этот код устанавливается как тело функции, которая затем выполняется.
Давайте рассмотрим это построчно:
Строка 1:
゚ω゚ノ = /`m´)ノ ~┻━┻ //*´∇`*/['_'];
゚ω゚ノ
- глобальная переменная
/`m´)ノ ~┻━┻ /
- регулярное выражение
/*´∇`*/
- многострочный комментарий
['_']
- получить свойство _
регулярного выражения.
Поскольку RegExp не имеет свойства _
, переменная ゚ω゚ノ
содержит значение undefined
.
Строка 2:
o = (゚ー゚) = _ = 3;
Определите переменные o
, ゚ー゚
и _
и установите для каждого из их значений значение 3
.
Строка 3:
c = (゚Θ゚) = (゚ー゚) - (゚ー゚);
Определите переменные c
и ゚Θ゚
и установите их значения на 0
. (゚ー゚
равно 3
, поэтому (゚ー゚) - (゚ー゚)
совпадает с ゚ー゚ - ゚ー゚
совпадает с 3 - 3
. Теперь c
и ゚Θ゚
оба содержат 1
;
Строка 4:
(゚Д゚) = (゚Θ゚) = (o ^ _ ^ o) / (o ^ _ ^ o);
Определите переменную ゚Д゚
и переопределите переменную ゚Θ゚
. ^
является побитовым оператором XOR и o
и _
оба 3
.
o ^ _ ^ o
совпадает с 3 ^ 3 ^ 3
.
3 ^ 3
это 0
, 3 ^ 0
это 3
.
Тогда 3 / 3
равно 1
.
゚Д゚
и ゚Θ゚
теперь содержат 1
.
Строка 5:
(゚Д゚) = { ゚Θ゚: '_', ゚ω゚ノ: ((゚ω゚ノ == 3) + '_')[゚Θ゚], ゚ー゚ノ: (゚ω゚ノ + '_')[o ^ _ ^ o - (゚Θ゚)], ゚Д゚ノ: ((゚ー゚ == 3) + '_')[゚ー゚] };
С разрывом строки и отступом:
(゚Д゚) = {
゚Θ゚: '_',
゚ω゚ノ: ((゚ω゚ノ == 3) + '_')[゚Θ゚],
゚ー゚ノ: (゚ω゚ノ + '_')[o ^ _ ^ o - (゚Θ゚)],
゚Д゚ノ: ((゚ー゚ == 3) + '_')[゚ー゚]
};
Переопределить ゚Д゚
как литерал объекта со свойствами ゚Θ゚
, ゚ω゚ノ
, ゚ー゚ノ
и ゚Д゚ノ
.
゚Д゚.゚Θ゚
это "_".
゚Д゚.゚ω゚ノ
это ((undefined == 3) + "_")[1]
, что "false_"[1]
, что "a"
.
゚Д゚.゚ー゚ノ
- это (undefined + "_")[3 ^ 3 ^ 3 - 1]
, что "undefined_"[2]
, что "d"
.
゚Д゚.゚Д゚ノ
это ((3 == 3) + "_")[3]
что "true_"[3]
что "u"
.
Строка 6:
(゚Д゚)[゚Θ゚] = ((゚ω゚ノ == 3) + '_')[c ^ _ ^ o];
То же, что и
゚Д゚.゚Θ゚ = ((undefined == 3) + "_")[1 ^ 3 ^ 3];
Что совпадает с:
゚Д゚.゚Θ゚ = "false_"[1];
То есть ゚Д゚.゚Θ゚
это "a"
.
Строки 7 - 16:
И так продолжается, присваивая строки и числа переменным и свойствам объекта. До последней строки:
Строка 17:
(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ + (゚Д゚)[゚o゚] + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚o゚])(゚Θ゚))('_');
К этому времени у нас есть следующие переменные:
゚ω゚ノ // undefined
o // 3
゚ー゚ // 4
_ // 3
c // 0
゚Θ゚ // 1
゚Д゚ /* {
"1": "f",
゚Θ゚: "_",
゚ω゚ノ: "a",
゚ー゚ノ: "d",
゚Д゚ノ: "e",
c: "c",
o: "o",
return: "\\",
゚Θ゚ノ: "b",
constructor: "\"",
_: Function
} */
゚o゚ // "constructor"
゚ε゚ // "return"
o゚ー゚o // "u"
Эта строка - в основном одна большая конкатенация строк. Мы можем сделать его немного более читабельным, удалив ненужные скобки и добавив разрывы строк:
゚Д゚['_'](
゚Д゚['_'](
゚ε゚ +
゚Д゚[゚o゚] +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
゚Θ゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
(゚ー゚ + ゚Θ゚) +
゚ー゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
(゚ー゚ + ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
((o ^ _ ^ o) - ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
゚ー゚ +
゚Д゚[゚ε゚] +
(゚ー゚ + ゚Θ゚) +
(c ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚ー゚ +
((o ^ _ ^ o) - ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚Θ゚ +
(c ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
(゚ー゚ + ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
(゚ー゚ + ゚Θ゚) +
゚ー゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
(゚ー゚ + ゚Θ゚) +
゚ー゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
(゚ー゚ + ゚Θ゚) +
(゚ー゚ + (o ^ _ ^ o)) +
゚Д゚[゚ε゚] +
(゚ー゚ + ゚Θ゚) +
゚ー゚ +
゚Д゚[゚ε゚] +
゚ー゚ +
(c ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚Θ゚ +
((o ^ _ ^ o) - ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
゚Θ゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
゚Θ゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) - ゚Θ゚) +
(o ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚Θ゚ +
゚ー゚ +
(o ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
((o ^ _ ^ o) - ゚Θ゚) +
゚Д゚[゚ε゚] +
゚Θ゚ +
(゚ー゚ + ゚Θ゚) +
゚Θ゚ +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
(c ^ _ ^ o) +
゚Д゚[゚ε゚] +
゚Θ゚ +
((o ^ _ ^ o) + (o ^ _ ^ o)) +
゚ー゚ +
゚Д゚[゚ε゚] +
゚ー゚ +
((o ^ _ ^ o) - ゚Θ゚) +
゚Д゚[゚ε゚] +
(゚ー゚ + ゚Θ゚) +
゚Θ゚ +
゚Д゚[゚o゚]
)(゚Θ゚)
)("_");
Значение этой объединенной строки:
return"\141\154\145\162\164\50\42\110\145\154\154\157\54\40\112\141\166\141\123\143\162\151\160\164\42\51"
Итак, заменив все переменные литералами, мы получим следующий JavaScript, который выполняется в последней строке:
Function(Function("return\"\\141\\154\\145\\162\\164\\50\\42\\110\\145\\154\\154\\157\\54\\40\\112\\141\\166\\141\\123\\143\\162\\151\\160\\164\\42\\51\"")(1))("_")
Разбивая эту строку, в середине мы видим, что объединенная строка передается конструктору Function
, что делает строку телом функции:
Function("return\"\\141\\154\\145\\162\\164\\50\\42\\110\\145\\154\\154\\157\\54\\40\\112\\141\\166\\141\\123\\143\\162\\151\\160\\164\\42\\51\"")
Итак, эта строка оценивается как JavaScript, и конструктор Function
возвращает эту функцию:
function () {
return"\141\154\145\162\164\50\42\110\145\154\154\157\54\40\112\141\166\141\123\143\162\151\160\164\42\51";
}
Эта функция выполняется немедленно:
Function("return\"\\141\\154\\145\\...\\51\"")(1)
И возвращает строку:
alert("Hello, JavaScript")
Эй, это похоже на JavaScript! Но это еще не так. Это просто строка. Но эта строка передается другому конструктору Function
, что дает нам функцию, которая выполняет строку как JavaScript:
Function("alert(\"Hello, JavaScript\")")
То же самое, что и
function () {
alert("Hello, JavaScript");
}
Эта функция выполняется немедленно:
Function("alert(\"Hello, JavaScript\")")("_")
И наш необоснованный код, наконец, называется.