Проверка DLL на подмену функций через Dependency Walker

Когда программа ведёт себя странно — вылетает, не запускается или работает не так, как должна — одна из возможных причин заключается в подмене функций внутри системных или сторонних библиотек DLL. Злоумышленник (или даже некорректный софт) может перехватить вызов функции, подставив свой код вместо оригинального. Это называется перехватом функций или модификацией таблицы импорта (IAT Hook). Dependency Walker — инструмент, позволяющий визуально оценить, все ли функции в импортируемых DLL находятся на своих местах и не были подменены.

Для кого это и когда пригодится

Метод проверки актуален, если вы:

  • разрабатываете ПО и хотите убедиться, что ваш код не подвергается несанкционированному вмешательству;
  • отлавливаете подозрительное поведение уже установленной программы — необъяснимые сетевые подключения, падения, некорректную работу;
  • проверяете файл после распаковки из неизвестного источника или после восстановления предыдуlysis;
  • занимаетесь ретроспективной анализом вредоносного ПО в изолированной среде.

Что такое подмена функций в DLL

Каждый DLL-файл содержит таблицу импорта (IAT), в которой указаны адреса функций, вызываемых из этой библиотеки. При загрузке ОС заполняет эту таблицу реальными адресами процедур. Подмена функции — это ситуация, когда в таблице вместо адреса оригинальной функции оказывается адрес другой — обычно вредоносной или отладочной. Программа думает, что вызывает нужную функцию, но на самом деле попадает в чужой код.

Подмену можно обнаружить по косвенным признакам: функции в IAT ведут не туда, где они должны находиться, появляются нехарактерные переходы между секциями. Dependency Walker позволяет визуально сравнить ожидаемые и реальные адреса, а также выявить признаки перехвата.

Особенности Dependency Walker

Dependency Walker (depends.exe) — утилита, анализирующая структуру PE-файлов и отображающая дерево зависимостей. Она показывает:

  • список всех DLL, от которых зависит файл;
  • экспортируемые функции каждой библиотеки;
  • есть ли сведения о адресах функций и их соответствии;
  • потенциальные проблемы: отсутствующие функции, неразрешённые зависимости, необычные переходы.

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

Пошаговая проверка

  1. Скачайте и запустите Dependency Walker. Программа портативная, не требует установки. Откройте папку с depends.exe и запустите от имени администратора для корректного анализа.
  2. Загрузите проверяемый файл. Через меню File → Open выберите исполняемый файл (.exe) или DLL, который нужно проверить. Можно перетащить файл на окно утилиты.
  3. Изучите дерево зависимостей. В верхней панели отобразится список модулей. Красные иконки означают ошибки — чаще всего отсутствующие DLL или функции. Белые и зелёные — норма.
  4. Перейдите к деталям импорта. Кликните на любой DLL в левой части, и в правой панели увидите список импортируемых функций. Обратите внимание на колонку «Function» — там указаны названия функций. Если вместо имени вы видите адрес (например, 0x77D10000), это признак потенциальной подмены или наличия перехвата.
  5. Проверьте экспорт библиотеки. Отдельно откройте саму DLL в Dependency Walker, чтобы увидеть её оригинальный экспорт. Если в экспорте отсутствуют функции, которые должны там быть, это явный признак модификации файла.
  6. Сравните с эталоном. Если у вас есть заведомо чистая версия DLL (например, с другого компьютера или из дистрибутива), откройте её в отдельном окне и сопоставьте списки функций и их порядок.
  7. Используйте Profiling Mode. В меню Profile → Start Profiling запустите приложение под контролем Dependency Walker. Утилита покажет реальные адреса вызовов во время работы и позволит увидеть, происходит ли переход на неожиданные участки кода.

На что смотреть в первую очередь

При анализе обращайте внимание на следующие тревожные сигналы:

  • Функции вместо имён показывают адреса. В норме Dependency Walker разрешает имена функций через экспорт DLL. Если он не может этого сделать и отображает только числовые адреса, возможно, библиотека модифицирована или импорт «сломан».
  • Несоответствие расположения функций. После загрузки процесса посмотрите в режиме профилирования, куда именно ведут адреса из IAT. Если адрес функции указывает внутрь секции, не принадлежащей оригинальному коду, — признак перехвата.
  • Отсутствие ожидаемых функций в экспорте. Если DLL должна экспортировать определённый набор функций (можно проверить на эталонной версии), а в анализируемом файле их нет — файл модифицирован.
  • Необычные DLL в дереве зависимостей. Появление библиотек, которых не должно быть (например, сторонние модули в системном приложении), может указывать на внедрение через инъекцию.
  • Красные элементы в дереве. Ошибки загрузки модулей или неразрешённые импорты требуют внимания — иногда это последствие умышленной модификации.

Ограничения Dependency Walker и что учитывать

