
DLLMain が唯一の方法である場合に
LdrLockLiberator は、DllMain またはロックが存在する場所からコードを実行する際に、Loader Lock を回避または放棄するためのテクニック集です。これは、「Perfect DLL Hijacking」 の記事と併せてリリースされました。ライブラリ ローダーのロックを解除し、あなたのローダー(自分のコンピューター上で)を好きなように操作するための鍵を提供します!
これらのテクニックは、可能な限り普遍的で、クリーンで、100%安全であることを意図しています。メモリ保護やポインターを変更せずに動作するように設計されています。これは、最新のエクスプロイト緩和機能との互換性を維持するために重要です。公式にサポートされているアーキテクチャは x86-64 のみです(32ビットはほぼ絶滅しています)。
Windows で DllMain が非常に厄介なのに、Unix ライクなオペレーティングシステムではここで苦労しない理由をアーキテクチャの観点から知りたいですか? どうぞ、ご覧ください!。
名前の通りです。Loader Lock を解除し、ローダー イベントを設定し、LdrpWorkInProgress を切り替えます。最良の安定性を得るには、RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN を未定義のままにすることをお勧めします。
本番コードではこのテクニックを使用しないでください。 これは、私の純粋な好奇心と、徹底的に調べ尽くそうとする意志の副産物として作成されました。このコードを使用して行うすべてのことは自己責任です。
私たちは、プログラムの終了時に Loader Lock から逃れるために、通常は EXE で使用される CRT の atexit を DLL コードで使用します。動的読み込み(LoadLibrary を使用)の場合、LdrAddRefDll を使用してライブラリをピン留め(LDR_ADDREF_DLL_PIN)することで、後続の FreeLibrary が DLL をメモリから削除しないようにして、100%安全になります。
近日公開!
提供されているサンプルは、C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe の MpClient.dll をハイジャックします。このサンプルを他の DLL とプログラムの組み合わせに簡単に適応させるための手順は、ソースコードのコメントに記載されています(主に静的読み込み用のエクスポートを更新するだけです)。
概念実証として、ShellExecute をデフォルトのペイロードとして実行します。ただし、これを好きなように動作させることができます!
このプロジェクトのルートにある LdrLockLiberator.c は、Visual Studio 2022 でコンパイルできることが確認されています。
NTDLL にリンクするには、ソリューション エクスプローラー ウィンドウで現在の Visual Studio プロジェクトを選択し、メニューバーの Project > Properties に移動します。上部の Configuration ドロップダウン メニューから All Configurations と All Platforms を選択します。次に、Linker > Input に移動し、Additional Dependencies に ntdll.lib を追加します。
C:\Windows\System32\msvcrt.dll)へのリンクを公式にサポートする最後の公開 WDK です。5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.exe を実行します。LdrLockLiberatorWDK に(cd を使用して)移動します。build を実行します。完了です! DLL がビルドされ、使用できる状態になりました!
WDK の代替として、MinGW でのコンパイルもおそらく機能します。
MIT License - Copyright (C) 2023-2024 Elliot Killick [email protected]