
PolyEngine — Updated!
PolyEngine ist ein evasiver PE-Packer für CTF-Challenges und die Ausbildung in Low-Level-Windows-Sicherheit. Er umgeht EDR- und AV-Heuristiken durch einen mehrschichtigen Stack aus In-Memory-Ausführung und Verschleierungstechniken.
PolyEngine — Polymorpher PE-Packer 📦
PolyEngine ist ein forschungsorientierter, evasiver PE-Packer, der für CTF-Herausforderungen und Low-Level-Windows-Sicherheitsbildung entwickelt wurde. Er konzentriert sich auf die Umgehung von EDR- und AV-Heuristiken durch einen geschichteten Stapel von In-Memory-Ausführungs- und Verschleierungstechniken.
Dies ist ein Nebenprojekt, an dem ich schon einige Zeit arbeite. Ich habe Claude Code verwendet, um einige Techniken zu implementieren und zu korrigieren, die ich in meinem eigenen PE-Packer umsetzen wollte. Es gibt viele Kommentare zu Funktionen und deren Funktionsweise, da es für mich eine große Lernerfahrung war – und Claude macht das fehlerfrei (ich bin darin schlecht). Ich hoffe, es hilft manchen Menschen, etwas über Windows-Interna zu lernen oder beim Umgehen einiger AVs und statischer Erkennungen von fortschrittlicheren Lösungen, wenn du dich an diese ProLabs wagst 🏯.
🔥 Ein großes Dankeschön an MalDevAcademy für das gesamte Material, um es zu erstellen, und für die Inspiration.
🌩 Danke an vx-underground für die Inspiration durch einen albernen Tweet mit einer lächerlichen Katze.
Haftungsausschluss: Dieses Tool ist ausschließlich für autorisierte Sicherheitstests, CTF-Wettbewerbe und Bildungszwecke bestimmt. Die Verwendung gegen Systeme ohne ausdrückliche Genehmigung ist untersagt. Der Autor übernimmt keine Haftung für Missbrauch.
Verwendung
Build-Reihenfolge: Zuerst Stub, dann Builder. Stub Release|x64 erzeugt stub_v0.bin..stub_v3.bin; der Builder bettet eines in .rsrc ein.
Stell sicher, dass sich stub_v0.bin..stub_v3.bin im Arbeitsverzeichnis befinden (oder übergib --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
---
## Beispiele
Ausgearbeitete Beispiele, nach Szenario gruppiert. Jedes Flag ist opt-out (Evasion ist standardmäßig vollständig aktiviert), sodass bereits der einfachste Aufruf den vollen Stack erhält.
<details>
<summary><b>Grundlegendes Packen - EXE / DLL / shellcode</b></summary>
Packe eine nicht verwaltete EXE. Der Builder erkennt den `MZ`-Header automatisch und leitet über den RunPE-Pfad weiter:```
Builder.exe implant.exe packed.exe
Packe rohen positionsunabhängigen Shellcode (Cobalt Strike .bin, msfvenom -f raw, usw.). Kein MZ → direkter Aufruf in den dekomprimierten Puffer:```
Builder.exe beacon.bin packed.exe
Packen Sie eine DLL und rufen Sie nur deren Standard-`DllMain` auf (kein Export):```
Builder.exe payload.dll packed.exe
Verwenden Sie einen Stub aus einem nicht standardmäßigen Speicherort:``` Builder.exe implant.exe packed.exe --stub C:\build\release\stub_v1.bin
</details>