Этот код увлекателен, потому что он, кажется, использует только девять символов ("[]()!+,;
" и пустое пространство U+0020
), но имеет некоторые сложные функции.Кажется, что он использует неявное преобразование типов в JavaScript для приведения массивов к различным примитивным типам и их строковым представлениям, а затем использует символы из этих строк для составления других строк, которые набирают имена функций, которые затем вызываются.следующий фрагмент, который оценивает функцию фильтра массива :
([][
(![]+[])[+[]] // => "f"
+ ([![]]+[][[]])[+!+[]+[+[]]] // => "i"
+ (![]+[])[!+[]+!+[]] // => "l"
+ (!![]+[])[+[]] // => "t"
+ (!![]+[])[!+[]+!+[]+!+[]] // => "e"
+ (!![]+[])[+!+[]] // => "r"
]) // => function filter() { /* native code */ }
Реконструкция кода как таковая занимает много времени и подвержена ошибкам, поэтому автоматическое решение, очевидно, желательно.Тем не менее, поведение этого кода настолько тесно связано со средой выполнения JavaScript, что для его обесцвечивания требуется интерпретатор JS для оценки кода.
Мне не удалось найти какие-либо инструменты, которые будут работатькак правило, с такой кодировкой.Похоже, что вам придется дополнительно изучить код и определить любые шаблоны использования (например, зависимость от методов массива) и выяснить, как отразить их использование (например, оборачивая высокоуровневые функции [такие как Function.prototype.call).]) для отслеживания выполнения кода для вас.