Поделиться через


!chkimg

Расширение !chkimg обнаруживает повреждение в образах исполняемых файлов, сравнивая их с копией в хранилище символов или другом репозитории файлов.

!chkimg [Options] [-mmw LogFile LogOptions] [Module]

Параметры

Параметры любого сочетания следующих параметров:

-p **** SearchPath
Рекурсивно выполняет поиск в SearchPath файла перед доступом к серверу символов.

-f
Исправляет ошибки в изображении. Когда сканирование обнаруживает различия между файлом в хранилище символов и изображением в памяти, содержимое файла в хранилище символов копируется по изображению. При выполнении динамической отладки можно создать файл дампа перед выполнением расширения !chkimg -f .

-nar
Запрещает перемещение сопоставленного изображения файла на сервере символов. По умолчанию, когда копия файла расположена на сервере символов и сопоставлена с памятью, !chkimg перемещает изображение файла на сервере символов. Однако если вы используете параметр -nar , изображение файла с сервера не перемещается.

Исполняемый образ, который уже находится в памяти (т. е. сканируемый) перемещается, так как отладчик всегда перемещает изображения, которые он загружает.

Этот параметр полезен, только если операционная система уже перемещена исходного образа. Если изображение не было перемещено, !chkimg и отладчик переместит изображение. Использование этого параметра редко.

-ss **** SectionName
Ограничивает сканирование этими разделами, имена которых содержат строку SectionName. Проверка будет включать любой неотброшенный раздел, имя которого содержит эту строку. SectionName учитывает регистр и не может превышать 8 символов.

-как
Вызывает сканирование для включения всех разделов изображения, кроме отменяемых разделов. По умолчанию (если вы не используете -as или -ss), сканирование пропускает разделы, которые могут быть записаны, разделы, которые не являются исполняемыми, разделы с "PAGE" в их имени и отменяемые разделы.

-r **** StartAddress EndAddress ****
Ограничивает сканирование диапазоном памяти, начинающимся с StartAddress и заканчивающимся EndAddress. В этом диапазоне сканируются все разделы, которые обычно сканируются. Если раздел частично перекрывается с этим диапазоном, сканируется только эта часть раздела, перекрывающаяся с этим диапазоном. Проверка ограничена этим диапазоном , даже если вы также используете переключатель -as или -ss .

-nospec
Вызывает сканирование для включения зарезервированных разделов Hal.dll и Ntoskrnl.exe. По умолчанию !chkimg не проверяет определенные части этих файлов.

-noplock
Отображает области, которые не совпадают с значением байтов 0x90 ( инструкция nop ) и значением байтов 0xF0 ( инструкция блокировки ). По умолчанию эти несоответствия не отображаются.

-нп
Вызывает распознавание исправленных инструкций.

-d
Отображает сводку всех несовпаденных областей во время сканирования. Дополнительные сведения об этом сводном тексте см. в разделе "Примечания".

-дБ
Отображает несогласованные области в формате, аналогичном команде отладчика базы данных. Таким образом, каждая строка отображения показывает адрес первого байта в строке, за которым следует до 16 шестнадцатеричных байтовых значений. За значениями байтов сразу же следует соответствующие значения ASCII. Все непечатываемые символы, такие как возвраты каретки и каналы строк, отображаются в виде периодов (.). Несовпадение байтов помечается звездочкой (*).

-lo **** lines
Ограничивает количество выходных строк, отображаемых в строке -d или -db .

-v
Отображает подробные сведения.

-mmw
Создает файл журнала и записывает действие !chkimg в этом файле. Каждая строка файла журнала представляет собой одно несоответствие.

LogFile
Указывает полный путь к файлу журнала. Если указать относительный путь, путь относительно текущего пути.

LogOptions
Указывает содержимое файла журнала. LogOptions — это строка, состоящая из объединения различных букв. Каждая строка в файле журнала содержит несколько столбцов, разделенных запятыми. Эти столбцы включают элементы, которые указывают следующие буквы параметров, в том порядке, в котором буквы отображаются в строке LogOptions . Можно включить следующие параметры несколько раз. Необходимо включить хотя бы один вариант.

