Когда программа ведет себя странно, вылетает с необъяснимыми ошибками или, что хуже, начинает отправлять данные в неизвестном направлении, есть вероятность, что одна из её библиотек (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 просто читает структуру файла и не исполняет его.
- Запуск и открытие файла. Запустите
depends.exe. Перейдите в менюFile > Openи выберите подозрительный DLL-файл. - Анализ дерева зависимостей (левая панель). Посмотрите на список модулей. Если вы открыли системную библиотеку, но она почему-то тянет за собой какой-нибудь
unknown_module.dllиз папкиTempилиAppData— это огромный красный флаг. - Проверка таблицы экспортов (Export Function). В правой части окна найдите блок
Export Function. Здесь перечислены все функции, которые эта DLL предоставляет внешнему миру.- Сравните этот список с аналогичным файлом из заведомо чистой системы (например, с другого ПК с той же версией ОС или программы).
- Если в списке появились функции, которых нет в оригинале (например,
InitMalwareилиShellExec), файл подменен.
- Проверка путей загрузки. Обратите внимание, откуда именно загружаются зависимости. Если программа должна использовать
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, пройдитесь по этим пунктам:
- Файл находится в папке с программой, хотя должен быть в системной? → Подозрительно.
- В Dependency Walker видны зависимости от странных файлов в папках Temp или AppData? → Подозрительно.
- Список экспортируемых функций содержит имена, которых нет в документации к этой библиотеке? → Скорее всего, подмена.
- Цифровая подпись файла отсутствует или неверна? → Критический признак подмены.
Если вы обнаружили подмену, первым делом изолируйте файл, заблокируйте запуск программы и проведите полный анализ системы, так как DLL Hijacking обычно является лишь способом доставки основного вредоносного ПО в систему.
