Инжектирование DLL в процессы является продвинутой техникой, которая требует глубокого понимания работы операционной системы и механизмов защиты. В данной статье мы рассмотрим проблему инжектирования DLL в 64-битный процесс на Windows 7, используя среду разработки Delphi XE3.
Проблема
Разработчик столкнулся с проблемой, при которой функция InjectDLL не могла корректно внедрить 64-битную DLL в 64-битный процесс, несмотря на то, что CreateRemoteThread возвращал код 200. Проблема была актуальна даже при использовании целевой платформы 64 бит и компиляции в Delphi XE3.
Исходный код функции InjectDLL
function InjectDLL(dwPID: DWORD; DLLPath: pwidechar): integer;
var
...
begin
...
if WriteProcessMemory(hProc, Pointer(pRemoteBuffer), lpvoid(DLLPath),
Length(DLLPath) + 1, BytesWritten) = False then
begin
Result := 0;
Exit;
end;
...
end;
Анализ проблемы
В контексте обсуждения было отмечено, что код не вызывает исключений, но есть подозрение на возможное возникновение EAccessViolation. Также было предложено проверить, не передаётся ли nil в качестве аргумента lpStartAddress, что может привести к исключению.
Подтверждённый ответ
Исходя из обсуждения, было выявлено, что проблема может быть связана с использованием LoadLibraryA с UTF-16 кодировкой. Рекомендуется перейти на использование LoadLibraryW или конвертацию имени модуля в ANSI. Кроме того, было предложено заменить Length(DLLPath) + 1 на SizeOf(Char)*(Length(DLLPath) + 1) для копирования всего буфера.
Улучшенный код InjectDLL
function InjectDLL(dwPID: DWORD; DLLPath: PWideChar): integer;
var
...
begin
...
BytesToWrite := SizeOf(WideChar)*(Length(DLLPath) + 1);
pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT, PAGE_READWRITE);
...
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
...
end;
Дополнительные рекомендации
Использовать более узкие права доступа для OpenProcess.
Использовать THandle вместо NativeUInt для работы с дескрипторами.
При использовании MEM_RELEASE передавать 0 в качестве размера.
Альтернативный ответ (вопрос о Mac OS)
Инжектирование DLL — это платформенно-специфичная техника, не предназначенная для использования в кросс-платформенных приложениях, как утверждается для Delphi XE3. Для Mac OS потребуется разработка специализированного решения.
Заключение
Инжектирование DLL в 64-битный процесс — сложная задача, требующая внимания к деталям и понимания работы операционной системы. В данном случае, после внесения предложенных изменений, функция InjectDLL должна работать корректно. Однако, если проблема сохраняется, возможно, стоит рассмотреть другие причины, включая возможные ошибки компилятора Delphi XE3.
Инжектирование DLL в 64-битный процесс на Windows 7: исследование проблемы и предложения по улучшению функции `InjectDLL` в Delphi XE3.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.