Параметр журнала Сведения, включенные в файл журнала

v

Виртуальный адрес несоответствия

r

Смещение (относительный адрес) несоответствия в модуле

s

Символ, соответствующий адресу несоответствия

S

Имя раздела, содержащего несоответствие

e

Правильное значение, ожидаемое в расположении несоответствия

w

Неправильное значение, которое было в расположении несоответствия

LogOptions также может включать некоторые или нет следующих дополнительных параметров.

Параметр журнала Действие

o

Если файл с именем LogFile уже существует, существующий файл перезаписывается. По умолчанию отладчик добавляет новые сведения в конец любого существующего файла.

tString

Добавляет дополнительный столбец в файл журнала. Каждая запись в этом столбце содержит строку. Параметр tString полезен, если вы добавляете новые сведения в существующий файл журнала и должны отличать новые записи от старых. Нельзя добавить пробел между t и String. Если вы используете параметр t I String, он должен быть окончательным параметром в LogOptions, так как Строка принимается для включения всех символов, присутствующих перед следующим пробелом.

Например, если LogOptions является rSewo, каждая строка файла журнала содержит относительный адрес и имя раздела расположения несоответствия и ожидаемые и фактические значения в этом расположении. Этот параметр также приводит к перезаписи любого предыдущего файла. Параметр -mmw можно использовать несколько раз, если требуется создать несколько файлов журнала, имеющих разные параметры. Одновременно можно создавать до 10 файлов журналов.

Модуль
Указывает модуль для проверки. Модуль может быть именем модуля, начальным адресом модуля или любым адресом, содержащимся в модуле. Если вы опустите модуль, отладчик использует модуль, содержащий текущий указатель инструкции.

DLL-библиотеки

Windows XP и более поздние версии

Ext.dll

Замечания

При использовании !chkimg он сравнивает изображение исполняемого файла в памяти с копией файла, который находится в хранилище символов.

Все разделы файла сравниваются, за исключением разделов, которые могут быть удалены, которые могут быть записаны, которые не являются исполняемыми, которые имеют "PAGE" в их имени или которые находятся из INITKDBG. Это поведение можно изменить с помощью коммутаторов -ss, as или -r .

!chkimg отображает несоответствие между изображением и файлом в виде ошибки изображения со следующими исключениями:

  • Адреса, занятые таблицей адресов импорта (IAT), не проверяются.

  • Некоторые конкретные адреса в Hal.dll и Ntoskrnl.exe не проверяются, так как некоторые изменения происходят при загрузке этих разделов. Чтобы проверить эти адреса, включите параметр -nospec .

  • Если значение байта 0x90 присутствует в файле, и если значение 0xF0 присутствует в соответствующем байте изображения (или наоборот), эта ситуация считается совпадением. Как правило, сервер символов содержит одну версию двоичного файла, который существует как в однопроцессорных, так и в многопроцессорных версиях. На процессоре на основе x86 инструкция блокировки 0xF0, и эта инструкция соответствует инструкции nop (0x90) в версии юнипроцессора. Если вы хотите, чтобы !chkimg отображала эту пару как несоответствие, задайте параметр -noplock.

Примечание. Если вы используете параметр -f для исправления несоответствий изображений, !chkimg исправляет только те несоответствия, которые считаются ошибками. Например, !chkimg не изменяет 0x90 байт на 0xF0 байт, если вы не включаете -noplock.

Если включить параметр -d , !chkimg отображает сводку всех несовпаденных областей во время сканирования. Каждое несоответствие отображается на двух строках. Первая строка включает начало диапазона, конец диапазона, размер диапазона, имя символа и смещение, соответствующее началу диапазона, а также число байтов после последней ошибки (в скобках). Вторая строка заключена в квадратные скобки и включает шестнадцатеричные значения байтов, ожидаемые двоеточие, а затем шестнадцатеричные значения байтов, которые были на самом деле обнаружены в изображении. Если диапазон длиннее 8 байт, отображаются только первые 8 байт до двоеточия и после двоеточия. В следующем примере показана эта ситуация.

be000015-be000016  2 bytes - win32k!VeryUsefulFunction+15 (0x8)
     [ 85 dd:95 23 ]

