Как проверить DLL на подмену функций с помощью Dependency Walker

Когда программа ведет себя странно, вылетает с необъяснимыми ошибками или, что хуже, начинает отправлять данные в неизвестном направлении, есть вероятность, что одна из её библиотек (DLL) была подменена. В среде безопасности это называется DLL Hijacking или DLL Proxying. Суть проста: вредоносный файл подкладывается в папку с программой, маскируется под системный или оригинальный модуль, перехватывает вызовы функций и выполняет свой код, прежде чем передать управление настоящей библиотеке.

Dependency Walker (depends.exe) — это старый, но всё еще рабочий инструмент, который позволяет «заглянуть» внутрь DLL и увидеть, какие функции она экспортирует и от каких других библиотек зависит. Если кто-то подменил вашу DLL, он обязан сохранить оригинальный список функций (экспорты), иначе программа просто не запустится. Именно на этом мы и будем ловить подделку.

Как работает механизм подмены и что мы ищем

Представьте, что программа вызывает функцию CalculateSum из файла math.dll. Если злоумышленник заменит math.dll своим файлом, программа всё равно попытается вызвать CalculateSum. Чтобы программа не «упала» с ошибкой «Точка входа не найдена», хакер создает свою DLL, в которой тоже есть функция с названием CalculateSum.

Но есть нюанс: чтобы не переписывать всю библиотеку с нуля, злоумышленники используют проксирование. Их фальшивая функция просто перенаправляет запрос в оригинальную библиотеку (которую они переименовали, например, в math_orig.dll), но делает это после выполнения своего вредоносного кода.

В Dependency Walker мы ищем три вещи:

  • Странные зависимости (библиотеки, которых не должно быть в этом модуле).
  • Несоответствие списка экспортируемых функций оригиналу.
  • Подозрительные пути загрузки файлов.

Пошаговая инструкция по проверке

Для чистоты эксперимента лучше всего делать проверку на «чистой» машине или в виртуальной среде, чтобы вредоносный код не активировался при анализе, хотя Dependency Walker просто читает структуру файла и не исполняет его.

  1. Запуск и открытие файла. Запустите depends.exe. Перейдите в меню File > Open и выберите подозрительный DLL-файл.
  2. Анализ дерева зависимостей (левая панель). Посмотрите на список модулей. Если вы открыли системную библиотеку, но она почему-то тянет за собой какой-нибудь unknown_module.dll из папки Temp или AppData — это огромный красный флаг.
  3. Проверка таблицы экспортов (Export Function). В правой части окна найдите блок Export Function. Здесь перечислены все функции, которые эта DLL предоставляет внешнему миру.
    • Сравните этот список с аналогичным файлом из заведомо чистой системы (например, с другого ПК с той же версией ОС или программы).
    • Если в списке появились функции, которых нет в оригинале (например, InitMalware или ShellExec), файл подменен.
  4. Проверка путей загрузки. Обратите внимание, откуда именно загружаются зависимости. Если программа должна использовать kernel32.dll из C:\Windows\System32, но Dependency Walker показывает, что она берет её из папки с самой программой — перед вами классический DLL Hijacking.

Сравнение оригинальной и подмененной DLL

Чтобы понять, на что смотреть, привожу таблицу типичных различий. Допустим, мы проверяем библиотеку version.dll.

Признак Оригинальная DLL Подмененная (Proxy) DLL
Расположение C:\Windows\System32 Папка с приложением (.exe)
Зависимости Стандартные системные модули Странные файлы или переименованная копия оригинала
Список функций Строго соответствует документации MS Либо идентичен, либо содержит лишние функции
Размер файла Стандартный (например, 15 КБ) Часто отличается (больше за счет вредоносного кода)

Сценарии анализа: что делать в разных ситуациях

Метод проверки зависит от того, что именно вы подозреваете.

Сценарий А: Вы нашли DLL в папке с программой, которая обычно лежит в System32.
Это самый частый случай. Скорее всего, программа использует механизм поиска DLL (сначала в своей папке, потом в системной).
Что делать: Переименуйте этот файл (например, в version.dll.bak) и запустите программу. Если она работает так же, значит, DLL была лишней или вредоносной. Если перестала — значит, это либо легитимный патч, либо критически важная подмена.

Сценарий Б: Все пути верны, но программа ведет себя странно.
Здесь подмена может быть более глубокой (например, модификация оригинального файла в System32, что сложнее из-за защиты Windows).
Что делать: Используйте Dependency Walker, чтобы выгрузить список всех экспортов. Сравните контрольные суммы (Hash) файла с эталонным образцом из репозиториев или с другого чистого ПК.

Сценарий В: В дереве зависимостей виден «разрыв» (красный значок).
Если функция отмечена красным, значит, она не найдена в зависимых библиотеках.
Что делать: Если в оригинале функция была, а в вашем случае её нет — DLL повреждена или намеренно обрезана для обхода каких-то проверок.

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

Многие новички делают одну и ту же ошибку: пугаются «красных» строк в Dependency Walker. Помните, что Dependency Walker часто показывает отсутствующие функции (например, из-за API Sets в современных версиях Windows 10/11), которые на самом деле работают. Это особенность работы программы с новыми версиями ОС, а не признак вируса.

Другая ошибка — проверка только одной DLL. Подмена часто работает каскадом: A.dll вызывает B.dll, которая на самом деле является прокси-файлом. Проверяйте всю цепочку зависимостей, которую рисует инструмент в левом окне.

Как сделать проверку максимально эффективной

Если вы хотите быть уверены на 100%, не ограничивайтесь одним инструментом. Вот мой проверенный алгоритм:

  • Шаг 1: Сначала проверьте путь к файлу. Если системная DLL лежит не в System32 — это уже повод для подозрений.
  • Шаг 2: Откройте файл в Dependency Walker. Проверьте список экспортов на наличие «мусора» (странных имен функций).
  • Шаг 3: Проверьте зависимости. Ищите файлы с именами вроде orig_xxx.dll, lib_backup.dll — это типичные признаки проксирования.
  • Шаг 4: Проверьте файл через VirusTotal. Если это подмена, то сигнатуры вредоносного кода могут быть известны.
  • Шаг 5: Если есть сомнения, используйте sigcheck из пакета Sysinternals, чтобы проверить цифровую подпись файла. У оригинальных DLL от Microsoft всегда есть валидная подпись. У подделок её либо нет, либо она самоподписанная.

Итог: краткий чек-лист

Чтобы быстро понять, подменена ли DLL, пройдитесь по этим пунктам:

  1. Файл находится в папке с программой, хотя должен быть в системной? → Подозрительно.
  2. В Dependency Walker видны зависимости от странных файлов в папках Temp или AppData? → Подозрительно.
  3. Список экспортируемых функций содержит имена, которых нет в документации к этой библиотеке? → Скорее всего, подмена.
  4. Цифровая подпись файла отсутствует или неверна? → Критический признак подмены.

Если вы обнаружили подмену, первым делом изолируйте файл, заблокируйте запуск программы и проведите полный анализ системы, так как DLL Hijacking обычно является лишь способом доставки основного вредоносного ПО в систему.

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