Как отладить dll windows 10
Обновлено: 21.11.2024
Во время некоторых заданий RedTeam нам приходится писать библиотеки DLL. Однако отладка DLL не так проста, как кажется, поскольку DLL не предназначена для самостоятельной работы.
В этой статье мы рассмотрим, как можно эффективно отлаживать DLL.
Что такое DLL?
DLL — это сокращение от динамически подключаемой библиотеки. Это модульный подход к написанию кода. Библиотеки DLL написаны на C или C++ и при нормальных обстоятельствах служат библиотекой, к которой программы могут обращаться для выполнения функций. В какой-то степени вы можете сравнить DLL с пакетом python или пакетом npm, с любой библиотекой. Следующий рисунок довольно хорошо иллюстрирует концепцию DLL и EXE:
Как уже упоминалось в преамбуле, библиотека DLL не предназначена для выполнения сама по себе, в результате чего стандартный способ отладки не может быть реализован "из коробки".
Способ отладки 1: использование OutputDebugString
У Microsoft есть функция в kernel32.dll (о, смотрите, DLL!) под названием OutputDebugString, которая выводит содержимое строки в системный отладчик. Visual Studio имеет встроенные возможности для получения этих выходных данных (подробнее об этом позже). Я предпочитаю системный отладчик Dbgview.exe из пакета sysinternals. Чтобы проиллюстрировать, как работает OutputDebugString, я подготовил небольшой демонстрационный код:
В качестве доказательства того, что DLL не может работать сама по себе, я пытаюсь запустить DemoDLL с помощью кнопки запуска в Visual Studio, и меня встречает этот маленький человечек:
DLL не работают сами по себе…
К счастью, у Microsoft есть встроенный загрузчик DLL с именем rundllll32.exe, но rundll32.exe может раздражать, если в вашей DLL нет экспортированных функций (= функций, которые будут использоваться другими программами). Мой коллега Дидье Стивенс довольно подробно объясняет точки входа в DLL в своем блоге. Если вам интересно узнать больше об этом, пожалуйста, проверьте это!
Как вы можете видеть в демонстрационном коде, все мои выходные строки отладки содержат «[DBG]», это было сделано не без причины.
Dbgview — это системный отладчик, который будет производить много шума в зависимости от того, что вы установили в системе. Однако в Dbgview есть параметры фильтрации. Поскольку все строки отладки содержат «[DBG]», мы можем указать Dbgview показывать нам только эти сообщения следующим образом:
Фильтр DebugViewer для отображения только строк, содержащих [DBG]
Все настроено, пора запустить нашу DLL и посмотреть на вывод DebugView:
Результат применения фильтра и запуска DLL
Как и ожидалось, выходные данные DebugView отлично показывают наши отладочные строки!
Способ отладки 2: использование Printf
Этот метод использует printf вместо OutputDebugString, поэтому давайте адаптируем наш код:
Используя загрузчик DLL, мы увидим, что все выходные данные printf записываются в стандартный вывод программы-загрузчика DLL, которым в данном случае является окно консоли.
Демонстрация программы-загрузчика DLL
Способ отладки 3. Использование загрузчика DLL для отладки в Visual Studio
Теперь, когда у нас есть суррогатный механизм загрузки DLL, мы можем указать Visual Studio использовать его в качестве родительского процесса, таким образом, мы можем запускать DLL в среде отладки Visual Studio, и мы сможем отлаживать DLL так же, как вы сможете отлаживать EXE-файлы.
Перейдите к свойствам проекта и выберите вкладку "Отладка"
Как открыть окно свойств отладки в Visual Studio
В поле Команда указываем путь к исполняемому файлу загрузчика DLL, в поле Аргументы команды указываем аргументы для загрузчика DLL, в данном случае путь к отладочной демонстрационной DLL, так как у нас нет экспортируемой функции , мы не используем второй аргумент. Если вы хотите использовать второй аргумент, вы можете это сделать, как в консоли.
Окно свойств отладки в Visual Studio
Теперь мы можем настроить несколько точек останова в Visual Studio:
Пример установки точек останова в Visual Studio
Запуск библиотеки DLL теперь можно выполнить с помощью зеленой кнопки воспроизведения в самой Visual Studio. Это даст указание загрузчику DLL начать работу с аргументами, указанными на странице свойств проекта.
Как видите, теперь Visual Studio правильно нажимает и обрабатывает точки останова, как обычно:
Показаны точки останова, когда загрузчик DLL используется в качестве суррогатной программы
Поскольку операторы printf все еще присутствуют, они также будут выводиться в консоль:
Отображение журнала вывода printf на консоль благодаря загрузчику DLL во время отладки в Visual Studio
Заключение
В зависимости от сложности вашего кода DLL в большинстве случаев вы сможете обойтись без использования загрузчика DLL в Visual Studio, чтобы выполнять отладку, как отладку любой другой программы. При желании вы можете комбинировать загрузчик DLL с инструкциями printf, чтобы вы могли видеть обзор происходящего в режиме реального времени через консольный вывод загрузчика DLL.
Однако, если ваша DLL выполняет сложные операции, такие как создание новых потоков или выполнение асинхронных вызовов, лучше использовать OutputDebugString, так как загрузчик DLL не будет принимать во внимание новые потоки или асинхронные вызовы.
На этом наше путешествие в мир отладки библиотек DLL завершено. Я надеюсь, что эта запись в блоге была поучительной и научила вас чему-то полезному!
DLL (библиотека с динамической компоновкой) – это библиотека, содержащая код и данные, которые могут использоваться несколькими приложениями. Вы можете использовать Visual Studio для создания, сборки, настройки и отладки библиотек DLL.
Создать DLL
Следующие шаблоны проектов Visual Studio могут создавать библиотеки DLL:
Отладка библиотеки WCF аналогична отладке библиотеки классов. Дополнительные сведения см. в разделе Элементы управления Windows Forms.
Обычно DLL вызывается из другого проекта. При отладке вызывающего проекта, в зависимости от конфигурации DLL, вы можете перейти к отладке кода DLL.
Конфигурация отладки DLL
При использовании шаблона проекта Visual Studio для создания приложения Visual Studio автоматически создает необходимые параметры для конфигураций сборки отладки и выпуска. При необходимости вы можете изменить эти настройки. Дополнительные сведения см. в следующих статьях:
Установить DebuggableAttribute C++
Чтобы отладчик мог подключиться к C++ DLL, код C++ должен выдавать DebuggableAttribute .
Чтобы установить DebuggableAttribute:
Выберите проект C++ DLL в обозревателе решений и щелкните значок "Свойства" или щелкните проект правой кнопкой мыши и выберите "Свойства".
На панели "Свойства" в разделе "Компоновщик > Отладка" выберите "Да" (/ASSEMBLYDEBUG) для параметра "Отлаживаемая сборка".
Дополнительную информацию см. в разделе /ASSEMBLYDEBUG.
Установить расположение DLL-файлов C/C++
Для отладки внешней библиотеки DLL вызывающий проект должен иметь возможность найти библиотеку DLL, ее файл .pdb и любые другие файлы, необходимые для библиотеки DLL. Вы можете создать пользовательскую задачу сборки, чтобы скопировать эти файлы в свой
Выходная папка\Debug или вы можете скопировать туда файлы вручную.
Для проектов C/C++ расположение заголовков и файлов LIB можно указать на страницах свойств проекта, а не копировать их в выходную папку.
Чтобы задать расположение заголовка C/C++ и файла LIB:
Выберите проект C/C++ DLL в обозревателе решений и щелкните значок "Свойства" или щелкните проект правой кнопкой мыши и выберите "Свойства".
В верхней части панели "Свойства" в разделе "Конфигурация" выберите "Все конфигурации".
В разделе C/C++ > Общие > Дополнительные каталоги включения укажите папку с файлами заголовков.
В разделе Linker > General > Additional Libraries Directorys укажите папку с файлами LIB.
В разделе Linker > Input > Additional Dependencies укажите полный путь и имя файла для файлов LIB.
Выберите ОК.
Дополнительную информацию о параметрах проекта C++ см. в справочнике по странице свойств Windows C++.
Создать отладочную версию
Перед началом отладки обязательно создайте отладочную версию библиотеки DLL. Для отладки библиотеки DLL вызывающее приложение должно иметь возможность найти файл .pdb и любые другие файлы, необходимые для библиотеки DLL.
Вы можете создать пользовательскую задачу сборки для копирования файлов DLL в выходную папку \Debug или скопировать туда файлы вручную.
Убедитесь, что DLL вызывается в правильном месте. Это может показаться очевидным, но если вызывающее приложение найдет и загрузит другую копию библиотеки DLL, отладчик никогда не столкнется с установленными вами точками останова.
Отладка DLL
Вы не можете запустить DLL напрямую. Его должно вызывать приложение, обычно это файл .exe. Дополнительные сведения см. в разделе Проекты Visual Studio — C++.
Для отладки библиотеки DLL вы можете начать отладку из вызывающего приложения или из проекта библиотеки DLL, указав вызывающее приложение. Вы также можете использовать окно Immediate отладчика для оценки функций или методов DLL во время разработки без использования вызывающего приложения.
Начать отладку из вызывающего приложения
Приложение, вызывающее библиотеку DLL, может быть:
- Приложение из проекта Visual Studio в том же или другом решении из библиотеки DLL.
- Существующее приложение, которое уже развернуто и работает на тестовом или рабочем компьютере.
- Находятся в Интернете и доступны через URL-адрес.
- Веб-приложение с веб-страницей, на которой внедрена библиотека DLL.
Чтобы отладить DLL из вызывающего приложения, вы можете:
Откройте проект для вызывающего приложения и начните отладку, выбрав Отладка > Начать отладку или нажав клавишу F5.
Подключиться к приложению, которое уже развернуто и работает на тестовом или рабочем компьютере. Используйте этот метод для DLL на веб-сайтах или в веб-приложениях. Дополнительные сведения см. в разделе Как подключиться к запущенному процессу.
Прежде чем начинать отладку вызывающего приложения, установите точку останова в библиотеке DLL. См. Использование точек останова. Когда срабатывает точка останова DLL, вы можете выполнять код пошагово, наблюдая за действием в каждой строке. Дополнительные сведения см. в разделе Навигация по коду в отладчике.
Во время отладки вы можете использовать окно "Модули" для проверки библиотек DLL и файлов .exe, загружаемых приложением. Чтобы открыть окно «Модули», во время отладки выберите «Отладка» > «Окна» > «Модули». Дополнительные сведения см. в разделе Как использовать окно «Модули».
Использовать окно немедленного просмотра
Вы можете использовать окно Immediate для оценки функций или методов DLL во время разработки. Окно Immediate играет роль вызывающего приложения.
Вы можете использовать окно Immediate во время разработки для большинства типов проектов. Он не поддерживается для SQL, веб-проектов или скриптов.
Например, чтобы протестировать метод с именем Test в классе Class1:
Открыв проект DLL, откройте окно Immediate, выбрав Debug > Windows > Immediate или нажав Ctrl+Alt+I.
Предполагая, что Test принимает один целочисленный параметр, оцените Test с помощью окна Immediate:
Результат распечатывается в окне Immediate.
Вы можете продолжить отладку теста, поместив в него точку останова, а затем снова оценив функцию.
Точка останова будет достигнута, и вы сможете пройти тест. После выхода из Test отладчик вернется в режим разработки.
Отладка в смешанном режиме
Вы можете написать вызывающее приложение для библиотеки DLL в управляемом или машинном коде. Если ваше собственное приложение вызывает управляемую библиотеку DLL и вы хотите отладить обе, вы можете включить как управляемый, так и собственный отладчик в свойствах проекта. Точный процесс зависит от того, хотите ли вы начать отладку из проекта DLL или проекта вызывающего приложения. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Вы также можете выполнять отладку собственной библиотеки DLL из управляемого вызывающего проекта. Дополнительные сведения см. в разделе Как отлаживать управляемый и машинный код.
Один из способов отладки проекта DLL — указать вызывающее приложение в свойствах проекта DLL. Затем вы можете начать отладку из самого проекта DLL. Чтобы этот метод работал, приложение должно вызывать ту же библиотеку DLL в том же расположении, что и настроенное вами. Если приложение найдет и загрузит другую версию библиотеки DLL, эта версия не будет содержать ваших точек останова. Другие методы отладки DLL см. в разделе Отладка проектов DLL.
Если ваше управляемое приложение вызывает собственную библиотеку DLL или ваше собственное приложение вызывает управляемую библиотеку DLL, вы можете отлаживать как библиотеку DLL, так и вызывающее приложение. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Собственные и управляемые проекты DLL имеют разные параметры для указания вызывающих приложений.
Указать вызывающее приложение в собственном проекте DLL
Выберите проект C++ DLL в обозревателе решений. Щелкните значок "Свойства", нажмите клавиши ALT+ВВОД или щелкните правой кнопкой мыши и выберите "Свойства".
В диалоговом окне "Страницы свойств" убедитесь, что в поле "Конфигурация" в верхней части окна установлено значение "Отладка".
Выберите Свойства конфигурации > Отладка.
В списке Отладчик для запуска выберите Локальный отладчик Windows или Удаленный отладчик Windows.
В поле "Команда" или "Удаленная команда" добавьте полный путь и имя файла вызывающего приложения, например файл .exe.
Добавьте все необходимые аргументы программы в поле «Аргументы команды».
Выберите ОК.
Указать вызывающее приложение в управляемом проекте DLL
Убедитесь, что в поле "Конфигурация" в верхней части окна установлено значение "Отладка".
В разделе «Начать действие»:
Добавьте все необходимые аргументы командной строки в поле Аргументы командной строки или Аргументы приложения.
Используйте Файл > Сохранить выбранные элементы или Ctrl+S, чтобы сохранить изменения.
Отладка из проекта DLL
Установите точки останова в проекте DLL.
Щелкните правой кнопкой мыши проект DLL и выберите "Установить как запускаемый проект".
Убедитесь, что в поле "Конфигурация решений" установлено значение "Отладка". Нажмите F5, щелкните зеленую стрелку "Пуск" или выберите "Отладка" > "Начать отладку".
Если отладка не достигает ваших точек останова, убедитесь, что вывод вашей DLL (по умолчанию
\Debug) — это место, куда вызывает вызывающее приложение.
Если вы хотите взломать код в приложении с управляемыми вызовами из собственной библиотеки DLL или наоборот, включите отладку в смешанном режиме.
В некоторых случаях может потребоваться сообщить отладчику, где найти исходный код. Дополнительные сведения см. в разделе Использование страниц без загрузки символов/без загрузки исходного кода.
Чтобы подготовить компьютер к тестированию отладочной версии приложения, созданного с помощью Visual C++, необходимо развернуть отладочные версии библиотек DLL Visual C++, от которых зависит приложение. Чтобы определить, какие библиотеки DLL необходимо развернуть, выполните действия, описанные в разделе Общие сведения о зависимостях приложения Visual C++. Как правило, отладочные версии библиотек DLL Visual C++ имеют имена, оканчивающиеся на "d"; например, отладочная версия msvcr100.dll называется msvcr100d.dll.
Отладочные версии приложения не подлежат повторному распространению, а отладочные версии библиотек DLL библиотеки Visual C++ не подлежат повторному распространению. Вы можете развертывать отладочные версии приложений и библиотеки DLL Visual C++ только на других компьютерах с единственной целью отладки и тестирования приложений на компьютере, на котором не установлена Visual Studio. Дополнительные сведения см. в разделе Распространение файлов Visual C++.
Существует три способа развертывания отладочных версий библиотек DLL Visual C++ вместе с отладочной версией приложения.
Используйте централизованное развертывание, чтобы установить отладочную версию определенной библиотеки DLL Visual C++ в каталог %windir%\system32\ с помощью проекта установки, который включает модули слияния для правильной версии библиотеки и архитектуры вашего приложения. Модули слияния находятся в каталоге Program Files или Program Files (x86) в \Common Files\Merge Modules\. Отладочная версия модуля слияния содержит отладку в имени, например, Microsoft_VC110_DebugCRT_x86.msm. Пример такого развертывания можно найти в пошаговом руководстве: развертывание приложения Visual C++ с помощью проекта установки.
Используйте локальное развертывание для установки отладочной версии определенной библиотеки DLL Visual C++ в каталоге установки приложения с помощью файлов, находящихся в каталоге Program Files или Program Files (x86) в \Microsoft Visual Studio \VC\redist\Debug_NonRedist \.
Для удаленной отладки приложения, созданного с помощью Visual Studio 2005 или Visual Studio 2008, на другом компьютере необходимо развернуть отладочные версии библиотек DLL Visual C++ в виде совместно используемых параллельных сборок. Для установки соответствующих модулей слияния можно использовать либо проект установки, либо установщик Windows.
Используйте параметр_Deploy в диалоговом окне Configuration Manager в Visual Studio, чтобы скопировать выходные данные проекта и другие файлы на удаленный компьютер.
После установки библиотек DLL Visual C++ можно запустить удаленный отладчик в сетевой папке. Дополнительные сведения об удаленной отладке см. в разделе Удаленная отладка.
Читайте также: