Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Инжектирование DLL в 64-битный процесс на Windows 7: Проблемы и решения

Delphi , Файловая система , DLL и PlugIns

Инжектирование 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:16:49/0.0033061504364014/0