Файл: Руссинович М., Маргозис А. Утилиты Sysinternals. Справочник администратора 2012.pdf
Добавлен: 29.10.2018
Просмотров: 33027
Скачиваний: 742

252 Часть
II
Работа с утилитами
Табл. 7-3. (окончание)
Параметр
Описание
-p
Используется на хосте Hyper-V; приостанавливает
целевую виртуальную машину во время получения дампа
(рекомендуется использовать вместе с –o)
параметры
отладчика
Дополнительные параметры командной строки,
передаваемые отладчику ядра
По умолчанию LiveKd получает моментальный снимок локального ком-
пьютера и запускает Kd.exe. Параметры –w и –k позволяют указать WinDbg.
exe или любой другой отладчик вместо Kd.exe. LiveKd передает отладчику
любые дополнительные параметры командной строки, за которыми идет па-
раметр –z и путь к эмулированному файлу дампа.
Чтобы выполнить отладку виртуальной машины Hyper-V с хоста, ука-
жите параметр –hv и имя или GUID этой виртуальной машины. Чтобы
получить список GUID и имен доступных виртуальных машин, запустите
LiveKd с параметром –hvl. Заметьте, что на хосте можно выполнять отладку
только одной виртуальной машины за раз.
При запуске с параметром –o LiveKd просто сохраняет дамп ядра целе-
вой системы в указанный файл и не запускает отладчик. Это полезно для по-
лучения дампов системы для анализа в автономном режиме. Если целевой
системой является виртуальная машина Hyper-V, можно добавить параметр
–p для ее приостановки на время получения моментального снимка, чтобы в
дампе не было нарушенных структур данных.
Если запустить отладчик, не указав параметр –k и путь к отладчику,
LiveKd выполнит поиск Kd.exe или WinDbg.exe в следующих местах:
• текущая папка, из которой произведен запуск LiveKd;
• папка, в которой находится LiveKd;
• стандартный путь установки утилит Debugging Tools («%ProgramFiles%\
Debugging Tools for Windows (x86)» в архитектуре x86 и «%Program-
Files%\Debugging Tools for Windows (x64)» в архитектуре x64);
• папка, указанная переменной PATH.
Если переменная окружения _NT_SYMBOL_PATH не настроена, LiveKd
спросит, нужно ли настроить систему для использования сервера символов
Microsoft, а затем запросит локальную папку, в которую будут загружены
файлы символов (по умолчанию C:\Symbols).
Информацию об использовании отладчиков ядра см. в документации по
утилитам Debugging Tools.
Примечание Отладчик сообщит, что не может найти символы для LiveKdD.SYS. Это
нормально, так как я не публиковал символы для LiveKdD.SYS. Отсутствие этих сим-
волов не повлияет на работу отладчика.
SIN_ch_07.indd 252
27.12.2011 14:30:29

Утилиты для работы с процессами и диагностики
Глава 7 253
Примеры использования LiveKD
Следующая команда выполняет отладку моментального снимка локальной
системы, передавая WinDbg параметры для записи файла журнала и пропу-
ска диалогового окна сохранения рабочего пространства:
livekd -w -Q -logo C:\dbg.txt
Следующая команда получает дамп ядра локальной системы и не запу-
скает отладчик:
livekd -o C:\snapshot.dmp
При выполнении на хосте Hyper-V эта команда возвращает список вир-
туальных машин, доступных для отладки, а затем показывает образец вы-
ходных данных:
C:\>livekd -hvl
Listing active Hyper-V partitions...
Hyper-V VM GUID Partition ID VM Name
------------------------------------ ------------ ------
3187CB6B-1C8B-4968-A501-C8C22468AB77 29 WinXP x86 (SP3)
9A489D58-E69A-48BF-8747-149344164B76 30 Win7 Ultimate x86
DFA26971-62D7-4190-9ED0-61D1B910466B 28 Win7 Ultimate x64
Полученные GUID и имена можно использовать, чтобы указать вирту-
альную машину для отладки. Следующая команда приостанавливает вирту-
альную машину «Win7 Ultimate x64» из предыдущего примера и получает
дамп ядра этой системы, возобновляя ее работу после получения дампа:
livekd -p -o C:\snapshot.dmp -hv DFA26971-62D7-4190-9ED0-61D1B910466B
Наконец, следующая команда выполняет отладку моментального снимка
«WinXP x86 (SP3)» с использованием Kd.exe:
livekd -hv «WinXP x86 (SP3)»
Использование LiveKd для получения дампа памяти ядра онлайн Сталкивались
ли вы с ситуацией, когда требуется получить дамп памяти ядра, но ваш клиент отказы-
вается подключить целевую систему к Интернету, что не дает загрузить необходимые
файлы символов? Я слишком часто имел сомнительное удовольствие разбираться с
такой проблемой, поэтому решил описать ее решение здесь.
Основная проблема в том, что нужны файлы символов для дампа памяти ядра. Как
минимум, нужно иметь символы для Ntoskrnl.exe. Недостаточно просто загрузить сим-
волы для целевой ОС и пакетов обновлений с WHDC или MSDN, поскольку возможны
изменения соответствующих символов свежими обновлениями, вышедшими после
пакета обновлений.
В этом случае я делаю следующее:
SIN_ch_07.indd 253
27.12.2011 14:30:30

