Проверка файлов .dll на скрытые подмены функций через Dependency Walker

Представьте ситуацию: ваша программа, которая годами работала как часы, вдруг начала выдавать странные ошибки, падать или, что хуже, вести себя непредсказуемо. Вы проверяете код, логи, настройки — всё чисто. А проблема может крыться в одном маленьком файле с расширением .dll, который система или стороннее приложение незаметно подменило.

Это классическая проблема «DLL Hell», с которой сталкиваются многие разработчики и системные администраторы. Кто-то установил новую игру, кто-то обновил драйвер, и вдруг системная библиотека оказалась заменена на несовместимую или даже вредоносную версию. Как это найти, не перебирая тысячи файлов вручную? Для этой задачи существует старая, но незаменимая утилита — Dependency Walker.

В этой статье я не буду пересказывать сухую теорию о том, как работает динамическая линковка. Мы разберем конкретный сценарий: как взять подозрительный исполняемый файл или саму DLL, прогнать через Dependency Walker и понять, не утащили ли её в сторону, не подменили ли функции и не потерялись ли критические зависимости.

Почему именно Dependency Walker?

Сейчас в Windows есть встроенные средства, вроде dumpbin из Visual Studio или PowerShell-скриптов. Они хороши для автоматизации, но когда нужно визуально и быстро понять структуру зависимостей и найти «слабое звено», Dependency Walker (или его современный форк Dependencies) вне конкуренции.

Его главная фишка — он показывает не просто список файлов, а дерево импорта. Вы видите, кто кого вызывает. Если программа требует функцию DrawWindow из user32.dll, а эта функция в файле на диске отсутствует или имеет другой адрес, Dependency Walker подсветит это красным. Это и есть наш главный индикатор подмены или повреждения.

Подготовка к анализу: какой инструмент брать

Прежде чем начать, важно выбрать правильную версию инструмента. Оригинальный Dependency Walker (depends.exe) от Стива Голдблатта — это легенда, но он давно не обновлялся и плохо работает с современными версиями Windows (10/11), особенно с системными DLL, использующими API Set.

Для реальной задачи проверки на подмену я рекомендую использовать современный форк — Dependencies (часто распространяется как DependenciesGui.exe). Он выглядит почти так же, но корректно обрабатывает новые механизмы загрузки Windows.

Критерий Классический Dependency Walker Современный Dependencies (Форк)
Поддержка Windows 10/11 Плохая (многие системные DLL помечает как отсутствующие) Отличная (понимает API Set Schema)
Поиск подмен функций Эффективен, но может давать ложные тревоги на системе Точнее определяет реальные пути загрузки
Интерфейс Устаревший, но привычный Похож на оригинал, но с темной темой
Рекомендация Только для анализа старого софта (Win XP/7) Для любых современных задач

Дальше я буду описывать процесс на примере современного инструмента, но логика действий идентична для обеих версий.

Сценарий 1: Проверка конкретного файла на наличие «битых» ссылок

Самый частый случай: у вас есть файл app.exe или plugin.dll, который ведет себя странно. Вы хотите убедиться, что он ссылается на правильные библиотеки и что эти библиотеки существуют.

Шаг 1. Загрузка файла

Запустите утилиту и перетащите подозрительный файл в окно программы. Не нажимайте сразу кнопку запуска (Profile), если не хотите видеть логи загрузки в реальном времени. Для статического анализа достаточно просто открыть файл.

Шаг 2. Чтение цветовой индикации

Интерфейс разделен на две основные части: дерево модулей слева и детали справа. Самое важное — это иконки слева.

  • Зеленый значок: Всё хорошо. Модуль найден, все функции импортируются корректно.
  • Желтый значок с восклицательным знаком: Модуль найден, но есть проблемы. Чаще всего это означает, что файл найден не там, где ожидалось (например, в папке программы, а не в System32), или у него неверная разрядность.
  • Красный значок: Критическая ошибка. Файл не найден вообще, или одна из требуемых функций отсутствует.
  • Серый значок: Модуль не загружен, так как он нужен только при определенных условиях (отложенная загрузка).

Если вы видите красные иконки в дереве зависимостей — это первый сигнал тревоги. Разверните ветку красного модуля. В нижнем окне (обычно вкладка Functions) вы увидите список функций, которые ваша программа пытается вызвать.

Ищите функции, помеченные красным цветом или значком вопроса. Если программа ожидает функцию InitializeSecureContext из библиотеки crypto.dll, а в списке импорта этой функции нет — значит, файл crypto.dll, который видит программа, не тот, который нужен. Это явный признак подмены.

Сценарий 2: Поиск скрытой подмены через Profile (Мониторинг загрузки)

Статический анализ хорош, но иногда файл существует, но система подгружает его из неожиданного места. Например, вирус может положить свою версию msvcrt.dll в папку с программой, и Windows загрузит её вместо системной.

Чтобы это отловить, используем режим профилирования.

  1. Нажмите кнопку Start Profiling (зеленый треугольник) или нажмите F7.
  2. Выберите исполняемый файл (.exe), который нужно проверить.
  3. Утилита запустит программу в изолированном режиме и будет записывать каждый шаг загрузки DLL.
  4. Поработайте в программе немного, вызовите ту функцию, которая глючит, и закройте её.

Теперь смотрите на лог событий (Events window). Ищите сообщения об ошибках загрузки. Но самое интересное — это колонка Path (Путь).

Обратите внимание на полные пути к загруженным DLL. Если вы видите, что системная библиотека (например, kernel32.dll) загружается не из C:\Windows\System32, а из C:\Program Files\MyApp\ или временной папки пользователя — это стопроцентная подмена. В 99% случаев нормальные программы не таскают свои копии системных ядер.

