Моя цель — перехватить все вызовы LoadLibrary из определенной библиотеки DLL и ее зависимостей (которые могут быть отложены при импорте). Вот как я пытаюсь решить эту задачу:
Загрузите эту DLL, используя DONT_RESOLVE_DLL_REFERENCES
флаг.
1.1. Примените этот алгоритм к подмодулям dll рекурсивно.
LoadLibraryA
, LoadLibraryW
и т. д. функции просто исправляя таблицу импорта.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
— мой основной модуль):
Когда я просто звоню LoadLibrary("OLMAPI32.dll")
(ПРИМЕЧАНИЕ ПОСЛЕДНЯЯ ЛИНИЯ: mso20win32client.dll
был загружен из olmapi32.dll
— DLL, что я хочу сделать, используя мой метод):
Задача ещё не решена.
Других решений пока нет …