254 Часть
II
Работа с утилитами
•
копирую Ntoskrnl.exe и остальные файлы, для которых нужны символы, из пап-
ки System32 компьютера, отладку которого требуется выполнить, и помещаю их в
папку (например, C:\DebugFiles) на компьютере, подключенном к Интернету;
•
устанавливаю на компьютер, подключенный к Интернету, утилиты Debugging Tools
for Windows;
•
из командной строки этой системы выполняю команду Symchk для загрузки сим-
волов для выбранных файлов. Команда будет выглядеть примерно так:
symchk /if C:\DebugFiles\*.* /s srv*C:\DebugSymbols*http://msdl.
microsoft, com/download/symbols
•
копирую загруженные символы на целевую систему (из папки C:\DebugSymbols,
если следовать моему примеру);
•
устанавливаю утилиты Debugging Tools for Windows на том компьютере, с которого
требуется получить дамп памяти ядра, и копирую LiveKd.exe в ту же папку вместе
с отладчиками. Добавляю эту папку в переменную PATH;
•
открываю командную строку с администраторскими привилегиями и записываю
в переменную окружения _NT_SYMBOL_PATH путь к папке с файлами символов.
Например:
SET _NT_SYMBOL_PATH=C:\DebugSymbols
•
из командной строки выполняю команду LiveKd -w -Q to start WinDbg;
•
когда появится приветствие WinDbg, ввожу следующую команду, чтобы создать
полный дамп памяти:
.dump /f c:\memory.dmp
Предварительно следует убедиться, что на диске достаточно места.
•
ввожу q, чтобы выйти из WinDbg, а затем n, чтобы выйти из LiveKd.
Теперь полный дамп памяти (C:\memory.dmp) можно сжать и передать для анализа.
Примечание Этот метод создан на основе статьи из блога Карла Харрисона (http://
blogs.technet.com/carlh).
ListDLLs
ListDLLs — консольная утилита, показывающая информацию о библиоте-
ках DLL, загруженных в процессы на локальном компьютере. Она может
показывать DLL, используемые во всей системе или в отдельных процессах,
и позволяет искать процессы, загрузившие указанную библиотеку DLL. Ее
можно использовать для проверки версии DLL, загруженной процессом, и
пути загрузки. Кроме того, она может указывать библиотеки DLL, которые
были перемещены из предпочитаемого базового адреса или заменены после
загрузки.
ListDLLs требует администраторские права и привилегию Debug
(Отладка) только для получения списка DLL из процессов, запущенных от
SIN_ch_07.indd 254
27.12.2011 14:30:30

