Эта библиотека больше не работает в версии Windows 11 24H2. Новые улучшения безопасности делают его нефункциональным. Я еще не нашел исправление!

Блок MemoryDLL обеспечивает расширенные функциональные возможности для загрузки библиотек динамических связей (DLL) непосредственно из памяти в средах Win64. В отличие от традиционных методов, которые включают загрузку DLL из файловой системы, MemoryDLL позволяет загружать DLL из байтовых массивов или потоков памяти?, Извлечь адреса функций и разгружать их-все в памяти. Эта библиотека идеально подходит для разработчиков Delphi/Freepascal, которым необходимо управлять DLL, не полагаясь на файловую систему, повышая как производительность, так и безопасность.
MemoryDLL включает в себя загрузку и перенаправление DLL в памяти с использованием DLLS и загрузки на основе крючков для обхода традиционной загрузки DLL на основе файлов:
advapi32res.dll ). Этот DLL действует как спусковой крючок для перехвата и перенаправления в DLL в памяти. Совместимость? : Блок MemoryDLL совместим со стандартными интерфейсами DLL, что позволяет легко интегрироваться с существующими приложениями. Метод перенаправления в памяти также снижает риски безопасности, такие как инъекция кода?, Предлагая безопасную альтернативу для управления DLL.
Загружает модуль из изображения памяти, имитируя поведение функции Windows API LoadLibrary . Он анализирует формат PE, выполняет необходимые перемещения, разрешает импорт и инициализирует модуль.
Data: Pointer - указатель на изображение памяти, соответствующее формату PE.THandle представляющий загруженный модуль или 0 при сбое.Чтобы успешно интегрировать MemoryDLL в ваш проект, следуйте этим шагам:
Скачать последнюю версию?
Разарзание пакета
Добавьте MemoryDLL в ваш проект ➕
uses вашего проекта. Это включение сделает блок MemoryDLL доступным для использования в вашем приложении. Убедитесь, что путь к исходному файлу MemoryDLL правильно настроен в настройках проекта, чтобы избежать ошибок компиляции.Бесплатная интеграция с совместимостью с Windows API
MemoryLoadLibrary для загрузки DLL непосредственно из памяти. После загрузки стандартные вызовы Windows API, такие как FreeLibrary и GetProcAddress могут использоваться для управления DLL в памяти, как если бы он был загружен из файловой системы. Этот дизайн обеспечивает минимальные изменения в существующем коде, поддерживая совместимость с соглашениями Windows API, одновременно обеспечивая эффективную обработку DLL в памяти.Проверьте интеграцию ✅
Чтобы создать память , включите следующий код в конце раздела реализации устройства. Этот код пытается загрузить DLL как встроенный ресурс:
uses
Windows,
MemoryDLL;
...
implementation
{
This code is an example of using MemoryDLL to load an embedded a DLL directly
from an embedded resource in memory, ensuring that no filesystem access is
required. It includes methods for loading, initializing, and unloading the
DLL. The DLL is loaded from a resource with a GUID name, providing a measure
of security by obfuscating the resource’s identity.
Variables:
- DLLHandle: THandle
- A handle to the loaded DLL. Initialized to 0, indicating the DLL has
not been loaded. It is updated with the handle returned from
LoadLibrary when the DLL is successfullyloaded from memory.
Functions:
- LoadDLL: Boolean
- Loads the DLL from an embedded resource and initializes it by
retrieving necessary exported functions. Returns True if the DLL is
loaded successfully, otherwise False.
- b6eb28fd6ebe48359ef93aef774b78d1: string
- A GUID-named helper function that returns the resource name for the DLL.
This GUID-like name helps avoid easy detection of the resource.
- UnloadDLL: procedure
- Unloads the DLL by freeing the library associated with DLLHandle. Resets
DLLHandle to 0 to indicate the DLL is unloaded.
Initialization:
- The LoadDLL function is called during initialization, and the program will
terminate with code 1 if the DLL fails to load.
Finalization:
- The UnloadDLL procedure is called upon finalization, ensuring the DLL is
unloaded before program termination.
}
var
DLLHandle: THandle = 0 ; // Global handle to the loaded DLL, 0 when not loaded.
{
LoadDLL
--------
Attempts to load a DLL directly from a resource embedded within the executable
file. This DLL is expected to be stored as an RCDATA resource under a specific
GUID-like name.
Returns:
Boolean - True if the DLL is successfully loaded, False otherwise.
}
function LoadDLL (): Boolean;
var
LResStream: TResourceStream; // Stream to access the DLL data stored in the
resource.
{
b6eb28fd6ebe48359ef93aef774b78d1
---------------------------------
Returns the name of the embedded DLL resource. Uses a GUID-like name for
obfuscation.
Returns:
string - The name of the resource containing the DLL data.
}
function b6eb28fd6ebe48359ef93aef774b78d1 (): string;
const
// GUID-like resource name for the embedded DLL.
CValue = ' b87deef5bbfd43c3a07379e26f4dec9b ' ;
begin
Result := CValue;
end ;
begin
Result := False;
// Check if the DLL is already loaded.
if DLLHandle <> 0 then Exit;
// Ensure the DLL resource exists.
if not Boolean((FindResource(HInstance,
PChar(b6eb28fd6ebe48359ef93aef774b78d1()), RT_RCDATA) <> 0 )) then Exit;
// Create a stream for the DLL resource data.
LResStream := TResourceStream.Create(HInstance,
b6eb28fd6ebe48359ef93aef774b78d1(), RT_RCDATA);
try
// Attempt to load the DLL from the resource stream.
DLLHandle := MemoryLoadLibrary(LResStream.Memory);
if DLLHandle = 0 then Exit; // Loading failed.
// Retrieve and initialize any necessary function exports from the DLL.
GetExports(DLLHandle);
Result := True; // Successful load and initialization.
finally
LResStream.Free(); // Release the resource stream.
end ;
end ;
{
UnloadDLL
---------
Frees the loaded DLL, releasing any resources associated with DLLHandle,
and resets DLLHandle to 0.
}
procedure UnloadDLL ();
begin
if DLLHandle <> 0 then
begin
FreeLibrary(DLLHandle); // Unload the DLL.
DLLHandle := 0 ; // Reset DLLHandle to indicate the DLL is no longer loaded.
end ;
end ;
initialization
// Attempt to load the DLL upon program startup. Halt execution with error
// code 1 if it fails.
if not LoadDLL() then
begin
Halt( 1 );
end ;
finalization
// Ensure the DLL is unloaded upon program termination.
UnloadDLL();
Этот блок основан на оригинальном проекте MemoryDll-Dllredirect с помощью пользователя A-Normal. Мы с благодарностью признаем основополагающих работ, на которой строится это подразделение.
Этот проект лицензирован по лицензии BSD-3-CLAUSE ?, Который позволяет перераспределение и использование в исходных и двоичных формах, с изменением или без них, при условии, что определенные условия выполняются. Он достигает баланса между достоверности и защитой прав участников.
Вклад в память очень рекомендуется. Пожалуйста, не стесняйтесь отправлять проблемы, предложить новые функции или создавать запросы на притяжение, чтобы расширить свои возможности и надежность.

Сделано с ❤ в Delphi