Установить перехват на LoadLibrary, который был вызван из DllMain перехваченной задержки DLL

Моя цель — перехватить все вызовы LoadLibrary из определенной библиотеки DLL и ее зависимостей (которые могут быть отложены при импорте). Вот как я пытаюсь решить эту задачу:

  1. Загрузите эту DLL, используя DONT_RESOLVE_DLL_REFERENCES флаг.

    1.1. Примените этот алгоритм к подмодулям dll рекурсивно.

  2. Заполните таблицу импорта этой библиотеки вручную.
  3. Зацепить всех LoadLibraryA, LoadLibraryW и т. д. функции просто исправляя таблицу импорта.
  4. Вызов DllMain этого DLL вручную DLL_PROCESS_ATTACH флаг.

И у меня была проблема с последним шагом. Если я позвоню DllMain вручную, то все внутреннее LoadLibrary вызовы будут выполняться из адресного пространства моего модуля (не из dll), и все мои хуки из шага 3 не вызывают.

И я не хочу, чтобы зацепить LoadLibrary звонки в моем основном модуле, потому что есть другой код, который вызывает LoadLibrary и я не буду иметь такие побочные эффекты.

Поэтому мой вопрос заключается в том, как я должен вызвать DllMain, чтобы заставить его не использовать LoadLibrary из моего основного модуля? Это из-за задержки импорта? Или это только потому, что я называю DllMain? Или, может быть, есть лучшее решение этой задачи?

Вот как я запускаю dll:

void PEUtility::runDllMain(HMODULE module)
{
typedef BOOL(WINAPI *DllMainFunPtr)(HMODULE, DWORD, LPVOID);

auto header = ImageNtHeader(module);

auto dllMain = (DllMainFunPtr)(header->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)module);
dllMain(module, DLL_PROCESS_ATTACH, NULL);
}

Вот как я заполняю таблицу импорта: мой вопрос о том, как я заполняю таблицу импорта

LoadLibrary перехват аналогичен заполнению таблицы импорта.

ОБНОВИТЬ

Я добавил пару скриншотов из ApiMonitor чтобы продемонстрировать, что LoadLibrary("...mso20win32client.dll") был вызван из разных модулей для случая, то я загружаю родительскую библиотеку olmapi32.dll (который зависит от mso20win32client.dll) используя все эти вещи, описанные выше, и для случая, я просто звоню LoadLibrary:

Когда я использую мой метод, описанный выше (используя DONT_RESOLVE_DLL_REFERENCES, DllMain и т. д.) (ПРИМЕЧАНИЕ: ПОСЛЕДНЯЯ ЛИНИЯ: mso20win32client.dll был загружен из mapi32ex64.dll — мой основной модуль):
погрузка'olmapi32.dll' using stuff above

Когда я просто звоню LoadLibrary("OLMAPI32.dll") (ПРИМЕЧАНИЕ ПОСЛЕДНЯЯ ЛИНИЯ: mso20win32client.dll был загружен из olmapi32.dll — DLL, что я хочу сделать, используя мой метод):
введите описание изображения здесь

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector