
Une petite bibliothèque x64 pour charger des DLL en mémoire.
Une petite bibliothèque x64 pour charger des dll en mémoire.
Les drapeaux peuvent être combinés
LIBRARYEX_NONE : Mappe le module depuis le disque en mémoire et exécute le point d'entrée.
LIBRARYEX_BYPASS_LOAD_CALLBACK : Mappe le module depuis le disque dans une mémoire privée (non adossée), ce qui contourne les callbacks de chargement d'image (PsSetLoadImageNotifyRoutine)
: N'exécute pas le point d'entrée du module.
LIBRARYEX_NO_ENTRYLIBRARYEX_BUFFER : Mappe le module depuis la mémoire au lieu du disque.
LdrLibraryFonction facile à utiliser pour charger une bibliothèque en mémoire. Le premier paramètre, selon les drapeaux spécifiés, peut être soit un nom de module en chaîne large à charger, soit une adresse mémoire où se trouve le 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
);
Cet exemple montre comment charger un module depuis le disque (depuis le chemin 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 );
Cet exemple montre comment charger un module depuis un tampon mémoire :
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 );
Il est également possible de charger des modules en fonction de leur ensemble d'API (api set) (prise en charge win10+ uniquement) :
//
// 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 permet d'intercepter certaines fonctions pour modifier le comportement de la manière dont une bibliothèque doit être mappée en mémoire.
//
// 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;
}
Cette base de code est écrite et optimisée pour x86_64-mingw et il est très probable qu'elle ne fonctionne pas ou ne compile pas sous Visual Studio.
Un immense crédit revient aux ressources et projets suivants :
Ce projet ne devrait pas être utilisé dans un environnement réel ou une opération réelle. Je l'ai principalement écrit pour comprendre et en apprendre davantage sur le fonctionnement du chargeur Windows. Je l'ai écrit sous forme de bibliothèque parce que je voulais l'utiliser pour d'autres types de projets publics et privés. J'ai atteint mon objectif. À plus.