
Динамический загрузчик шеллкода с изощрёнными возможностями обхода обнаружения
AsmLdr — это продвинутый загрузчик шеллкода, реализованный на языке ассемблера x64 и предназначенный для сред Windows x64. Его основная цель — выполнение зашифрованных полезных нагрузок при минимизации обнаружения современными антивирусами, системами обнаружения и реагирования на конечных точках (EDR), песочницами и отладчиками. Это достигается за счёт динамического разрешения модулей, API и системных вызовов во время выполнения, что устраняет статические зависимости, такие как таблицы импорта или жёстко заданные адреса. Такой подход создаёт компактный бинарный файл с низким профилем обнаружения.
Загрузчик использует module stomping для размещения шеллкода в исполняемом разделе существующей DLL, дешифрует полезную нагрузку в памяти и запускает её через непрямые системные вызовы со спуфингом стека. Он включает функции обхода обнаружения, такие как анти-отладочные меры, корректировку таймингов для имитации обычных паттернов приложений и обход трассировки событий Windows (ETW). Эти возможности делают его инструментом для red teaming и исследований в области безопасности. Этическое предупреждение: Этот проект предназначен исключительно для образовательных и исследовательских целей. Он демонстрирует низкоуровневые внутренние механизмы Windows, включая обход PEB, разбор таблицы экспорта, снятие хуков с системных вызовов и манипулирование защитой памяти. Используйте в контролируемых средах (например, в виртуальных машинах). Использование во вредоносных целях незаконно и неэтично. Автор снимает с себя ответственность за любое неправомерное использование.
AsmLdr предлагает ряд функций для скрытного выполнения полезной нагрузки и обхода обнаружения. Каждая из них описана ниже с акцентом на её назначение и преимущества:
Разрешение модулей через обход PEB: Загрузчик перечисляет запущенные модули, проходя по цепочке модулей PEB. Он сопоставляет имена модулей с помощью сравнения Unicode-строк, чтобы найти и вернуть базовый адрес нужной DLL. Этот метод обходит стандартные функции загрузки, снижая риск перехвата.
Разрешение API из таблиц экспорта: Загрузчик анализирует каталог экспорта DLL для поиска функций. Он сопоставляет API с помощью хэширования или, опционально, прямых проверок имён с проверкой длины, чтобы избежать путаницы между похожими именами функций. Это даёт адрес функции без использования предварительно слинкованных импортов.
Анти-отладочная защита: Загрузчик обнаруживает отладку с помощью нескольких проверок и корректно завершает работу, если какая-либо из них указывает на анализ.
Генерация мусорного кода для затруднения анализа: Загрузчик выполняет последовательности необязательных операций, создавая запутанные паттерны в дизассемблированном коде, что усложняет статический анализ без влияния на эффективность выполнения.
Нормализация таймингов и поведения: Загрузчик измеряет скорость системы, чтобы выполнять имитируемые нагрузки, соответствующие обычным паттернам приложений, помогая ему сливаться с легитимными процессами. Он также делает короткие паузы перед ключевыми действиями для нормализации времени выполнения.
Обход журналирования ETW: Загрузчик устанавливает аппаратные точки останова на API журналирования ETW, чтобы перехватывать и пропускать вызовы записи событий, предотвращая появление следов в системных журналах.
Многоуровневое снятие хуков: Загрузчик динамически получает корректные номера системных вызовов (SSN), проверяя функции напрямую, сканируя близлежащий код при наличии хуков или подсчитывая паттерны в ntdll для оценки номера с учётом известных исключений.
Используемые техники:
Непрямые системные вызовы и спуфинг стека: Загрузчик находит «чистые» пути кода в ntdll для системных вызовов и выстраивает цепочку до 32 операций, скрывая стек вызовов для обхода трассировки. После завершения он восстанавливает исходное состояние.
DLL Hollowing: Загрузчик загружает целевую DLL, временно разрешает запись в её секцию кода, вставляет зашифрованный шеллкод, дешифрует его и возвращает защиту в режим «только выполнение».
Дешифрование в памяти: Загрузчик дешифрует шеллкод, применяя повторяющийся ключевой паттерн непосредственно во внедрённой памяти.
Вспомогательные функции: Загрузчик включает средства для измерения длины строк, сравнения строк (обычных или широких символов), хэширования имён для поиска, проверки корректности указателей памяти и чтения временных меток для управления таймингами.
Python-скрипт generate.py шифрует файл «сырого» шеллкода. Он добавляет выравнивающие padding-байты, создаёт или использует ключ и XOR-ит каждый байт с ключом в повторяющемся цикле. Выходной файл shellcode.asm определяет размеры, массивы зашифрованных данных и ключа, а также процедуру загрузки данных во время выполнения. Дешифрование в загрузчике повторяет этот процесс в памяти. Учтите, что более длинные ключи увеличивают время ожидания.
Подготовьте бинарный файл с «сырым» шеллкодом (например, payload.bin). Запустите python generate.py payload.bin [optional_key], чтобы получить shellcode.asm.
Измените szDllName (шестнадцатеричные Unicode-слова в evader.asm) для альтернативных DLL, например urlmon.dll. Пересчитайте хэши DJB2 для новых API с помощью логики str_hash. Для отладки закомментируйте макросы (например, KILL_DEBUGGERS).
AsmLdr оптимизирован для Windows 10 и 11 x64; обновления ядра могут изменить смещения (например, PEB+0x18) или паттерны NTDLL (например, 0xb8d18b4c), что требует проверки. Обработка ошибок полагается на возвращаемые значения NTSTATUS (например, <0 означает сбой); встроенное журналирование отсутствует. Мусорные и фиктивные операции потребляют такты процессора, что может привлечь внимание мониторов ресурсов на системах с ограниченными ресурсами. Используйте только в контролируемых средах.