Онлайновый Дамп Памяти Ядра Используя LiveKd

Сколько времен необходимо получить дамп памяти ядра, но Вы или Ваш клиент (вполне справедливо) отказались присоединить целевую систему к Интернету, предотвращая загрузку необходимых файлов символа? У меня было то сомнительное удовольствие слишком часто, таким образом, я решил записать процесс для своей будущей ссылки.

Ключевая проблема состоит в том, что Вы должны получить корректные файлы символа для дампа памяти ядра. Как минимум у Вас должны быть символы для Ntoskrnl.exe. Только загрузка пакетов файла символа от WHDC или MSDN для Вашей операционной системы и версии пакета обновления не совсем достаточно хороша, потому что файлы и соответствующие символы, возможно, были изменены обновлениями, так как пакет обновления был выпущен.

Вот процесс, за которым я следую:

■                Копия Ntoskrnl.exe и любые другие файлы, для которых Вы хотите, чтобы символы от папки System32 на компьютере были отлажены к папке (например, C:\DebugFiles) на компьютере с доступом к Интернету.

■                Установите Средства отладки для Windows на бывшей обращенным к Интернету системе.

 

■                От командной строки на той системе выполненный Symchk, чтобы загрузить символы для файлов Вы выбрали в новую папку. Команда могла бы быть похожей на это:

symchk/, если C:\DebugFiles\*.*/s srv*C:\DebugSymbols*http://msdl.microsoft.

com/download/symbols.

■                Скопируйте загруженные символы (например, папка C:\DebugSymbols в предыдущем примере) от бывшей обращенным к Интернету системы до исходной системы.

■                Установите Средства отладки для Windows на компьютере, с которого Вы требуете дампа памяти ядра, и копируете LiveKd.exe в ту же самую папку с отладчиками. Добавьте эту папку к ПУТИ.

■                С полномочиями администратора откройте командную строку и установите ­переменную окружения _NT_SYMBOL_PATH в папку, содержащую файлы символа. Например:

НАБОР _NT_SYMBOL_PATH=C:\DebugSymbols.

■                В командной строке, выполненный LiveKd-w-Q, чтобы запустить 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 требует, чтобы административные права, включая полномочие Отладки, только перечислили DLL в процессах, работающих как различный пользователь или на более высоком уровне целостности. Это не требует поднятых полномочий для процессов, работающих как тот же самый пользователь и на том же самом уровне целостности или более низком.

Синтаксис командной строки для ListDLLs - listdlls [-r] [processname | PID |-d dllname].

Выполните ListDLLs без параметров командной строки, чтобы перечислить все процессы и DLL, загруженные в них, как показано в рисунке 7-18. Для каждого процесса ListDLLs выводит разделитель пунктирной линии, сопровождаемый именем процесса и PID. Если у ListDLLs есть необходимые полномочия, чтобы открыть процесс, он тогда выводит на экран полную командную строку, которая использовалась, чтобы запустить процесс, сопровождаемый DLL, загруженными в процессе. ListDLLs сообщает о базовом адресе, размере, версии, и пути загруженных DLL в табличной форме с заголовками столбца. Базовый адрес - адрес виртуальной памяти, в котором загружается модуль. Размер - число непрерывных байтов, запускающихся с базового адреса, использованного изображением DLL. Версия извлекается из ресурса версии файла, если существующий; иначе, это оставляется незаполненное. Путь - весь путь к DLL.

Рис. 7-18. ListDLLs выводится.

ListDLLs сравнивает отметку времени в Переносимой Исполнимой программе изображения (PE) заголовок в памяти к этому в заголовке PE изображения на диске. Различие указывает, что файл DLL был заменен на диске после процесса, загруженного оно. ListDLLs отмечает эти различия для вывода как следующий.

ListDLLs сообщает только о DLL, которые загружаются как исполнимые изображения. В отличие от Представления DLL Проводника Процесса (обсужденный в Главе 3), это не перечисляет DLL или другие файлы или отображения файла, загруженные загрузчиком изображения как данные, включая DLL, которые загружаются для ресурсов только.

-r опция отмечает DLL, которые были перемещены к различному адресу виртуальной памяти от базового адреса, определенного в изображении 2 С определенным -r, DLL, который был перемещен, будут предшествовать в выводе со строкой, сообщая о перемещении и базовом адресе изображения.

Следующий вывод в качестве примера показывает webcheck.dll с базовым адресом изображения 0x00400000, но загруженный в 0x01a50000:

### Перемещенный от основы 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, ListDLLs выводит информацию для процесса и для соответствующих DLL. Например, чтобы искать все процессы, которые загрузились Crypt32.dll, выполнял следующую команду:

listdlls-d crypt32.

Можно использовать эту опцию не только, чтобы искать DLL по имени, но и для расположений папки также. Чтобы перечислить все DLL, которые были загружены из иерархии папки Программных файлов, можно выполнить эту команду:

listdlls-d "программные файлы".

С Рандомизацией Расположения Адресного пространства (ASLR), представленный в Windows Vista, базовый адрес ASLR-совместимого DLL изменяется при первой загрузке после каждой начальной загрузки. ListDLLs сообщает о DLL как перемещено, только если он загружается в ­процессе в различный адрес от его привилегированного адреса ASLR в том сеансе начальной загрузки из-за конфликта с другим модулем.

 

Дескриптор. Handle

Дескриптор - консольная утилита, которая выводит на экран информацию об объектных дескрипторах, сохраненных процессами на системе. Дескрипторы представляют открытые экземпляры основных объектов операционной системы, с которыми приложения взаимодействуют, такие как файлы, регистрационные ключи, примитивы синхронизации, и разделяемая память. Можно использовать утилиту Handle, чтобы искать программы, у которых есть файл или открытая папка, предотвращая ее доступ или удаление из другой программы. Можно также использовать Дескриптор, чтобы перечислить объектные типы и имена, сохраненные определенной программой. Для получения дополнительной информации об объектных дескрипторах, см. "Дескрипторы" в Главе 2.

Поскольку основная цель для Дескриптора состоит в том, чтобы идентифицировать файлы в использовании и папки, выполняя Дескриптор без любых параметров командной строки перечисляет весь Файл и названные Описатели секции, принадлежавшие тем процессам. Параметры командной строки дескриптора в различных комбинациях позволяют Вам перечислять все объектные типы, поиск объектов по имени, предел, которые обрабатывают или ­обрабатывают, чтобы включать, вывести на экран количества дескриптора объектным типом, показывает детали о поддержанных файлом подкачки объектах Раздела, выводит на экран имя пользователя с информацией о дескрипторе, или (хотя обычно опрометчивый) закрывают открытые дескрипторы.

Отметьте, что загрузка DLL или отображение другого типа файла в адресное пространство процесса через API LoadLibrary также не добавляют дескриптор к таблице дескриптора процесса. Такие файлы могут поэтому использоваться и не быть в состоянии быть удаленными, даже при том, что поиск дескриптора мог бы подойти пустой. ListDLLs, описанный ранее в этой главе, может идентифицировать DLL, загруженные как ­исполнимые изображения. Более мощно поиски функции Находки Проводника Процесса и DLL и дескриптор называют в единственной работе, и это включает DLL, отображенные как данные. Проводник процесса описывается в Главе 3.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: