Символы сопоставления при выходе PEB на страницу
Чтобы загрузить символы, отладчик просматривает список модулей, загруженных операционной системой. Указатель на список модулей пользовательского режима является одним из элементов, хранящихся в блоке среды процесса (PEB).
Чтобы освободить память, диспетчер памяти может выложить данные в пользовательском режиме, чтобы освободить место для других компонентов процесса или режима ядра. Выстраивные данные пользовательского режима могут включать структуру данных PEB. Без этой структуры данных отладчик не может определить, для каких изображений загружать символы.
Примечание Это влияет на файлы символов только для модулей пользовательского режима. Модули и символы в режиме ядра не затрагиваются, так как они отслеживаются в другом списке.
Предположим, что модуль пользовательского режима сопоставлен с текущим процессом, и вы хотите исправить символы для него. Найдите любой адрес в диапазоне виртуальных адресов модуля. Например, предположим, что модуль сопоставлен с диапазоном виртуальных адресов, содержащим адрес 7f78e9e000F. Введите следующую команду.
3: kd> !vad 7f78e9e000F 1
Выходные данные команды отображают сведения о дескрипторове виртуального адреса (VAD) для модуля. Выходные данные команды также содержат командную строку перезагрузки, которую можно использовать для загрузки символов модуля. Командная строка перезагрузки содержит начальный адрес (000007f7'8e9e0000) и размер (32000) модуля Блокнота.
VAD @ fffffa80056fb960
...
Reload command: .reload notepad.exe=000007f7`8e9e0000,32000
Чтобы загрузить символы, введите команду, указанную в командной строке Перезагрузить.
.reload notepad.exe=000007f7`8e9e0000,32000
Вот еще один пример, в котором используется немного другой метод. В этом примере показано, как использовать расширение !vad для сопоставления символов при выходе PEB на страницу. Основная идея заключается в том, чтобы найти начальный адрес и размер соответствующей библиотеки DLL, чтобы затем можно было использовать команду .reload для загрузки необходимых символов. Предположим, что адрес текущего процесса — 0xE0000126'01BA0AF0, и вы хотите исправить для него символы. Сначала используйте команду !process , чтобы получить корневой адрес дескриптора виртуального адреса (VAD):
kd> !process e000012601ba0af0 1
PROCESS e000012601ba0af0
SessionId: 2 Cid: 0b50 Peb: 6fbfffde000 ParentCid: 0efc
DirBase: 079e8461 ObjectTable: e000000600fbceb0 HandleCount: 360.
Image: explorer.exe
VadRoot e000012601a35e70 Vads 201 Clone 0 Private 917. Modified 2198. Locked 0.
...
Затем используйте расширение !vad , чтобы получить список дерева VAD, связанного с процессом. Эти ВАД с меткой "EXECUTE_WRITECOPY" относятся к модулям кода.
kd> !vad e000012601a35e70
VAD level start end commit
...
e0000126019f9790 ( 6) 3fff0 3fff7 -1 Private READONLY
e000012601be1080 ( 7) 37d9bd30 37d9bd3e 2 Mapped Exe EXECUTE_WRITECOPY <-- these are DLLs
e000012600acd970 ( 5) 37d9bec0 37d9bece 2 Mapped Exe EXECUTE_WRITECOPY
e000012601a5cba0 ( 7) 37d9c910 37d9c924 2 Mapped Exe EXECUTE_WRITECOPY
...
Затем снова используйте расширение !vad , чтобы найти начальный адрес и размер выстраивной памяти, которая содержит интересующую библиотеку DLL. Это подтверждает, что вы нашли правильную библиотеку DLL:
kd> !vad e000012601be1080 1
VAD @ e000012601be1080
Start VPN: 37d9bd30 End VPN: 37d9bd3e Control Area: e00001260197b8d0
First ProtoPte: e0000006013e00a0 Last PTE fffffffffffffffc Commit Charge 2 (2.)
Secured.Flink 0 Blink 0 Banked/Extend: 0
File Offset 0
ImageMap ViewShare EXECUTE_WRITECOPY
...
File: \Windows\System32\ExplorerFrame.dll
В поле "Запуск VPN" (в данном случае 0x37D9BD30) указывается начальный номер виртуальной страницы. Его необходимо преобразовать в фактический адрес, умножив его на размер страницы. Вы можете использовать ? (Вычисление выражения) команда для умножения этого значения на 0x2000, то есть размер страницы для компьютера на основе Itanium, с которого получен пример.
kd> ? 37d9bd3e*2000
Evaluate expression: 7676040298496 = 000006fb`37a7c000
Затем размер диапазона можно преобразовать в байты:
kd> ? 37d9bd3e-37d9bd30+1 <-- computes the number of pages
Evaluate expression: 15 = 00000000`0000000f
kd> ? f*2000
Evaluate expression: 122880 = 00000000`0001e000
Таким образом, ExplorerFrame.dll начинается с адреса 0x000006Fb'37A7C000 и 0x1E000 байтов. Вы можете загрузить его символы с помощью:
kd> .reload /f ExplorerFrame.dll=6fb`37a7c000,1e000