RenEngine Loader + HijackLoader: многоступенчатая stealer-кампания через пиратские AAA-игры
1. Executive Technical Summary
Howler Cell Threat Research Team выявила длительную, масштабную и технически зрелую stealer-операцию, активную как минимум с апреля 2025 года и продолжающуюся на текущий момент. Кампания использует:
- новый ранее не описанный загрузчик RenEngine Loader
- модифицированный вариант HijackLoader
- финальный полезный груз — ACR Stealer (в других цепочках также Rhadamanthys, AsyncRAT, XWorm)
Ключевая особенность — злоупотребление легитимным игровым движком Ren’Py для скрытой доставки первого этапа вредоносной цепочки внутри «рабочих» пиратских игр.
Масштаб
- ~400 000 зафиксированных обращений к встроенной телеметрии
- ~5 000 новых жертв в день
- активность устойчива с Oct 14, 2025 (добавление telemetry logic)
- основные страны: India, USA, Brazil, Russia, Egypt, Turkey, Spain, Indonesia, Pakistan, France
2. Initial Access: доверие вместо эксплуатации
Вектор
с пиратских площадок, включая:
hxxps://dodi-repacks[.]site go[.]zovo[.]ink → MediaFire
Атака основана не на уязвимостях, а на:
- доверии внутри piracy-сообществ
- низкой осведомлённости пользователей
- отсутствии строгого endpoint-контроля
3. Stage 1 — RenEngine Loader
3.1 Злоупотребление Ren’Py
Instaler.exe — легитимный Ren’Py launcher, внутри которого:
Обычные архиваторы не извлекают RPA, что:
Исполняется script.rpyc → это и есть RenEngine Loader.
3.2 Конфигурация загрузчика
Loader читает .key файл → Base64 decode → JSON:
3.3 Обфускация и staging
4. Sandbox Scoring System
RenEngine применяет балльную модель детекции VM.
<50% → выполнение
≥50% → тихий выход
5. Stage 2 — HijackLoader Variant
W8CPbGQI.exe (подписанный) → sideload:
d3dx9_43.dll → VSDebugScriptAgent170.dll → stomp evr.dll
5.1 Конфигурация HijackLoader
Magic: C6 A5 79 EA XOR key: DB CD 7B C6 IDAT header RtlDecompressBuffer (LZNT1)
5.2 Модульная архитектура (38 модулей)
- Process hollowing
- Process doppelgänging
- Heaven’s Gate
- UAC bypass
- Defender tampering
- Reverse shell
- Scheduled task persistence
6. Persistence & Injection Flow
%ProgramData%\broker_crypt_v4_i386 %AppData%\Roaming\broker_crypt_v4_i386
chime.exe ZoneInd.exe
Финал:
→ Process Doppelgänging
→ инжект в rasapi32.dll
7. Final Payload — ACR Stealer
78.40.193.126 Campaign ID: 08de3605-f8ce-46fa-874f-3adf0bd308ba Build: Dec 7 2025
8. Telemetry & Victim Tracking
14 Oct 2025 → добавлен tracking:
GET request + pub=t11_asm
9. MITRE ATT&CK Mapping
10. IoCs
SHA256 ZIP:9e3b296339e25b1bae1f9d028a17f030dcf2ab25ad46221b37731ea4fdfde057
d3dx9_43.dll 326ec5ae... VSDebugScriptAgent170.dll db4ccd0e...
%APPDATA%\broker_crypt_v4_i386
XOR key HijackLoader: 0xdbcd7bc6
11. Почему это опаснее обычных stealer-цепочек
Python-этап загрузчика RenEngine: скрытый оркестратор атаки
Ключевая особенность RenEngine Loader заключается в том, что основная управляющая логика реализована не в исполняемом файле Windows, а внутри Python-кода, встроенного в движок Ren’Py. Внешне образец выглядит как обычная визуальная новелла, однако фактически игровой движок используется как контейнер для вредоносного загрузчика.
После запуска Instaler.exe и инициализации Ren’Py происходит обращение к архиву archive.rpa. Внутри него находится файл script.rpyc — скомпилированный Python-байткод. Этот файл и является центральным модулем первой стадии атаки. Код не сохраняется на диск в виде .py, а исполняется интерпретатором движка напрямую из памяти, что существенно осложняет статический анализ и сигнатурное обнаружение.
Конфигурационная модель загрузчика
Python-часть не содержит жёстко прописанных параметров. Вместо этого используется внешний конфигурационный файл .key, закодированный в Base64. После декодирования получается JSON-структура с параметрами кампании:
- имя зашифрованного архива со второй стадией,
- пароль для дешифрования,
- имя исполняемого payload-файла,
- флаг отключения анти-sandbox логики,
- идентификатор партнёрской кампании (pub).
Такая архитектура превращает загрузчик в универсальный конструктор: оператор может менять полезную нагрузку, ключи шифрования и режим работы без пересборки самого loader’а.
Дешифрование полезной нагрузки
Python-код реализует примитивный, но эффективный механизм сокрытия второй стадии — XOR-шифрование. Зашифрованный файл (маскирующийся под текстовый) считывается в память и побайтно декодируется с использованием циклического ключа из конфигурации. Результатом становится ZIP-архив, который затем распаковывается во временный каталог.
Важно, что весь процесс — чтение, дешифрование и распаковка — контролируется Python-скриптом, то есть выполняется в контексте игрового процесса, что дополнительно маскирует активность.
Python как механизм анти-анализа
Наиболее необычная часть логики — встроенная система оценки среды выполнения. В отличие от простых проверок на наличие виртуальной машины, здесь используется балльная модель. Python-скрипт вызывает PowerShell-команды для получения характеристик системы:
- объём оперативной памяти,
- количество логических процессоров,
- модель оборудования,
- имя пользователя,
- сетевые параметры.
Каждый параметр добавляет определённое количество баллов «доверия». Если итоговый процент превышает заданный порог, выполнение прекращается. В результате вредоносный код не запускается в типичных песочницах с малым объёмом RAM и стандартными VM-признаками. Для Python-загрузчиков подобная многофакторная модель встречается крайне редко.
Запуск финального этапа
После успешного прохождения проверок Python-модуль запускает извлечённый исполняемый файл через subprocess. На этом этапе управление передаётся HijackLoader, который уже занимается инжекцией, закреплением и загрузкой основного вредоносного ПО.
Таким образом, Python-часть выполняет роль оркестратора:
- читает конфигурацию кампании,
- дешифрует и распаковывает полезную нагрузку,
- проводит анти-sandbox анализ,
- запускает следующую стадию,
- в некоторых версиях отправляет телеметрию операторам.
Почему выбран именно Python внутри Ren’Py
Такой подход даёт злоумышленникам сразу несколько преимуществ:
- Маскировка под игру — поведение выглядит как штатная работа игрового движка.
- Отсутствие классического loader-EXE — меньше детектируемых артефактов.
- Гибкая конфигурация — смена кампаний без перекомпиляции.
- Сложность анализа —
.rpycтребует отдельного извлечения и декомпиляции. - Исполнение из памяти — снижает эффективность поведенческих детекторов.
В итоге Python-этап RenEngine нельзя рассматривать как вспомогательный скрипт. Это полноценный управляющий модуль, который превращает игровой движок в универсальную платформу доставки вредоносных нагрузок и делает цепочку заражения значительно менее заметной для систем защиты.
13. Главный вывод
- долговременная операция
- модульная архитектура
- abuse игрового фреймворка
- профессиональный evasion design
- масштаб уровня botnet-кампаний
RenEngine Loader демонстрирует новую тенденцию — эксплуатацию игровых движков как malware delivery frameworks.