Сколько времен необходимо получить дамп памяти ядра, но Вы или Ваш клиент (вполне справедливо) отказались присоединить целевую систему к Интернету, предотвращая загрузку необходимых файлов символа? У меня было то сомнительное удовольствие слишком часто, таким образом, я решил записать процесс для своей будущей ссылки.
Ключевая проблема состоит в том, что Вы должны получить корректные файлы символа для дампа памяти ядра. Как минимум у Вас должны быть символы для 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.