Bagikan melalui


!chkimg

Ekstensi !chkimg mendeteksi kerusakan dalam gambar file yang dapat dieksekusi dengan membandingkannya dengan salinan di penyimpanan simbol atau repositori file lainnya.

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

Parameter

Opsi Kombinasi apa pun dari opsi berikut:

-p **** SearchPath
Secara rekursif mencari SearchPath untuk file sebelum mengakses server simbol.

-f
Memperbaiki kesalahan dalam gambar. Setiap kali pemindaian mendeteksi perbedaan antara file pada penyimpanan simbol dan gambar dalam memori, konten file di penyimpanan simbol disalin di atas gambar. Jika Anda melakukan penelusuran kesalahan langsung, Anda dapat membuat file cadangan sebelum menjalankan ekstensi !chkimg -f .

-Nar
Mencegah gambar file yang dipetakan pada server simbol dipindahkan. Secara default, ketika salinan file terletak di server simbol dan dipetakan ke dalam memori, !chkimg memindahkan gambar file di server simbol. Namun, jika Anda menggunakan opsi -nar , gambar file dari server tidak dipindahkan.

Gambar yang dapat dieksekusi yang sudah ada dalam memori (yaitu, gambar yang sedang dipindai) dipindahkan, karena debugger selalu merelokasi gambar yang dimuatnya.

Sakelar ini hanya berguna jika sistem operasi sudah memindahkan gambar asli. Jika gambar belum dipindahkan, !chkimg dan debugger akan memindahkan gambar. Penggunaan sakelar ini jarang terjadi.

-ss **** SectionName
Membatasi pemindaian ke bagian yang namanya berisi string SectionName. Pemindaian akan mencakup bagian yang tidak dapat dibuang yang namanya berisi string ini. SectionName peka huruf besar/kecil dan tidak boleh melebihi 8 karakter.

-sebagai
Menyebabkan pemindaian menyertakan semua bagian gambar kecuali bagian yang dapat dibuang. Secara default, (jika Anda tidak menggunakan -as atau -ss), bagian pemindaian melewati bagian yang dapat ditulis, bagian yang tidak dapat dieksekusi, bagian yang memiliki "PAGE" dalam namanya, dan bagian yang dapat dibuang.

-r **** StartAddress **** EndAddress
Membatasi pemindaian ke rentang memori yang dimulai dengan StartAddress dan diakhir dengan EndAddress. Dalam rentang ini, bagian apa pun yang biasanya akan dipindai dipindai. Jika bagian sebagian tumpang tindih dengan rentang ini, hanya bagian yang tumpang tindih dengan rentang ini yang dipindai. Pemindaian terbatas pada rentang ini bahkan jika Anda juga menggunakan sakelar -as atau -ss .

-nospec
Menyebabkan pemindaian menyertakan bagian Hal.dll dan Ntoskrnl.exe yang dipesan. Secara default, !chkimg tidak memeriksa bagian tertentu dari file-file ini.

-noplock
Menampilkan area yang tidak cocok dengan memiliki nilai byte 0x90 ( instruksi nop ) dan nilai byte 0xF0 ( instruksi kunci ). Secara default, ketidakcocokan ini tidak ditampilkan.

-Np
Menyebabkan instruksi yang di-patch dikenali.

-d
Menampilkan ringkasan semua area yang tidak cocok saat pemindaian sedang terjadi. Untuk informasi selengkapnya tentang teks ringkasan ini, lihat bagian Keterangan.

-Db
Menampilkan area yang tidak cocok dalam format yang mirip dengan perintah db debugger. Oleh karena itu, setiap baris tampilan menunjukkan alamat byte pertama dalam baris, diikuti oleh hingga 16 nilai byte heksadesimal. Nilai byte segera diikuti oleh nilai ASCII yang sesuai. Semua karakter yang tidak dapat dicetak, seperti pengembalian gerbong dan umpan baris, ditampilkan sebagai titik (.). Byte yang tidak cocok ditandai dengan tanda bintang (*).

-lo **** baris
Membatasi jumlah baris output yang ditampilkan -d atau -db ke jumlah baris baris.

-v
Menampilkan informasi verbose.

