Pull to refresh

Comments 32

а что делает код по ссылке? напишите под спойлером хотя бы =)
Выводит алерт, там просто
alert("wtf")
Некоторые люди поднимают тему обфускации, но, честно говоря, для этого есть методы получше.

С этого момента можно подробнее?
base64, использование замен символов на их \x и \u коды всё ещё неплохо обфусцирует.
Нет в js нормальной обфускации и быть не может по определению. Вот здесь: https://jsplumbtoolkit.com/ ребята защищают свой продукт (не дешевый ни разу) похожими техниками (как в статье). Толку? У меня один вечер ушел на то чтобы отвязать их продукт от домена (не корысти ради, реально интересно было).
Отвязка от домена это в любом случае нахождение куска кода, который проверяет этот самый домен с зашифрованными внутри себя разрешенными доменами и удаление этого куска. Зная, что такой код должен выполняться как можно раньше, то найти такой кусок довольно просто.

Основная цель обфускации — максимально усложнить понимание логики кода. С этой задачей обфускаторы справляются отлично. Речь, разумеется, о объеме кода 500+ строк.

Например, что делает этот код?
https://gist.github.com/sanex3339/556d5e66ec787f16a6a0fb4b5fd729f6
Вы верно шутите? И судя по всему код по моей ссылке не смотрели. Что касается Вашего упражнения — каждый вызов функции заменяем на toString() и смотрим исходник «обфусцированных» функций.
В результате .toString() вышеуказанного кода вы получите такой же обфусцированный код вида

function _0x1d7251(_0x1daaeb) {
        function _0x389dc4() {
            console[_0x19d4('0x0')](_0x19d4('0x1'), _0x1daaeb[_0x19d4('0x2')]);
        }
        console[_0x19d4('0x0')](_0x19d4('0x3'), _0x1daaeb);
        var _0x1daaeb = {};
        return _0x1daaeb[_0x19d4('0x2')] = 0xf, _0x389dc4();
    }
И? проблема вывести в консоль кто что значит?
Вы действительно думаете что вот это:
var _0x91f14c=[]['\x66\x69\x6c\x74\x65\x72']['\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72']('\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73')();
может кого то остановить? тут вручную можно пройтись и получить:
var _0x91f14c=[].filter.constructor('\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73')(); //this
И так далее по списку.
если текста РЕАЛЬНО много — можно автоматизировать процесс, парсеров хватает.
http://www.jsnice.org помогает, хотя в логику особо и не всматривался. Я так понимаю, там что-то связанное с (де)кодированием в base64 и почему-то метод с названием html5 валяется.
Там 90% кода это защита от деобфускации.
Код вроде экспортирует какую-то функцию фильтрации, примерно так:
module.exports = function(source, fn, target) {
  var hasOwnProperty = Object.prototype.hasOwnProperty;
  if (source.filter)
    return source.filter(fn, target);

  if (undefined === source || null === source)
    throw new TypeError();
  if ('function' != typeof fn)
    throw new TypeError();

  var res = [];
  for (var i = 0; i < source.length; i++) {
    if (!hasOwnProperty.call(source, i))
      continue;
      var el = source[i];
    if (fn.call(target, el, i, source))
      res.push(el);
  }
  return res;
};
JSFuck — излишне нагружает процессор, просто в разы, а так же увеличивает исходный текст.

Методы обфускации, которые реально используются, либо наоборот, за счет переименования, значительно уменьшают объем скрипта, не влияя на его время выполнения, но уменьшая время загрузки.
Либо увеличивают время выполнения незначительно.

одна из тех вещей которые прикольные в теории, но если вы используете их в реальной жизни — с вами серьезно что-то не так…
А говорили С++ сложный и запутанный… Как же они ошибались…
+(«1» + «1») === 11

Вот тут я не очень понял, почему не 12?
Ну то есть я вижу, что в девелопере все верно, но можно пояснить, ведь интуитивно — инкрементация должна была произойти до сравнения?
Хм. вроде сам понял. Инкрементация это если ++

А тут «ничего» добавляется к «11» и получается 11.
UFO just landed and posted this here
Этот сабсет, ИМХО, гораздо полезнее брейнфака. На правах петросяна. Если жизнь и самозародится когда-то в недрах интернета, то как-то вот так вот.
UFO just landed and posted this here
А оно вообще ошибки синтаксиса умеет выдавать? :)
UFO just landed and posted this here
вообще-то
все просто
Это особенность консоли (или функции eval) — eval интерпретирует фигурные скобки не как объект, а как скобочное выражение. eval("{}") -> undefined

"{}[0]" в начале строки интерпретируется как скобочное выражение за которым следует массив (примерно то же самое как написать ";[0]" ). Ну а то, что [0] == 0 и так все знают. А еще eval возвращает значение последнего выражения. Можно было написать 0 == 0 или ;0 == 0 или {}0 == 0, что тоже выглядит странно, но уже не так эффектно.

В правой части {}[0] это нормальный statement, где из пустого объекта пытаются получить свойство 0, результатом которого является, естественно, undefined. Естественно, что 0 != undefined.

Добавление круглых скобок снаружи превращает все выражение в statement, поэтому вычисляется как положено. eval("({})") -> Object
+[] === +![]

По-прежнему забавно. Для ToNumber "[]" проходит через ToPrimitive, который пуст. А для ToBoolean "[]" это объект, который всегда true.
Какое-то дежавю, это ведь все уже было на хабре, недавно еще и статья про цикад и цсс начала снова появляться в ленте.
Очень познавательно. Спасибо!
Помню несколько лет назад игрался с чистым JS, он добавлял немного няшности и прикольности страничкам. Потом вышел jQuery и это было офигенно, в JS вдохнули вторую жизнь, постепенно от Flash начали отказываться, а затем хуяк… И я уже не понимаю что творится с миром JS.
Sign up to leave a comment.

Articles