JavaScript - почему этот код предупреждает сообщение?
Я не знаю много о JavaScript, но я нашел этот код как часть кода игрового движка. Я попытался проверить это, потому что я заметил, что эта часть кода предупреждает сообщение, и я действительно не могу понять, как. Вот минимальный код (я сократил его, извлек из исходного скрипта и изменил имена переменных на отдельные буквы):
var a = '͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏';
var b = a.match(/.{8}/g);
var c = b.map(a => [...a].map(a => a == '' | 0));
var d = c.map(a => parseInt(a.join``, 2).toString(16));
var e = d.map(a => eval(`'\\x${a.padStart(2, 0)}'`));
var f = eval(e.join``);
Я пытаюсь понять, как им удается предупредить сообщение. Это номер предупреждения 12345
, но как? Я вижу некоторые eval
здесь, так что я предполагаю, что они делают код на лету, но все же я попытался использовать debugger
но я не мог найти объяснения. Они как-то генерируют код и выполняют его, я до сих пор не могу понять, как это сделать.
Я попробовал этот код в jsFiddle, и он все еще работает, и я попытался в Node.js, и он выдает ошибку alert
не определен, так что я почти уверен, что все, что делает этот код, это предупредить сообщение.
Какой трюк они использовали здесь? Как они делают и оценивают код и как им удается предупредить сообщение? Это какая-то надпись или как?
Мой вопрос не имеет абсолютно никакого отношения к этому вопросу.
1 ответ
Код все там, спрятан в переменной a
, Нет, это не пустая строка, это строка, состоящая из 1888 невидимых символов - либо \u034f
или же \u202a
точнее. Так что это на самом деле просто замаскированная двоичная кодировка.
Часть кода
var b = a.match(/.{8}/g);
var c = b.map(a => [...a].map(a => a == '' | 0));
var d = c.map(a => parseInt(a.join``, 2).toString(16));
разбивает их на куски по 8, а затем преобразует каждый кусок из массива символов в массив логических значений (точнее, целых чисел 0
а также 1
) - обратите внимание, что он сравнивает персонажа с невидимым \u202a
, а затем преобразует каждый массив из 8 логических значений (о, смотри, октет!) в фактический байт и получает его шестнадцатеричное представление. Вот шестнадцатеричная строка (d.join('')
):
5f3d275b7e5b28706d7177747b6e7b7c7d7c7b747d79707c7d6d71777c7b5d5d282875716e727c7d79767a775d2b7173737b737b7b737b7b7b6d7a775d2928297e5d5b28755b7d795b785d7d5b6f5d2971776e7c7d725d5d7d2b6f7c792175712b217d7a5b217d7b795d2b2878216f772b5b7d5d76782b5b7e2975787d2974796f5b6f5d7d295b735d2b7a727c217d7b7b7c7b715b7b705b7e7d297a7b6f5b5d6e79757a6d792176273b666f722869206f66276d6e6f707172737475767778797a7b7c7d7e272977697468285f2e73706c6974286929295f3d6a6f696e28706f702829293b6576616c285f29
Часть
d.map(a => eval(`'\\x${a.padStart(2, 0)}'`));
каждый из них разбирается на персонажа, используя обратную косую черту. String.fromCharCode
был бы более простой выбор. Так же padStart
здесь даже не требуется, учитывая, что ни один из байтов не является управляющим символом со значением байта меньше 16. Возможно, это было бы более знакомо:
"\ X5f\x3d\x27\ X5b \ x7E \ X5b\x28\x70\x6d\x71\x77\x74\x7b\x6e\x7b\x7c\x7d\x7c\x7b\x74\x7d\x79\x70\x7c\x7d\x6d\x71\x77\x7c\x7b\ X5D \ X5D \x28\x28\x75\x71\x6e\x72\x7c\x7d\x79\x76\x7a\x77\ X5D \x2b\x71\x73\x73\x7b\x73\x7b\x7b\x73\x7b\x7b\x7b\x6d\x7a\x77\ X5D \x29\x28\x29\x7E \ X5D \ X5b\x28\x75\ X5b \ x7d \ x79 \ X5b\x78\ X5D \ x7d \ X5b \ x6f \ X5D \x29\x71\x77\x6e\x7c\x7d\x72\ X5D \ X5D \x7d\x2b\x6f\x7c\x79\x21\x75\x71\x2b\x21\x7d\x7a\ X5b\x21\x7d\x7b\x79\ X5D \x2b\x28\x78\x21\x6f\x77\x2b\ X5b \ x7d \ X5D \x76\x78\x2b\ X5b \ x7E \x29\x75\x78\x7d\x29\x74\x79\x6f\ X5b \ x6f \ X5D \ x7d \ x29 \ X5b\x73\ X5D \x2b\x7a\x72\x7c\x21\x7d\x7b\x7b\x7c\x7b\x71\ X5b\x7b\x70\ X5b \ x7E \ x7d \ x29 \ x7a \ x7b \ x6f \ X5b \ X5D \x6e\x79\x75\x7a\x6d\x79\x21\x76\x27\ X3B \ x66 \ x6f \ x72 \ x28 \ x69 \ x20 \ x6f \ x66 \ x27 \ x6d \ x6e \ x6f \ x70 \ x71 \ x72 \ x73 \ x74 \ x75 \ x76 \ x77 \ x78 \ x79 \ x7a \ x7b \ x7c \ x7d \ x7E \ x27 \ x29 \ x77 \ x69 \ x74 \ x68 \ x28 \ x5f \ x2e \ x73 \ x70 \ x6c \ x69 \ x74 \ x28 \ x69 \ x29 \ x29 \ x5f \ x3d \ X6a \ x6f \ x69 \ x6e \ x28 \ x70 \ x6f \ x70 \ x28 \ x29 \ x29 \ X3B \ x65 \ x76 \ x61 \ x6c \ x28 \ x5f \ x29"
Эта строка eval
редактировать в последней строке. Но удивительно, содержание этой строки просто
_='[~[(Pmqwt{п {|}|{т} YP |} MQW |{]]((uqnr|}yvzw]+ QSS {s{{s{{{mzw])()~][(и [} у [х]}[O])qwn|} г]]}+ о |!!! у ид +} г [}{у] + (! х вл +[}] ъх +[~) щ})tyo[o]})[s]+zr|!}{{|{q[{p[~})z{o[]nyuzmy!v'; для (i of'mnopqrstuvwxyz{|}~') с (_.split(я))_= Join (поп ()); Eval(_)
Так, что делает - все еще запутанный - код делает?
var _='[~[(pmqwt{n{|}|{t}yp|}mqw|{]]((uqnr|}yvzw]+qss{s{{s{{{mzw])()~][(u[}y[x]}[o])qwn|}r]]}+o|y!uq+!}z[!}{y]+(x!ow+[}]vx+[~)ux})tyo[o]})[s]+zr|!}{{|{q[{p[~})z{o[]nyuzmy!v';
for (var i of 'mnopqrstuvwxyz{|}~')
with (_.split(i))
_=join(pop());
eval(_)
Удаление with
магия, мы получаем
for (var i of 'mnopqrstuvwxyz{|}~') {
let temp = _.split(i);
_ = temp.join(temp.pop());
}
Так что для всех этих персонажей из m
в z
расщепляется _
тем самым вынимает последнюю часть и объединяет ее, эффективно
- замена
m
отy!v
, - замена
n
отyuz
, - замена
o
от[]
, - замена
p
от[~})z{
, - замена
q
от[{
, - замена
r
от|!}{{|{
, - замена
s
от]+z
, - замена
t
отy[][[]]})[
, - замена
u
отx})
, - замена
v
отx+[~)
, - замена
w
от+[}]
, - замена
x
от![]
, - замена
y
от]+(
, - замена
z
от[!}{
, - замена
{
от+!}
, - замена
|
от]+(!![]})[
, - замена
}
от+[]
, - замена
~
от][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]
и после всего, что мы получаем за _
быть eval
редактировать код
[] [(! [] + []) [+ []] + ([! []] + [] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]] [([] [(! [] + []) [+ []] + ([! []] + [ ] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [ + []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]] + [ ]) [! + [] +! + [] +! + []] + (!! [] + [] [(! [] + []) [+ []] + ([! []] + [ ] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [ + []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]]) [ +! + [] + [+ []]] + ([] [[]] + []) [+! + []] + (! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + []) [+! + []] + ([] [[]] + []) [+ []] + ([] [(! [] + []) [+ []] + ([! []] + [] [[]]) [+! + [] + [+ []] ] + (! [] + []) [! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + []) [! + [ ] +! + [] +! + []] + (!! [] + []) [+! + []]] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + [] [(! [] + []) [+ []] + ([! []] + [] [[ ]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [+ [] ] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]]) [+! + [] + [+ []]] + (!! [] + []) [+! + []]] ((! [] + []) [+! + []] + (! [] + [ ]) [! + [] +! + []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [ +! + []] + (!! [] + []) [+ []] + (! [] + [] [(! [] + []) [+ []] + ([! []] + [] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]]) [! + [] +! + [] + [+ []]] + [+! + []] + [! + [] +! + []] + [! + [] +! + [] +! + []] + [! + [] +! + [] +! + [] +! + []] + [! + [] +! + [] +! + [] +! + [] +! + []] + (!! [] + [] [(! [] + []) [+ []] + ([! []] + [] [[]]) [+! + [] + [ + []]] + (! [] + []) [! + [] +! + []] + (!! [] + []) [+ []] + (!! [] + []) [! + [] +! + [] +! + []] + (!! [] + []) [+! + []]]) [! + [] +! + [] + [+ [] ]]) ()
Теперь это не выглядит знакомым? Это старый добрый jsfuck!
Я нашел этот код как часть кода игрового движка
Я сомневаюсь. Больше похоже на представление в контекст обфускации кода. Тем не менее, это не похоже на то, что оно было сделано вручную, скорее всего, кто-то просто слепо связал несколько инструментов для запутывания вместе.