-mmw
Membuat file log dan merekam aktivitas !chkimg dalam file ini. Setiap baris file log mewakili satu ketidakcocokan.

LogFile
Menentukan jalur lengkap file log. Jika Anda menentukan jalur relatif, jalur relatif terhadap jalur saat ini.

LogOptions
Menentukan isi file log. LogOptions adalah string yang terdiri dari perangkaian berbagai huruf. Setiap baris dalam file log berisi beberapa kolom yang dipisahkan oleh koma. Kolom ini mencakup item yang ditentukan huruf opsi berikut, dalam urutan huruf muncul dalam string LogOptions . Anda dapat menyertakan opsi berikut beberapa kali. Anda harus menyertakan setidaknya satu opsi.

Opsi log Informasi yang disertakan dalam file log

v

Alamat virtual ketidakcocokan

r

Offset (alamat relatif) dari ketidakcocokan dalam modul

s

Simbol yang sesuai dengan alamat ketidakcocokan

S

Nama bagian yang berisi ketidakcocokan

e

Nilai yang benar yang diharapkan di lokasi yang tidak cocok

w

Nilai yang salah yang berada di lokasi yang tidak cocok

LogOptions juga dapat mencakup beberapa, atau tidak ada, dari opsi tambahan berikut.

Opsi log Efek

o

Jika file yang memiliki nama LogFile sudah ada, file yang ada akan ditimpa. Secara default, debugger menambahkan informasi baru ke akhir file yang ada.

tString

Menambahkan kolom tambahan ke file log. Setiap entri dalam kolom ini berisi String. Opsi tString berguna jika Anda menambahkan informasi baru ke file log yang ada dan Anda harus membedakan rekaman baru dari yang lama. Anda tidak dapat menambahkan spasi antara t dan String. Jika Anda menggunakan opsi TIString , itu harus menjadi opsi akhir di LogOptions, karena String diambil untuk menyertakan semua karakter yang ada sebelum spasi berikutnya.

Misalnya, jika LogOptions adalah rSewo, setiap baris file log berisi alamat relatif dan nama bagian lokasi yang tidak cocok dan nilai yang diharapkan dan aktual di lokasi tersebut. Opsi ini juga menyebabkan file sebelumnya ditimpa. Anda dapat menggunakan sakelar -mmw beberapa kali jika Anda ingin membuat beberapa file log yang memiliki opsi berbeda. Anda dapat membuat hingga 10 file log secara bersamaan.

Modul
Menentukan modul yang akan diperiksa. Modul dapat menjadi nama modul, alamat awal modul, atau alamat apa pun yang terkandung dalam modul. Jika Anda menghilangkan Modul, debugger menggunakan modul yang berisi penunjuk instruksi saat ini.

DLL

Windows XP dan yang lebih baru

Ext.dll

Keterangan

Ketika Anda menggunakan !chkimg, ini membandingkan gambar file yang dapat dieksekusi dalam memori dengan salinan file yang berada di penyimpanan simbol.

Semua bagian file dibandingkan, kecuali untuk bagian yang dapat dibuang, yang dapat ditulis, yang tidak dapat dieksekusi, yang memiliki "HALAMAN" atas namanya, atau yang berasal dari INITKDBG. Anda dapat mengubah perilaku ini dapat dengan menggunakan sakelar -ss, -as, atau -r .

!chkimg menampilkan ketidakcocokan antara gambar dan file sebagai kesalahan gambar, dengan pengecualian berikut:

  • Alamat yang ditempati oleh Tabel Alamat Impor (IAT) tidak dicentang.

  • Alamat tertentu tertentu dalam Hal.dll dan Ntoskrnl.exe tidak diperiksa, karena perubahan tertentu terjadi ketika bagian ini dimuat. Untuk memeriksa alamat ini, sertakan opsi -nospec .

  • Jika nilai byte 0x90 ada dalam file, dan jika nilai 0xF0 ada dalam byte gambar yang sesuai (atau sebaliknya), situasi ini dianggap cocok. Biasanya, server simbol menyimpan satu versi biner yang ada di versi uniprocessor dan multiprocessor. Pada prosesor berbasis x86, instruksi kunci 0xF0, dan instruksi ini sesuai dengan instruksi nop (0x90) dalam versi uniprocessor. Jika Anda ingin !chkimg menampilkan pasangan ini sebagai ketidakcocokan, atur opsi -noplock .

