
DLLをメモリにロードするための小さなx64ライブラリ。
DLL をメモリにロードするための小さな x64 ライブラリです。
フラグは組み合わせることができます
LIBRARYEX_NONE: ディスクからモジュールをメモリにマップし、エントリポイントを実行します。
LIBRARYEX_BYPASS_LOAD_CALLBACK: ディスクからモジュールを (バッキングされていない) プライベートメモリにマップします。これにより、イメージロードコールバック (PsSetLoadImageNotifyRoutine) をバイパスします。
LIBRARYEX_NO_ENTRY: モジュールのエントリポイントを実行しません。
LIBRARYEX_BUFFER: ディスクからではなく、メモリからモジュールをマップします。
LdrLibraryライブラリをメモリにロードするための使いやすい関数です。最初のパラメータは、指定されたフラグに応じて、ロードするワイド文字列のモジュール名、または PE が配置されているメモリアドレスのいずれかになります。
/*!
* @brief
* load library into memory
*
* @param Buffer
* buffer context to load library
* either a wide string or a buffer pointer
* the to PE file to map (LIBRARYEX_BUFFER)
*
* @param Library
* loaded library pointer
*
* @param Flags
* flags
*
* @return
* status of function
*/
NTSTATUS LdrLibrary(
_In_ PVOID Buffer,
_Out_ PVOID* Library,
_In_ ULONG Flags
);
この例は、ディスク (System32 パス) からモジュールをロードする方法を示しています。
PVOID Module = { 0 };
ULONG Flags = { 0 };
//
// mapping flags to be used by the library
//
Flags = LIBRARYEX_NONE;
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( L"advapi32.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", Module );
この例は、メモリバッファからモジュールをロードする方法を示しています。
PVOID Module = { 0 };
ULONG Flags = { 0 };
//
// mapping flags to be used by the library
//
Flags = LIBRARYEX_NONE |
LIBRARYEX_BUFFER;
//
// read file on disk into memory
//
if ( ! ( Image = ReadFileBuffer( L"C:\\Windows\\System32\\advapi32.dll", NULL ) ) ) {
puts( "[-] ReadFileBuffer Failed" );
return;
}
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( Image, &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", Module );
API セットに基づいてモジュールをロードすることも可能です (Windows 10+ のみサポート)。
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibrary( L"api-ms-win-base-util-l1-1-0.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
printf( "[*] Module @ %p\n", );
LdrLibraryExLdrLibraryEx を使用すると、特定の関数をフックして、ライブラリがメモリにマップされる際の動作を変更できます。
//
// mapping flags to be used by the library
// and insert the loaded module into Peb
//
Flags = LIBRARYEX_BYPASS_LOAD_CALLBACK |
LIBRARYEX_NO_ENTRY;
//
// init LibraryEx context
//
if ( ! NT_SUCCESS( Status = LdrLibraryCtx( &Ctx, Flags ) ) ) {
printf( "[-] LdrLibraryCtx Failed: %d\n", Status );
goto END;
}
//
// hook function
//
Ctx.LdrLoadDll = C_PTR( HookLdrLoadDll );
//
// map file into memory
//
if ( ! NT_SUCCESS( Status = LdrLibraryEx( &Ctx, L"cryptsp.dll", &Module, Flags ) ) ) {
printf( "[-] LdrLibraryEx Failed: %p\n", Status );
return;
}
このコードベースは x86_64-mingw 向けに作成・最適化されており、Visual Studio ではおそらく動作せず、コンパイルもできない可能性が高いです。
以下のリソースとプロジェクトに多大な謝意を表します:
このプロジェクトは、実環境や実際の運用で使用すべきではありません。主に、Windows ローダーがどのように動作するかを理解し、学ぶために書きました。他の公開・非公開プロジェクトで使用したかったため、ライブラリとして書きました。目標は達成できました。ではまた。