Назад к обновлениям
UpdatedJul 28, 2026

PolyEngine — Updated!

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

Поделиться

PolyEngine — полиморфный PE-паковщик 📦

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

Это побочный проект, над которым я работаю уже некоторое время. Я использовал Claude Code для реализации и исправления некоторых техник, которые хотел воплотить в своём собственном PE-паковщике. В коде много комментариев о функциях и их назначении, поскольку для меня это был большой опыт обучения, и Claude справляется с этим безупречно (у меня это выходит плохо). Надеюсь, это поможет кому-то изучить внутренности Windows или обойти некоторые AV-сигнатуры и статические детекты более продвинутых решений, когда вы приступите к этим ProLabs 🏯.

🔥 Огромное спасибо MalDevAcademy за все материалы для его создания и вдохновение.

🌩 Спасибо vx-underground за вдохновение через какой-то забавный твит с глупым котом.

Отказ от ответственности: Этот инструмент предназначен исключительно для авторизованного тестирования безопасности, CTF-соревнований и образовательных целей. Использование против систем без явного разрешения запрещено. Автор не несёт ответственности за неправомерное использование.


Использование

Порядок сборки: сначала Stub, затем Builder. Stub Release|x64 создаёт stub_v0.bin..stub_v3.bin; Builder встраивает один из них в .rsrc.

Убедитесь, что stub_v0.bin..stub_v3.bin находятся в рабочем каталоге (или передайте --stub).``` Builder.exe [OPTIONS]

Target PE (.exe/.dll) or raw shellcode (.bin) Payload type is auto-detected from the MZ header - no flag needed. Output executable

Loader: --stub 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 DLL export to invoke after DllMain --arg Argument passed to the export [max 127 chars]

Evasion (all ON by default): --spoof-name 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 Semaphore name for exec-ctrl check [default: wuauctl] (max 31 chars) --sleep-fwd-ms Sleep duration for sleep-fwd check [default: 500] Detection threshold: 90% of elapsed --uptime-min Uptime threshold for uptime check [default: 2] --hammer-s 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 PFX certificate container to sign the output with --pfx-pass PFX passphrase [omit if PFX has no password] --ts-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>

Категории