
Eine kleine x64-Bibliothek zum Laden von DLLs in den Speicher.
Eine kleine x64-Bibliothek zum Laden von DLLs in den Speicher.
Flags können kombiniert werden
LIBRARYEX_NONE: Modul von der Festplatte in den Speicher mappen und den Einstiegspunkt ausführen.
LIBRARYEX_BYPASS_LOAD_CALLBACK: Modul von der Festplatte in privaten Speicher (unbacked) mappen, wodurch Image-Load-Callbacks (PsSetLoadImageNotifyRoutine) umgangen werden.
LIBRARYEX_NO_ENTRY: Den Einstiegspunkt des Moduls nicht ausführen.
LIBRARYEX_BUFFER: Das Modul aus dem Speicher statt von der Festplatte mappen.
LdrLibraryEine einfach zu verwendende Funktion zum Laden einer Bibliothek in den Speicher. Der erste Parameter kann, abhängig von den angegebenen Flags, entweder ein Wide-String-Modulname oder eine Speicheradresse sein, an der sich die PE-Datei befindet.
/*!
* @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
);
Dieses Beispiel zeigt, wie ein Modul von der Festplatte (aus dem System32-Pfad) geladen wird:
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 );
Dieses Beispiel zeigt, wie ein Modul aus einem Speicherpuffer geladen wird:
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 );
Es ist auch möglich, Module anhand ihres API-Sets zu laden (nur 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 ermöglicht es, bestimmte Funktionen zu hooken, um das Verhalten zu ändern, wie eine Bibliothek in den Speicher gemappt werden soll.
//
// 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;
}
Diese Codebasis ist für x86_64-mingw geschrieben und optimiert und wird höchstwahrscheinlich unter Visual Studio nicht funktionieren oder kompilieren.
Ein großer Dank gilt den folgenden Ressourcen und Projekten:
Dieses Projekt sollte nicht in einer realen Umgebung oder in einem echten Einsatz verwendet werden. Ich habe es hauptsächlich geschrieben, um zu verstehen und mehr darüber zu lernen, wie der Windows-Loader funktioniert. Ich habe es als Bibliothek geschrieben, weil ich es für andere Arten von öffentlichen und privaten Projekten verwenden wollte. Ich habe mein Ziel erreicht. Bis dann.