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

ВУЗ: Не указан

Категория: Книга

Дисциплина: Операционные системы

Добавлен: 29.10.2018

Просмотров: 33027

Скачиваний: 742

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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


background image

Утилиты для работы с процессами и диагностики 

Глава 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


background image

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


background image

Утилиты для работы с процессами и диагностики 

Глава 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


background image

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