Принудительно загрузить модуль (DLL) по определенному адресу - PullRequest
1 голос
/ 27 марта 2019
  • Исполняемый файл загружается и запускается в WinDbg
  • Он загружает необходимые ему модули по определенным адресам
  • Установка / отслеживание точек останова, полученных в этом сеансе, зависит от этих адресов
  • Когда другой сеанс запускается для того же исполняемого файла (либо в зависимости от того, как путь выполнения кода изменяет порядок зависимости dll, либо от некоторого неопределенного поведения загрузчика?), Модули теперь загружаются по разным адресам.

Было бы полезно, если бы был способ проинструктировать windbg / loader загружать еще не загруженные модули по заданным адресам.Это сделало бы некоторые сценарии / сравнения текста намного проще.

Да, я понимаю, что, например, установка точек останова относительно имен символов должна быть предпочтительнее, чем использование фиксированных адресов, но возможность "воспроизводить"Среда отладки ссылок определенно имеет определенные преимущества.

Предполагая, что мы имеем дело с сторонними DLL-библиотеками (которые я не могу перекомпилировать с предопределенными адресами загрузки), есть ли способ сделать это?

Я былтак рад видеть, что .reload команда имеет параметр адреса, который выглядел так, как будто бы он делал именно то, что я спрашиваю.Тем не менее, даже если эта команда загрузит модули, когда программа будет продолжена (и требуется фактическая загрузка DLL), она продолжит работу и все еще загрузит другую копию (?) Для того же модуля и выдаст предупреждение типа:

WARNING: moduleX_1be0000 overlaps moduleX

Так что на самом деле это не сработало, как я ожидал, поэтому этот вопрос!

1 Ответ

1 голос
/ 28 марта 2019

WinDbg не загружает модули (DLL). Модули загружаются исполняемым файлом.

Команды WinDbg ld и .reload не загружают модули, они загружают информацию о символах (файлы PDB).

Процесс изменения адреса модуля называется перебазированием. Это происходит, если базовый адрес больше не доступен, например, используется уже кучей. В этом случае вы вообще не сможете предотвратить перебазирование.

Одна вещь, которая может помочь, это отключение ASLR (рандомизация расположения адресного пространства). Вы можете изменить этот параметр в DLL или EXE. Это часть заголовка COFF:

Stud_PE changing a COFF flag

В Windows 7 были способы , чтобы полностью отключить ASLR , но не рекомендуется изменять этот параметр отдельно для каждой системы, чтобы помочь вам отладить один процесс.

Другой вариант - использовать rebase.exe Windows SDK и изменить базовый адрес на виртуальный адрес, который, по вашему мнению, с большей вероятностью будет свободен во время загрузки DLL. Я никогда не делал этого сам, но справка rebase говорит:

Если вы хотите перебазировать на фиксированный адрес (аля QFE) используйте формат @@ files.txt, где files.txt содержит комбинация адрес / размер в дополнение к имени файла

Итак, возможно определить ваш собственный адрес.

...