
Fritter v1.3
Генератор полиморфного shellcode для выполнения в памяти EXE, DLL, .NET, VBScript и JScript с рандомизацией для каждого вывода и каждой сборки для обхода обнаружения и устойчивости к сигнатурам.
Fritter
Неуловимый кузен Donut.
Fritter — это сильно модифицированный форк генератора шеллкода Donut от TheWover и Odzhan. Он генерирует позиционно-независимый шеллкод для выполнения в памяти VBScript, JScript, EXE, DLL и .NET-сборок, с упором на обход средств защиты и устойчивость к сигнатурам. Кодовая база поддерживает только x64.
Что изменилось
Многое. Fritter удаляет функции, которые редко нужны, и заменяет внутренние компоненты, которые за годы обросли сигнатурами. Криптография, сжатие, хэширование и уровень разрешения API были переработаны наряду со многими другими областями.
Полиморфизм и обход средств защиты — главная цель дизайна. Каждый выходной файл уникален, и каждая сборка самого инструмента тоже уникальна. Есть два отдельных уровня:
Рандомизация на каждый выходной файл: применяется при каждом запуске fritter. Входной стаб, полиморфный декодер, ключи шифрования и многие структурные элементы внутри генерируемого шеллкода пересоздаются из новой энтропии при каждой сборке PIC.
Рандомизация на каждую сборку: применяется при каждой компиляции самого fritter. Константы ротации шифров и хэшей, структура таблицы разрешения API, запутывание строк на стороне шима, направления обхода PEB, паттерны затирания после выполнения и несколько структурных осей внутри лоадера и шима зашиваются на этапе компиляции.
В рантайме Fritter минимизирует исполняемый след лоадера. Лоадер разбит на отдельно шифруемые функции, каждая со своей PE-секцией, XOR-ключом и диспетчером. В любой момент времени только байты одной функции находятся в открытом виде. Прежняя модель VEH со скользящим окном заменена на эту модель диспетчеризации.
!! Настоятельно рекомендуется сборка из исходников !!
Это важно. Готовые бинарники, доступные для тестирования в releases, используют одни и те же пер-билд константы для всех пользователей этого бинарника.
Соберите свою копию. Пер-билд оси перерандомизируются при каждом вызове make:
# Linux, static-musl ELF, no runtime libc dependency
# Requires: build-essential, mingw-w64, musl-tools
make -f Makefile.linux release
# Windows (MSVC), recommended on Windows
nmake -f Makefile.msvc
В Windows рекомендуется использовать цепочку инструментов MSVC. Она размещает каждую функцию лоадера в собственной PE-секции с выравниванием по страницам — именно это требуется модели диспетчеризации N>1 для каждой функции. mingw в настоящее время помещает всё в одну секцию .text и поэтому запускает одну точку входа, покрывающую весь лоадер с одним XOR-ключом (функционально идентично результату MSVC, но только с одним диспетчером полиморфизма вместо многих). Если у вас нет Visual Studio, собирайте в WSL с помощью Makefile.linux; он кросс-компилирует Windows-лоадер через mingw-w64.
Каждый запуск make выполняет tools/gen_poly для генерации свежих пер-билд констант и tools/gen_api_shuffle для перестановки таблицы разрешения API. Получившийся бинарник fritter сам по себе уникален: другие константы шифров, другие хэш-константы, другая структура таблицы API, другое запутывание строк на стороне шима и так далее. Каждый шеллкод, сгенерированный этим бинарником, будет использовать эти пер-билд константы, но различаться по пер-аутпут осям.
Использование
В комплект входит папка /test с calc.exe и inject_local64.exe для тестирования Fritter. Чтобы пересобрать тестовые хосты самостоятельно: nmake -f Makefile.msvc harness или make -f Makefile.linux harness в WSL.
fritter [options] -i <EXE/DLL/VBS/JS>
INPUT
-i, --input <path> Input file to execute in-memory
-p, --args <args> Parameters / command line for target
-c, --class <name> Class name (required for .NET DLL)
-m, --method <name> Method or function for DLL
-r, --runtime <ver> CLR runtime version
-w, --unicode Pass command line as UNICODE
-t, --thread Run unmanaged EXE entrypoint as thread
OUTPUT
-o, --output <path> Output file (default: loader.bin)
-f, --format <1-8> 1=Bin 2=B64 3=C 4=Ruby 5=Py 6=PS 7=C# 8=Hex
-x, --exit <1-3> 1=Thread (default) 2=Process 3=Block
-y, --fork <offset> Fork thread, continue at RVA offset
LOADER
-e, --entropy <1-3> 1=None 2=Random names 3=Names+Crypto (default)
-k, --headers <1-2> 1=Overwrite (default) 2=Keep all
-g, --chunked <0-1> (deprecated; dispatch shim is always used)
-d, --domain <name> AppDomain name for .NET
-j, --decoy <path> Decoy module for Module Overloading
STAGING
-n, --modname <name> Module name for HTTP staging
-s, --server <url> Server URL (supports basic auth)
Примеры
fritter -i payload.exe
fritter -i implant.dll -m RunMain -p "arg1 arg2"
fritter -i payload.exe -g 0 -k 2 -o out.bin
Архитектура (многие реализации здесь не перечислены)
Шеллкод-пейлоад Fritter построен как вложенные слои, каждый из которых расшифровывает или подготавливает следующий:
-
Входной стаб. Рандомизированный мусорный префикс переменной длины, процедура выравнивания RSP, генерируемая для каждого выходного файла, и генеративный трамплин. Основано на дисциплине Shikata Ga Nai.
-
Полиморфный XOR-декодер. Собирается в два прохода. Регистры выделяются из пула перемешиванием Фишера — Йетса. Длина ключа выбирается для каждого выходного файла. Между каждыми реальными инструкциями вставляется мусор. Подвижные группы инструкций в горячем цикле переупорядочиваются с соблюдением ограничений корректности.
-
Диспетчерский шим. Заменяет прежний VEH-шим со скользящим окном. Переключает область лоадера из RW в RWX, затем передаёт управление точке входа лоадера. При диспетчеризации N>1 каждый вызов направляется через пер-функциональный thunk в диспетчер функции, который расшифровывает, выполняет и затирает при возврате. Структура опкодов каждого диспетчера меняется от сборки к сборке (см. CHANGELOG v1.3).
-
Лоадер. In-memory маппер PE. Разрешает API по хэшу, отображает встроенный PE через API секций, применяет импорты / релокации / TLS-колбэки, вызывает точку входа и затем затирает. Направление обхода PEB, байт затирания после выполнения, места структурной соли в MainProc — всё рандомизируется для каждой сборки.
-
Очистка. Затирает страницы лоадера байтовым паттерном, специфичным для сборки, стирает экземпляр и завершает работу через завершение потока или процесса в зависимости от
-x. Никаких VEH-обработчиков или контекстных структур, которые нужно вычищать.
Остаточный след после выполнения — одна небольшая RWX-страница, где работал диспетчерский шим. В потоковом режиме отображённая PE-секция намеренно оставляется нетронутой, чтобы CRT-колбэки имели продолжения.
Благодарности
Fritter построен на основе работ TheWover и Odzhan, чей оригинальный проект Donut сделал генерацию позиционно-независимого шеллкода доступной и практичной. Их архитектура, дизайн лоадера и PIC-фреймворк — фундамент, на котором всё здесь построено. Пути маппинга PE, хостинга .NET и выполнения скриптов — по большей части их работа, сохранённая и уважаемая.
Лицензия
BSD 3-Clause. См. LICENSE.