Vectored Overloading PE Injection
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Tip
Windows 11 の LFH heap shaping と VMware Workstation PVSCSI (vmware-vmx) の escape techniques を探していますか?
{{#ref}} vmware-workstation-pvscsi-lfh-escape.md {{#endref}}
手法の概要
Vectored Overloading は、古典的な Module Overloading を Vectored Exception Handlers (VEHs) と hardware breakpoints と融合させた Windows PE injection primitive です。独自のローダや LoadLibrary のパッチを行う代わりに、攻撃者は以下を行います。
- 正規の DLL(例:
wmp.dll)にバックされたSEC_IMAGEセクションを作成する。 - マップされたビューを完全にリロケートされた悪意ある PE で上書きするが、セクションオブジェクトはディスク上の正規イメージを指したままにする。
- VEH を登録し、デバッグレジスタをプログラムして
NtOpenSection、NtMapViewOfSection、(オプションでNtClose)へのすべての呼び出しがユーザーモードのブレークポイントを発生させるようにする。 LoadLibrary("amsi.dll")(または他の任意の正規ターゲット)を呼ぶ。Windows ローダがこれらの syscall を呼ぶと、VEH はカーネル遷移をスキップし、準備した悪意あるイメージのハンドルとベースアドレスを返します。
ローダは要求された DLL をマップしたと信じているため、セクションのバックファイルだけを参照するツールは wmp.dll を見続けますが、実際のメモリは攻撃者のペイロードで上書きされています。一方で imports/TLS コールバックは本物のローダによって解決されるため、攻撃者が維持すべきカスタムな PE 解析ロジックの量が大幅に減ります。
Stage 1 – Build the disguised section
- Create and map a section for the decoy DLL
NtCreateSection(&DecoySection, SECTION_ALL_ACCESS, NULL,
0, PAGE_READWRITE, SEC_IMAGE, L"\??\C:\\Windows\\System32\\wmp.dll");
NtMapViewOfSection(DecoySection, GetCurrentProcess(), &DecoyView, 0, 0,
NULL, &DecoySize, ViewShare, 0, PAGE_READWRITE);
- Copy the malicious PE into that view section by section, honouring
SizeOfRawData/VirtualSizeand updating protections afterwards (PAGE_EXECUTE_READ,PAGE_READWRITE, etc.). - Apply relocations and resolve imports exactly as a reflective loader would. Because the view is already mapped as
SEC_IMAGE, section alignments and guard pages match what the Windows loader expects later. - Normalize the PE header:
- If the payload is an EXE, set
IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLLand zero the entry point to keepLdrpCallTlsInitializersfrom jumping into EXE-specific stubs. - DLL payloads can keep their headers unchanged.
この時点でプロセスは、バックオブジェクトがまだ wmp.dll のままでありながら、メモリ内のバイトを攻撃者が制御する RWX 対応のビューを所有しています。
Stage 2 – Hijack the loader with VEHs
- Register a VEH and arm hardware breakpoints:
Dr0(または他のデバッグレジスタ)にntdll!NtOpenSectionのアドレスを設定し、DR7をセットして実行ごとにSTATUS_SINGLE_STEPを発生させる。後でNtMapViewOfSection(およびオプションでNtClose)についても同様に行う。 - Trigger DLL loading with
LoadLibrary("amsi.dll")。LdrLoadDllは最終的にNtOpenSectionを呼んで実際のセクションハンドルを取得する。 - VEH hook for
NtOpenSection:
[out] PHANDLE SectionHandle引数のスタックスロットを特定する。- そのスロットに事前に作成した
DecoySectionハンドルを書き込む。 - カーネルが呼ばれないように
ret命令までRIP/EIPを進める。 - 次に
NtMapViewOfSectionを監視するようハードウェアブレークポイントを再設定する。
- VEH hook for
NtMapViewOfSection:
[out] PVOID *BaseAddress(およびサイズ/保護出力)を、既にマップされた悪意あるビューのアドレスで上書きする。- 以前と同様に syscall 本体をスキップする。
- (Optional) VEH hook for
NtCloseは、偽のセクションハンドルがクリーンアップされていることを検証し、リソースのリークを防ぎ最終的な整合性チェックを提供する。
syscall が実行されないため、カーネルコールバック(ETWti、minifilter 等)は疑わしい NtOpenSection/NtMapViewOfSection イベントを観測せず、テレメトリが大幅に低下します。ローダの観点ではすべてが成功したように見え、amsi.dll はメモリ上に存在すると判断して、インポート/TLS を攻撃者のビューに対して続行します。
PoC 実装ノート (2025)
公開されている PoC は、再実装時に見落としやすい実用的な詳細をいくつか示しています:
- HWBPs are per-thread. PoC は
CONTEXT_DEBUG_REGISTERSをLoadLibraryを呼ぶ前に現在のスレッドにセットしているため、VEH はローダをトリガーするのと同じスレッド上で実行されなければならない。 - Syscall emulation: VEH は
RAX = 0を設定し、ntdllスタブ内のret(0xC3をスキャン)までRIPを進めることでカーネル遷移を発生させず、その後NtContinueで再開する。 - Output parameters:
NtMapViewOfSectionの場合、VEH は返されるBaseAddress、ViewSize、およびWin32Protect出力を上書きしてローダがマッピングに成功したと信じ、攻撃者のビューを使って imports/TLS を続行するようにする。
PoC で使われる最小限の HWBP セットアップ (x64):
CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(GetCurrentThread(), &ctx);
ctx.Dr0 = (DWORD64)NtOpenSection;
ctx.Dr7 = 1;
SetThreadContext(GetCurrentThread(), &ctx);
AddVectoredExceptionHandler(1, VehHandler);
ステルス変種
最近の VEH に関する研究では、ハンドラが AddVectoredExceptionHandler を呼び出す代わりに manually manipulating the VEH list によって登録できることが示されており、監視やフックの対象になり得るユーザーモードAPIへの依存を減らせます。これは Vectored Overloading に必須ではありませんが、観測可能な API 活動を減らすために組み合わせることができます。
Stage 3 – Execute the payload
- EXE payload: リロケーションが完了すると、インジェクタは単に元のエントリポイントへジャンプします。ローダが
DllMainを呼ぶと思っている箇所で、代わりにカスタムコードが EXE スタイルのエントリを実行します。 - DLL payload / Node.js addon: 意図したエクスポートを解決して呼び出します (Kidkadi は JavaScript に名前付き関数を公開します)。モジュールが既に
LdrpModuleBaseAddressIndexに登録されているため、以降のルックアップではそれを無害な DLL として扱います。
Node.js ネイティブアドオン(.node ファイル)と組み合わせると、Windows の内部処理はすべて JavaScript レイヤーの外に残るため、脅威アクターは同じローダを多様な難読化された Node ラッパーと共に配布しやすくなります。
References
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- VectoredOverloading – PoC implementation
- IBM X-Force – You just got vectored: Using VEH for defense evasion and process injection
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


