Переменные окружения, проверка на существование файла.

Тема в разделе "WASM.WIN32", создана пользователем guessWh0_o, 9 мар 2019.

  1. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Доброго времени суток. Подскажите знающие люди, поиск на просторах интернета результата не дал. Вопрос в следующем: как работает механизм поиска исполняемых файлов и динамических библиотек, например, если рядом с моей программой лежит нужная *.dll она подхватывается, если ее переместить в папку Windows или Windows\System32 она тоже подгрузится. Собственно интересует следующее: каким образом можно отловить факт поиска .dll (ведь если код написан без явного указания пути к dll, то сначала будет проверена текущая папка на наличие .dll, затем пути в переменной окружения PATH) мне именно нужно как-то протоколировать последовательность поиска dll. Буду очень благодарен за любые советы
     
  2. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Посмотрел в ProcMon стек вызовов, в голову не приходит, что можно перехватить, чтобы узнать путь
     

    Вложения:

    • 1.jpg
      1.jpg
      Размер файла:
      430,5 КБ
      Просмотров:
      586
    • 2.jpg
      2.jpg
      Размер файла:
      148,4 КБ
      Просмотров:
      567
  3. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
  4. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    М.Руссинович "Внутреннее устройство Windows". стр.281
    достаточно внятно расписан алгоритм работы "Загрузчика образов".
    Нужно перехватить функцию LdrLoadDll() из NTDLL.DLL,
    т.к. именно она ответственна за поиск и загрузку внешних модулей.

    Юзерской обёрткой к этой/нативной функции является LoadLibraryEx(),
    так-что можно потрассировать и её - например в Оле видны все диры, где система ведёт поиск библиотек при динамическом вызове длл'ки.
     
    Mikl___ и sty нравится это.
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Можно также погуглить "DLL Hijacking".
    --- Сообщение объединено, 13 мар 2019 ---
    Нда, не стоит отвечать не читая. Если задача стоит именно таким образом, думаю необходимо перехватывать связку LoadLibraryExW/QueryOpen, до LdrLoadDll если библиотека не найдена скорее всего не дойдет.
     
  6. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Как перехватывать юзермодовские функции из нулевого кольца? Я может не совсем понимаю
     
  7. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Если из нулевого, то только фильтр и эмпирически оценивать намерения процесса либо проверять стек вызова. Допустим, сначала был запрос query attributes для C:\app\name.dll в директории приложения, dll не была обнаружена, а затем найдена и загружена %Windir%\System32\name.dll из системной директории, можно предположить, что была попытка загрузки C:\app\name.dll. Если в стеке процесса при этом обнаружится LoadLibraryExW, то скорее всего так и есть.
     
  8. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    Ну можно и не юзермодные. Если dll не найдена в списке загруженных модулей, то однажды вызывается попытка открытия файла из ntdll (NtOpenFile было, по крайней мере), - можно попытаться перехватить со стороны ядра что там отвечает за открытие файлов.
    Если интересно про LdrLoadDll - можно почитать в сорцах винды, в ldrapi.c . Подустарело, но все же.