Доброго времени суток. Подскажите знающие люди, поиск на просторах интернета результата не дал. Вопрос в следующем: как работает механизм поиска исполняемых файлов и динамических библиотек, например, если рядом с моей программой лежит нужная *.dll она подхватывается, если ее переместить в папку Windows или Windows\System32 она тоже подгрузится. Собственно интересует следующее: каким образом можно отловить факт поиска .dll (ведь если код написан без явного указания пути к dll, то сначала будет проверена текущая папка на наличие .dll, затем пути в переменной окружения PATH) мне именно нужно как-то протоколировать последовательность поиска dll. Буду очень благодарен за любые советы
https://docs.microsoft.com/en-us/windows/desktop/dlls/dynamic-link-library-search-order 'Search Order for Desktop Applications'
М.Руссинович "Внутреннее устройство Windows". стр.281 достаточно внятно расписан алгоритм работы "Загрузчика образов". Нужно перехватить функцию LdrLoadDll() из NTDLL.DLL, т.к. именно она ответственна за поиск и загрузку внешних модулей. Юзерской обёрткой к этой/нативной функции является LoadLibraryEx(), так-что можно потрассировать и её - например в Оле видны все диры, где система ведёт поиск библиотек при динамическом вызове длл'ки.
Можно также погуглить "DLL Hijacking". --- Сообщение объединено, 13 мар 2019 --- Нда, не стоит отвечать не читая. Если задача стоит именно таким образом, думаю необходимо перехватывать связку LoadLibraryExW/QueryOpen, до LdrLoadDll если библиотека не найдена скорее всего не дойдет.
Если из нулевого, то только фильтр и эмпирически оценивать намерения процесса либо проверять стек вызова. Допустим, сначала был запрос query attributes для C:\app\name.dll в директории приложения, dll не была обнаружена, а затем найдена и загружена %Windir%\System32\name.dll из системной директории, можно предположить, что была попытка загрузки C:\app\name.dll. Если в стеке процесса при этом обнаружится LoadLibraryExW, то скорее всего так и есть.
Ну можно и не юзермодные. Если dll не найдена в списке загруженных модулей, то однажды вызывается попытка открытия файла из ntdll (NtOpenFile было, по крайней мере), - можно попытаться перехватить со стороны ядра что там отвечает за открытие файлов. Если интересно про LdrLoadDll - можно почитать в сорцах винды, в ldrapi.c . Подустарело, но все же.