
Запутывает скрипты PowerShell и JavaScript с помощью парсинга на основе tree-sitter и множества настраиваемых профилей имитации для скрытности, размера и сложности реверс-инжиниринга.
Ditto — это обфускатор PowerShell и JavaScript, основанный на tree-sitter-powershell и tree-sitter-javascript.
ditto-cli [options]
| Короткая опция | Длинная опция | Описание |
|---|---|---|
| -h | --help | Показать справочную информацию и выйти. |
| -v | --version | Показать информацию о версии и выйти. |
| -p | --path | Путь к файлу скрипта для обработки. |
| -i | --impostor | Профиль impostor для обфускации (без учёта регистра). |
| -L | --list | Вывести список всех доступных профилей impostor. |
| -t | --time | Показать время вычислений, затраченное на процесс обфускации. |
| -d | --debug-level | Уровень отладки. Варианты: off, error, warn, info, debug, trace (по умолчанию: info). |
| -q | --quiet | Выводить только итоговый обфусцированный скрипт, подавляя все остальные логи. |
Каждый язык оснащён уникальными Impostor'ами в тематике покемонов. Impostor — это именованный рецепт, который объединяет несколько проходов обфускации. Каждый из них отдаёт предпочтение разному набору техник, поэтому один и тот же скрипт, обфусцированный двумя разными impostor'ами, выглядит совершенно по-разному. Выберите того, чей компромисс (скрытность, размер, читаемость, сложность реверса) подходит вашим потребностям.
| Impostor | Что он делает |
|---|---|
| Pikachu | Универсальный маскот. Преобразует литералы в статические строки, переписывает командлеты и члены типов как строки, кодирует строки в Base64, разбивает целые числа с помощью встроенного modulo/hexlify и случайным образом переименовывает переменные. Сбалансированный вариант по умолчанию. |
| Bulbasaur | Начальный уровень. Переписывание строк/командлетов/членов, кодирование Base64, случайные имена переменных и целые числа, пересобираемые через трюк с обратным modulo. Лёгкий и относительно читаемый. |
| Ivysaur | Эволюция Bulbasaur'а. Тот же базовый рецепт, но переменные названы в честь глаголов PowerShell (${Set-...}, ${Add-...}, ${Remove-...}), чтобы сливаться с легитимным кодом, плюс встроенный hexlify и целые числа с обратным modulo. |
| Charizard | Тяжёлая артиллерия. Статические строки, Base64, рандомизированные встроенные modulo/hexlify, член-как-строка, целые числа с обратным modulo, а также рандомизированные имена переменных и типов, объединённые для агрессивной обфускации. |
| Alakazam | Математический мозг. Заранее вычисляет каждое логическое значение и целое число в арифметические выражения, разбивает выражения вызовов и превращает командлеты, члены и типы в строки. Создаёт плотный, насыщенный выражениями вывод. |
| Onix | Специалист по массивам. Сохраняет токены в константных массивах, перемешивает их, применяет hexlify через foreach и пересобирает каждое целое число через арифметику XOR/add, вычисляемую во время выполнения. |
| Eevee | Переименовщик. Случайно переименовывает все функции, параметры и переменные, переписывает командлеты/члены как строки и присваивает имена в стиле UUID и в стиле глаголов с маскировкой подстановочными знаками. Сосредоточен на обфускации идентификаторов. |
| Ditto | Мимик — мета-impostor. Вместо преобразования всего файла он сканирует исходный код на наличие комментариев # ditto(<engine>) и применяет указанный движок только к оператору, который непосредственно следует за комментарием. Это позволяет смешивать impostor'ов в одном скрипте. См. Выборочная обфускация с Ditto. |
| Impostor | Что он делает |
|---|---|
| Tinkatuff | Хорошо сбалансированный вариант по умолчанию. Переписывает обращения к членам как подстрочные индексы, иногда преобразует выражения в switch/if-else, превращает числа в математические выражения, а также кодирует/разбивает/экранирует строки и идентификаторы. Хороший баланс покрытия и размера. |
| Unown | Шифр-символ. Кодирует числа, строки, логические значения, специальные значения и объекты по умолчанию с помощью трюков в стиле JSFuck и переименовывает идентификаторы, используя только $ и _. Вывод почти нечитаем. |
| Metagross | «Погоди, тут всё числа?» Превращает строки в fromCharCode, переписывает каждое число как выражение и переименовывает все идентификаторы в имена, похожие на числа. Вывод состоит почти полностью из цифр. |
| Wailord | Кит. Создаёт огромный вывод (средний коэффициент расширения ~4643x). Используйте только на маленьких скриптах — он нагромождает идентификаторы в стиле пузырей, разбиение строк, числа JSFuck и преобразования массивов. |
| Clefable | Игрок. Случайным образом выбирает среди всех доступных проходов, поэтому вы получаете сравнительно «маленький» вывод, который при этом несёт все виды защиты. Реверсеру придётся иметь дело с каждым возможным проходом. Поскольку проходы выбираются случайно и могут конфликтовать, возможно, потребуется запустить его несколько раз. |
| Cofagrigus | Гробница. Переименовывает идентификаторы именами в виде египетских иероглифов, кодирует строки, переписывает числа как выражения и применяет «проклятые» преобразования строк/чисел. Жутко, плотно и трудночитаемо. |
Выведите список всех доступных impostor'ов прямо из вашей оболочки:
ditto-cli --list
Не стесняйтесь добавлять своих! А затем вы можете вызвать того, кого хотите.
Исходный скрипт PowerShell:
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed', 'NonPublic,Static').SetValue($null, $true)
Команда обфускации:
ditto-cli --path test.ps1 --impostor ivysaur
Обфусцированный вывод: