
Визуально анализируйте обфусцированный JavaScript. Стройте цепочки преобразований, исследуйте изменения в AST, пишите переиспользуемые плагины для деобфускации.
Визуальная рабочая среда для деобфускации JavaScript. Стройте цепочки преобразований, проходите по ним шаг за шагом, пишите собственные плагины.


Это приложение показывает абстрактное синтаксическое дерево (AST) программы на JavaScript. Идея возникла при анализе образца вредоносного ПО, связанного с obfuscatio.io, что в итоге привело меня к более глубокому изучению BabelJS для деобфускации. Если вы когда-нибудь пытались реверс-инжинирить обфусцированный JS (например, бандлы webpack, вывод obfuscator.io, упакованные образцы вредоносного ПО), вы знаете, насколько это болезненно. Этот инструмент позволяет:
npm install
npm start
# Откройте http://localhost:3000
Вот и всё.
Левая боковая панель — все доступные преобразования (встроенные + ваш рецепт в виде плагинов), включая цепочку рецептов. (Аналог Cyberchef)
Центр — редакторы ввода/вывода. Вставьте обфусцированный код слева и просматривайте преобразованный код справа.
Правые панели — просмотрщик AST, анализатор областей видимости, удобная сводка.

BabelJS позволяет просматривать область видимости и привязки. Это особенно полезно для обнаружения неиспользуемых переменных, например. Этот вид также позволяет искать места, где переменная используется.

Нажмите кнопку + или клавиши Ctrl+N, чтобы открыть редактор скриптов. Преобразования — это просто JS-код с доступом к:
// Доступные глобальные переменные:
ast // Разобранное AST Babel
traverse // Обход дерева: traverse({ Identifier(path) { ... } })
t // Типы Babel: t.isStringLiteral(node), t.identifier('x')
config // Пользовательская конфигурация из карточки рецепта
stats // Отслеживание изменений: stats.replaced = 5
parser // Парсинг кода: parser.parse('var x = 1')
generate // Генерация кода: generate(node).code
run // Вспомогательная функция eval: run('1+1') => 2 (ОПАСНО. ПРЕДПОЛАГАЕТСЯ ЗАПУСК НА ВАШЕЙ СОБСТВЕННОЙ МАШИНЕ В ПЕСОЧНИЦЕ)
Пример — удалить все строки "debug" (StringLiteral):
// Следующие два параметра появятся в цепочке рецептов, как показано на следующем скриншоте
const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;
traverse({
StringLiteral(path) {
if (path.node.value === targetValue) {
if (removeMatches) {
path.remove();
stats.removed = (stats.removed || 0) + 1;
}
}
}
});
Вы можете:
На скриншоте ниже показано:

Обратите внимание, что они могут не работать в зависимости от техники обфускации и могут потребовать написания собственных скриптов. Вы также можете изменить их и сохранить как новый пользовательский скрипт.
| Имя | Что делает |
|---|---|
| Beautify | Форматирует код красиво |
| Constant Folding | 1 + 2 → 3, "a" + "b" → "ab" |
| Decode Strings | Декодирует \x48\x65\x6c\x6c\x6f → "Hello" |
| Inline Array Values | Встраивает простые обращения к элементам массива |
| Inline String Array | Встраивает строковые массивы, используемые обфускаторами |
| Opaque Predicate Removal | Удаляет условия, которые всегда истинны/ложны |
| Remove Comments | Удаляет все комментарии из кода |
| Remove IIFE | Разворачивает обёртки (function(){...})() |
| Remove Unused Code | Удаляет мёртвые переменные и функции |
| Simplify Literals | !0 → true, void 0 → undefined |
Поместите свои собственные файлы .js в подпапки plugins/<category>/. Они появятся на боковой панели, сгруппированные по папкам.

Например:
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → категория "nyx")/**
* Bracket to Dot Notation
* Изменяет такие вещи, как console["log"] на console.log
*
* Category: utilities
*/
// Редактор скриптов - Ctrl+Enter для запуска, Ctrl+E для закрытия
// Используйте traverse(visitor) для изменения AST
// Для доступа к типам Babel используйте 't'
traverse({
MemberExpression(path) {
if(path.node.computed === true){
// это скобочная нотация
prop = path.node.property
if(t.isStringLiteral(prop) &&
/^[a-zA-Z_][a-zA-Z_0-9]*$/.test(prop.value)
){
path.node.computed = false; // шаг 1
// шаг 2: заменить литерал на идентификатор
path.node.property = t.identifier(prop.value)
}
}
}
});
Есть два способа добавить параметры:
targetValue и removeMatches):const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Включает:

| Клавиша | Действие |
|---|---|
Ctrl+E | Переключение редактора скриптов |
Ctrl+Shift+E | Переключение панели eval (ОПАСНО) |
Ctrl+S | Сохранение проекта |
ОБРАТИТЕ ВНИМАНИЕ, ЧТО АВТОНОМНАЯ СБОРКА МОЖЕТ ИМЕТЬ ПРОБЛЕМЫ ПРИ БОЛЬШОМ КОЛИЧЕСТВЕ ВЛОЖЕННЫХ УЗЛОВ. ОБХОДНОЙ ПУТЬ МОЖЕТ НЕ ВСЕГДА РАБОТАТЬ.
Чтобы собрать с помощью npm, используйте следующее:
npm run build # Только для Windows
Вывод помещается в dist/. Скопируйте папку plugins/ рядом с exe, если хотите использовать свои собственные преобразования.
Глубоко вложенный код (например, JSFuck) может переполнить стек. Сборочный скрипт пытается автоматически увеличить его в Windows. Если возникают переполнения стека, попробуйте запустить из исходников с помощью npm start (использует --stack-size=65536).
Я не разобрался, как увеличить размер стека при сборке автономного исполняемого файла. Пожалуйста, дайте мне знать, если вы знаете, как это сделать!
Создано с помощью:

Вопросы? Проблемы? Откройте issue на GitHub.