Catatan Jika Anda menggunakan opsi -f untuk memperbaiki ketidakcocokan gambar, !chkimg hanya memperbaiki ketidakcocokan yang dianggap sebagai kesalahan. Misalnya, !chkimg tidak mengubah byte 0x90 menjadi byte 0xF0 kecuali Anda menyertakan -noplock.

Ketika Anda menyertakan opsi -d , !chkimg menampilkan ringkasan semua area yang tidak cocok saat pemindaian terjadi. Setiap ketidakcocokan ditampilkan pada dua baris. Baris pertama mencakup awal rentang, akhir rentang, ukuran rentang, nama simbol dan offset yang sesuai dengan awal rentang, dan jumlah byte sejak kesalahan terakhir (dalam tanda kurung). Baris kedua diapit dalam tanda kurung siku dan menyertakan nilai byte heksadesimal yang diharapkan, titik dua, dan kemudian nilai byte heksadesimal yang benar-benar ditemui dalam gambar. Jika rentangnya lebih panjang dari 8 byte, hanya 8 byte pertama yang ditampilkan sebelum titik dua dan setelah titik dua. Contoh berikut menunjukkan situasi ini.

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

Terkadang, driver mengubah bagian dari kernel Microsoft Windows dengan menggunakan kait, pengalihan, atau metode lainnya. Bahkan driver yang tidak lagi ada di tumpukan mungkin telah mengubah bagian kernel. Anda dapat menggunakan ekstensi !chkimg sebagai alat perbandingan file untuk menentukan bagian mana dari kernel Windows (atau gambar lain) yang diubah oleh driver dan persis bagaimana bagian diubah. Perbandingan ini paling efektif pada file cadangan penuh.

Periksa setiap modul yang dimuat

Anda juga dapat menggunakan !chkimg bersama dengan ekstensi !for_each_module untuk memeriksa gambar setiap modul yang dimuat. Contoh berikut menunjukkan situasi ini.

!for_each_module !chkimg @#ModuleName 

!analyze example

Misalkan Anda mengalami pemeriksaan bug, misalnya, dan mulailah dengan menggunakan !analyze.

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

Dalam contoh ini, output !analyze menunjukkan bahwa kerusakan memori telah terjadi dan menyertakan baris CHKIMG_EXTENSION yang menunjukkan bahwa Win32k.sys bisa menjadi modul yang rusak. (Bahkan jika baris ini tidak ada, Anda mungkin mempertimbangkan kemungkinan kerusakan dalam modul di atas tumpukan.) Mulailah dengan menggunakan !chkimg tanpa sakelar apa pun, seperti yang ditunjukkan contoh berikut.

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

Contoh berikut menunjukkan bahwa memang ada kerusakan memori. Gunakan !chkimg -d untuk menampilkan semua kesalahan untuk modul 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

Ketika Anda mencoba membongkar gambar yang rusak dari bagian kedua yang tercantum, output berikut mungkin terjadi.

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]

Kemudian, gunakan !chkimg -f untuk memperbaiki kerusakan memori.

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

Sekarang Anda dapat membongkar tampilan yang dikoreksi dan melihat perubahan yang telah Anda buat.

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

Menyelidiki kerusakan penyimpanan dan memori

Kerusakan file dan memori acak bisa sulit diselidiki. Salah satu alat yang perlu dipertimbangkan dalam beberapa situasi adalah mengaktifkan pemeriksaan memori tambahan, misalnya menggunakan pemverifikasi driver. Untuk informasi tentang Pemverifikasi Driver, lihat Pemverifikasi Driver.

Untuk menguji memori fisik, gunakan alat Windows Memory Diagnostics. Ini digunakan dan teknik umum lainnya dijelaskan dalam Data Layar Biru.

Gunakan utilitas disk pemindaian untuk mengidentifikasi kesalahan sistem file. Pilih dan tahan (atau klik kanan) pada drive yang ingin Anda pindai dan pilih Properti. Pilih Alat. Pilih tombol Periksa sekarang .