Иногда драйвер изменяет часть ядра Microsoft Windows с помощью перехватчиков, перенаправления или других методов. Даже драйвер, который больше не находится в стеке, может изменить часть ядра. Расширение !chkimg можно использовать в качестве средства сравнения файлов, чтобы определить, какие части ядра Windows (или любой другой образ) изменяются драйверами и точно как изменяются части. Это сравнение наиболее эффективно для файлов полного дампа.

Проверка каждого загруженного модуля

Вы также можете использовать !chkimg вместе с расширением !for_each_module для проверки образа каждого загруженного модуля. В следующем примере показана эта ситуация.

!for_each_module !chkimg @#ModuleName 

Пример !анализа

Предположим, что вы столкнулись с проверкой ошибок, например, и начинаете с помощью !анализа.

kd> !analyze 
....
BugCheck 1000008E, {c0000005, bf920e48, baf75b38, 0}
Probably caused by : memory_corruption
CHKIMG_EXTENSION: !chkimg !win32k
....

В этом примере выходные данные !analyze показывают, что произошла повреждение памяти и включает строку CHKIMG_EXTENSION, которая предполагает, что Win32k.sys может быть поврежденным модулем. (Даже если эта строка отсутствует, возможно, вы можете рассмотреть возможные повреждения в модуле поверх стека.) Начните с использования !chkimg без каких-либо коммутаторов, как показано в следующем примере.

kd> !chkimg win32k
Number of different bytes for win32k: 31

В следующем примере показано, что на самом деле повреждена память. Используйте !chkimg -d для отображения всех ошибок модуля Win32k.

kd> !chkimg win32k -d
    bf920e40-bf920e46  7 bytes - win32k!HFDBASIS32::vSteadyState+1f
        [ 78 08 d3 78 0c c2 04:00 00 00 00 00 01 00 ]
    bf920e48-bf920e5f  24 bytes - win32k!HFDBASIS32::vHalveStepSize (+0x08)
        [ 8b 51 0c 8b 41 08 56 8b:00 00 00 00 00 00 00 00 ]
Number of different bytes for win32k: 31

При попытке диассемблировать поврежденный образ второго раздела, который указан, может произойти следующее выходные данные.

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 0000             add     [eax],al
bf920e4a 0000             add     [eax],al
bf920e4c 0000             add     [eax],al
bf920e4e 0000             add     [eax],al
bf920e50 7808            js win32k!HFDBASIS32::vHalveStepSize+0x12 (bf920e5a)
bf920e52 d3780c           sar     dword ptr [eax+0xc],cl
bf920e55 c20400           ret     0x4
bf920e58 8b510c           mov     edx,[ecx+0xc]

Затем используйте !chkimg -f для устранения повреждения памяти.

kd> !chkimg win32k -f
Warning: Any detected errors will be fixed to what we expect!
Number of different bytes for win32k: 31 (fixed)

Теперь вы можете дизассемблировать исправленное представление и просмотреть внесенные изменения.

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 8b510c           mov     edx,[ecx+0xc]
bf920e4b 8b4108           mov     eax,[ecx+0x8]
bf920e4e 56               push    esi
bf920e4f 8b7104           mov     esi,[ecx+0x4]
bf920e52 03c2             add     eax,edx
bf920e54 c1f803           sar     eax,0x3
bf920e57 2bf0             sub     esi,eax
bf920e59 d1fe             sar     esi,1

Исследование повреждения хранилища и памяти

Случайное повреждение файлов и памяти может быть трудно изучить. Одним из средств, которые следует рассмотреть в некоторых ситуациях, является включение дополнительной проверки памяти, например с помощью средства проверки драйверов. Дополнительные сведения о средство проверки драйверов см. в разделе "Средство проверки драйверов".

Для тестирования физической памяти используйте средство диагностики памяти Windows. Он используется и другие общие методы описаны в разделе "Данные синего экрана".

Используйте служебную программу сканирования диска для выявления ошибок файловой системы. Выберите и удерживайте (или щелкните правой кнопкой мыши) на диске, который требуется проверить и выбрать свойства. Выберите Инструменты. Нажмите кнопку "Проверить сейчас ".