Утилиты для работы с процессами и диагностики
Глава 7 255
имени другого пользователя или с более высоким IL. Повышенных разреше-
ний не требуется для работы с процессами, запущенными от имени того же
пользователя, и для процессов с таким же или более низким IL.
Синтаксис командной строки ListDLLs таков:
listdlls [-r] [имя_процесса | PID | -d имя_dll]
При запуске без параметров ListDLLs выводит список всех процессов
и библиотек DLL, загруженных в них (рис. 7-18). Для каждого процесса
ListDLLs выводит разделитель в виде пунктирной линии, имя и PID процес-
са. Если ListDLLs имеет разрешения, необходимые для открытия процесса,
отображается также полная командная строка, использованная для запуска
этого процесса, и библиотеки DLL, загруженные в процесс. ListDLLs сооб-
щает базовый адрес, размер, версию и путь к загруженным DLL в табличном
виде с заголовками столбцов. Базовый адрес — адрес виртуальной памяти,
по которому загружен модуль. Размер — число смежных байтов, начиная от
базового адреса, занимаемых образом DLL. Версия извлекается из ресурса
версии файла, если имеется, в противном случае остается пустой. Путь —
полный путь к библиотеке.
Рис. 7-18. Выходные данные ListDLLs
ListDLLs сравнивает временную отметку из заголовка Portable Executab-
le (PE) образа, расположенного в памяти, с заголовком PE образа на диске.
Различие говорит о том, что файл DLL был заменен на диске после того, как
процесс загрузил его. ListDLLs сообщает о таких различиях следующим об-
разом:
*** Loaded C:\Program Files\Utils\PrivBar.dll differs from file image:
*** File timestamp: Wed Feb 10 22:06:51 2010
*** Loaded image timestamp: Thu Apr 30 01:48:12 2009
*** 0x10000000 0x9c000 1.00.0004.0000 C:\Program Files\Utils\PrivBar.dll
ListDLLs сообщает только о библиотеках DLL, загруженных как испол-
няемые образы. В отличие от функции DLL View утилиты Process Explorer
SIN_ch_07.indd 255
27.12.2011 14:30:30

256 Часть
II
Работа с утилитами
(см. гл. 3), она не перечисляет библиотеки и другие файлы или проецируе-
мые файлы, загруженные загрузчиком образов как данные, включая DLL,
загруженные только для получения ресурсов.
Параметр –r сообщает о библиотеках DLL, которые были перемещены
по другому адресу виртуальной памяти из базового адреса, указанного в об-
разе
2
. Если указать этот параметр, перед перемещенной библиотекой DLL в
выходных данных будет стоять строка, сообщающая о перемещении и ука-
зывающая базовый адрес образа. В следующем примере показана библиоте-
ка webcheck.dll, имеющая базовый адрес образа 0x00400000, но загруженная
по адресу 0x01a50000:
### Relocated from base of 0x00400000:
0x01a50000 0x3d000 8.00.6001.18702 C:\WINDOWS\system32\webcheck.dll
Чтобы ограничить процессы, отображаемые в выходных данных, укажи-
те в командной строке имя или PID процесса. Если указать имя процесса,
ListDLLs покажет только процессы, имя образа которых совпадает или на-
чинается с указанного текста. Например, чтобы получить список DLL, за-
груженных всеми экземплярами Internet Explorer, выполните следующую
команду:
listdlls iexplore.exe
ListDLLs покажет все процессы iexplore.exe и библиотеки DLL, загружен-
ные в каждый из них. Если указать PID, ListDLLs покажет библиотеки DLL
только этого процесса.
Чтобы найти процессы, загрузившие определенную библиотеку DLL,
добавьте в командную строку параметр -d, за которым укажите полное или
частичное имя библиотеки DLL. ListDLLs выполнит поиск всех процессов,
на открытие которых хватает прав, и проверит полный путь каждой из их
библиотек DLL. Если указанное имя встречается в любом месте пути загру-
женной DLL, будет выведена информация об этом процессе и соответствую-
щих DLL. Например, чтобы найти все процессы, загрузившие Crypt32.dll,
выполните следующую команду:
listdlls -d crypt32
Этот параметр можно использовать не только для поиска библиотек DLL
по имени, но и для поиска папок. Чтобы получить список всех DLL, загру-
женных из иерархии папок Program Files, выполните следующую команду:
listdlls -d «program files”
2
С появлением в Windows Vista рандомизации адресного пространства (Address Space Layout
Randomization, ASLR), базовый адрес ASLR-совместимой DLL изменяется после каждой загрузки
системы. ListDLLs сообщает о перемещении библиотеки DLL только в том случае, если она загру-
жается в процесс по другому адресу, отличающемуся от предпочитаемого адреса ASLR в текущем
сеансе работы, из-за конфликта с другим модулем.
SIN_ch_07.indd 256
27.12.2011 14:30:30