Важно понимать: Dependency Walker не является детектором вредоносного ПО и не покажет все виды подмены.

  • Утилита работает со статической структурой файла и может не обнаружить динамическую подмену, выполненную уже после загрузки в память.
  • Некоторые виды перехвата (например, через модификацию самого загрузчика или inline-перехват внутри кода закладок) не видны через IAT и не отображаются в утилите.
  • Современные версии Windows используют механизмы вроде API Set, которые могут показывать неочевидные имена DLL вроде api-ms-win-*.dll. Это нормальное явление, а не признак подмены.
  • Файл может быть упакован или обфусцирован. В таком случае Dependency Walker покажет минимум информации — это тоже стоит принять к сведению.

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

Сравнение подходов к проверке DLL

Метод Что выявляет Сложность Нужен ли запуск процесса Уровень детализации
Dependency Walker (статический анализ) Отсутствующие функции, модифицированный импорт, необычные _address_ в IAT Низкая Нет (достаточно файла) Структурный — видно таблицу импорта
Dependency Walker (режим Profiling) Реальные адреса вызовов, аномальные переходы, динамические подмены при выполнении Средняя Да Высокий — видно поведение в рантайме
RIDA / Ghidra / IDA (дизассемблирование) Inline-перехваты, модификации внутри кода, обфускацию Высокая Нет (статический файл) Очень высокий — видно построчно
Process Monitor (ProcMon) Обращения к файлам DLL на диске и в реестре, загрузка неожиданных модулей Средняя Да Средний — поведенческий анализ
Антивирусные сканеры Известные сигнатуры вредоносных DLL, подозрительные файлы Низкая Нет Низкий — только совпадения с базами

Что делать в зависимости от ситуации

Если вы разработчик и хотите защитить свой продукт:

  • Встройте в код проверку целостности критичных DLL через контрольные суммы (например, подпись библиотеки).
  • Используйте цифровые подписи — их можно проверить до загрузки.
  • Регулярно прогоняйте свои сборки через Dependency Walker и сравнивайте дерево импорта с эталонным.

Если вы подозреваете конкретную программу:

  • Скачайте заведомо чистую версию приложения с официального источника.
  • Откройте оба файла в Dependency Walker и сравните импорты — любые расхождения в функциях или их адресах требуют внимания.
  • Если обнаружили модифицированную DLL — замените её эталонной версией.

Если разбираете потенциально вредоносный файл:

  • Работайте в изолированной среде (виртуальная машина, песочница).
  • Запустите Dependency Walker в режиме Profiling, чтобы увидеть динамическое поведение.
  • Фиксируйте все аномалии: необычные переходы, вызовы нестандартных функций, загрузку дополнительных DLL.

Типичные ошибки при проверке

  • Путаница из-за API Set. На Windows 10 и 11 многие системные вызовы проходят через виртуальные библиотеки api-ms-win-*.dll. Они перенаправляют к реальным системным DLL. Красных ошибок здесь быть не должно — это штатная архитектура ОС.
  • Отсутствие эталонной версии. Сравнение «на глаз» с неизвестно чем не даёт результата. Нужно иметь чистый образ DLL для сопоставления.
  • Игнорирование режима Profiling. Статический анализ видит только структуру файла. Многие перехваты происходят в памяти и не видны без запуска.
  • Принятие упаковщика за подмену. Если файл упакован (UPX, Themida и т.п.), Dependency Walker покажет скудную информацию об импорте. Это не подмена, а упаковка — но сам факт упаковки тоже стоит отметить.
  • Не проверяете цифровую подпись. Даже если структура выглядит нормально, отсутствие валидной подписи у системной DLL — повод для беспокойства.

Как лучше организовать проверку

  1. Всегда работайте с копией файла. Никогда не анализируйте единственный экземпляр — иначе рискуете потерять оригинал.
  2. Сначала статический анализ, потом динамический. Откройте файл в Dependency Walker без запуска, оцените структуру. Потом запустите в режиме Profiling для полноты картины.
  3. Сотните результаты. Записывайте или делайте скриншоты дерева зависимостей и списков функций — это пригодится для сравнения.
  4. Проверяйте цифровые подписи отдельно. Используйте встроенные средства Windows (Свойства файла → Цифровые подписи) или утилиты вроде Sigcheck.
  5. Комбинируйте инструменты. Dependency Walker даёт структуру, Process Monitor — поведение, дизассемблер — детали кода. Вместе они дают полную картину.

Заключение

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

Если после проверки вы видите красные ошибки, адреса вместим имён функций или незнакомые библиотеки в дереве зависимостей — это сигнал к более тщательному анализу с привлечением дизассемблеров и динамических инструментов. Если структура выглядит чистой, но подозрения остаются — проверьте файл в режиме Profiling и обязательно сверьте с эталонной версией.

В любом случае, не полагайтесь на один инструмент. Комбинируйте статический и динамический анализ, проверяйте подписи и всегда работайте с копиями файлов.

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