Как отличить реальную проблему от ложной тревоги

Dependency Walker — инструмент мощный, но иногда он пугает там, где не надо. Вот таблица ситуаций, которые часто вводят в заблуждение новичков.

Что вы видите Вероятная причина Это подмена?
Много красных DLL с именами типа API-MS-WIN-CORE... Это виртуальные модули Windows 10/11. Реальные файлы лежат в других местах. Нет, это норма для новых ОС.
Флаг «Entry Point Not Found» для функции в ntdll.dll Версия Windows, на которой запущен анализ, отличается от той, для которой скомпилирована программа. Скорее нет, это несовместимость версий ОС.
DLL загружается из папки программы, а не System32 Разработчик намеренно положил свою версию библиотеки (например, старую версию OpenSSL). Возможно. Нужно сверить цифровую подпись.
Отсутствует функция, которую вы сами добавили в код вчера Вы не пересобрали проект или смотрите старую DLL. Нет, это ошибка разработки.

Ключевой момент: если вы видите DLL из папки программы, проверьте её цифровую подпись (свойства файла в Проводнике). Если подпись отсутствует или принадлежит неизвестному издателю — риск подмены высок.

Частые ошибки при анализе

За годы работы с этим инструментом я видел, как коллеги наступали на одни и те же грабли. Вот чего делать не стоит:

  • Паника из-за красных системных DLL. Как уже сказано, в Windows 10/11 многие системные зависимости отображаются как отсутствующие в статическом режиме из-за механизмов виртуализации API. Не тратьте время на лечение API-MS-WIN, если программа работает.
  • Игнорирование разрядности (x86 vs x64). Если вы пытаетесь открыть 64-битную DLL в 32-битной версии Dependency Walker (или наоборот), вы получите кучу ошибок импорта. Всегда проверяйте, что разрядность утилиты совпадает с разрядностью анализируемого файла.
  • Поиск функций по имени без учета декорирования. В C++ имена функций часто «искажаются» компилятором (name mangling). Функция Calculate в файле может называться ?Calculate@@YAHH@Z. Если вы ищете точное совпадение имени и не находите его, не спешите кричать о подмене — используйте фильтр или смотрите на ординалы (порядковые номера).
  • Анализ упакованных файлов. Если файл упакован UPX или другим протектором, Dependency Walker покажет только зависимости упаковщика, а не реальной программы. Сначала нужно распаковать файл (например, через unpacker), и только потом анализировать.

Что делать, если подмена обнаружена?

Допустим, вы нашли проблему: программа грузит zlib1.dll из временной папки, и в ней нет функции compressBound. Ваши действия:

  1. Не удаляйте файл сразу. Если это часть легального софта, удаление может всё сломать. Сначала сделайте копию подозрительного файла для анализа.
  2. Сравните хеш-суммы. Найдите оригинальный файл (на другом компьютере, в дистрибутиве или скачайте с сайта вендора). Посчитайте MD5 или SHA256 хеш подозрительного файла и оригинала. Если они не совпадают — файл изменен.
  3. Проверьте время модификации. Часто подменные файлы имеют дату изменения, отличную от даты установки программы.
  4. Восстановите оригинал. Если файл системный — запустите sfc /scannow в командной строке от имени администратора. Если файл принадлежит программе — переустановите её.

Сценарии выбора: как действовать в разных ситуациях

Не всегда нужно лезть в Dependency Walker. Используйте этот инструмент точечно.

Ситуация А: Программа просто не запускается с ошибкой «Отсутствует файл».
Решение: Dependency Walker здесь избыточен. Посмотрите в лог ошибок Windows или используйте встроенный мониторинг ресурсов. Скорее всего, просто не установлен пакет распространения (Visual C++ Redist).

Ситуация Б: Программа запускается, но вылетает при нажатии кнопки «Экспорт».
Решение: Вот тут нужен Dependency Walker. Запустите профилирование, нажмите кнопку и посмотрите, какая DLL отказала в момент сбоя.

Ситуация В: Подозрение на вирус, который маскируется под системную библиотеку.
Решение: Откройте процесс в Dependency Walker (File -> Open Module -> выберите процесс). Посмотрите пути загрузки всех DLL. Любая системная DLL не из Windows\System32 — кандидат на проверку антивирусом.

Итог и план действий

Dependency Walker — это рентген для ваших исполняемых файлов. Он не лечит сам, но показывает переломы там, где снаружи всё выглядит целым.

Чтобы эффективно использовать его для поиска подмен:

  1. Скачайте современную версию Dependencies, чтобы избежать ложных срабатываний на Windows 10/11.
  2. В первую очередь смотрите на пути загрузки (Path). Несоответствие пути — главный признак подмены.
  3. Обращайте внимание на красные функции в окне импорта. Отсутствие нужной функции в наличии — доказательство несовместимости версии файла.
  4. Не пугайтесь красных системных модулей с приставкой API-MS, это особенность новых версий Windows.
  5. Всегда сверяйте подозрительные файлы с оригиналами по хеш-сумме и цифровой подписи.

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

Информация в статье носит технический и ознакомительный характер. Использование инструментов анализа бинарных файлов требует осторожности. Не удаляйте и не заменяйте системные файлы вручную без создания точки восстановления системы или полной резервной копии, так как это может привести к неработоспособности операционной системы. При подозрении на вредоносное ПО рекомендуется использовать специализированные антивирусные решения.

Оцените статью
PEFile — Безопасность и технологии простым языком