Partilhar via


!chkimg

A extensão !chkimg detecta de !chkimg nas imagens de arquivos executáveis, pois as compara com a cópia em um repositório de símbolos ou outro repositório de arquivos.

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

Parâmetros

Options Qualquer combinação das seguintes opções:

-p **** SearchPath
Procura de forma recursiva o arquivo em SearchPath antes de acessar o servidor de símbolos.

-f
Corrige erros na imagem. Sempre que a verificação detecta diferenças entre o arquivo no repositório de símbolos e a imagem na memória, o conteúdo do arquivo no repositório de símbolos é copiado sobre a imagem. Se você estiver executando depuração ao vivo, poderá criar um arquivo de despejo antes de executar a extensão !chkimg -f.

-nar
Impede a movimentação da imagem mapeada do arquivo no servidor de símbolos. Por padrão, quando a cópia do arquivo está localizada no servidor de símbolos e é mapeada na memória, a extensão !chkimg movimenta a imagem do arquivo no servidor de símbolos. Mas, se você usar a opção -nar, a imagem do arquivo do servidor não será movimentada.

A imagem executável que já está na memória (ou seja, a que está sendo verificada) é movimentada porque o depurador sempre reposiciona as imagens carregadas.

Essa opção é útil somente quando o sistema operacional já moveu a imagem original. Caso a imagem não tenha sido movida, !chkimg e o depurador movimentarão a imagem. É raro usar essa opção.

-ss **** SectionName
Limita a verificação às seções cujos nomes contêm a cadeia de caracteres SectionName. A verificação inclui seções não descartáveis cujo nome contém essa cadeira de caracteres. SectionName diferencia maiúsculas de minúsculas e pode ter no máximo 8 caracteres.

-as
Faz com que a verificação inclua todas as seções da imagem, exceto seções descartáveis. Por padrão, (se você não usar -as ou -ss), a verificação ignora seções que são graváveis, seções que não são executáveis, seções que têm "PAGE" no nome e seções descartáveis.

-r **** StartAddress **** EndAddress
Limita a verificação ao intervalo de memória que inicia com StartAddress e termina com EndAddress. Nesse intervalo, verifica-se todas as seções que normalmente seriam verificadas. Se uma seção parcialmente sobrepor esse intervalo, apenas a parte sobreposta será verificada. A verificação é limitada a esse intervalo, mesmo que você também use a opção -as ou -ss.

-nospec
Leva a verificação a incluir as seções reservadas de Hal.dll e Ntoskrnl.exe. Por padrão, !chkimg não verifica partes específicas desses arquivos.

-noplock
Exibe áreas que são inconsistentes por apresentarem um valor de byte de 0x90 (uma instrução nop) e um valor de byte de 0xF0 (uma instrução lock). Por padrão, essas inconsistências não são exibidas.

-np
Leva ao reconhecimento de instruções com patches aplicados.

-d
Exibe um resumo de todas as áreas inconsistentes durante a verificação. Para saber mais sobre este texto de resumo, consulte a seção Comentários.

-db
Exibe áreas inconsistentes em um formato semelhante ao do comando db debugger. Portanto, cada linha de exibição mostra o endereço do primeiro byte na linha, seguido de até 16 valores de bytes hexadecimais. Os valores de byte são logo seguidos dos valores ASCII correspondentes. Todos os caracteres não imprimíveis, como retorno de carro e feeds de linha, são exibidos como pontos (.). Os bytes inconsistentes são marcados por um asterisco (*).

-lo **** lines
Limita o número de linhas de saída exibidas por -d ou -db para o número das linhas.

-v
Exibe informações detalhadas.

-mmw
Cria um arquivo de log e registra a atividade de !chkimg nesse arquivo. Cada linha do arquivo de log representa uma única inconsistência.

Arquivo de log
Especifica o caminho completo do arquivo de log. Se você especificar um caminho relativo, ele será relativo ao caminho atual.

Opções de log
Especifica o conteúdo do arquivo de log. LogOptions é uma cadeia de caracteres que consiste em uma concatenação de várias letras. Cada linha no arquivo de log contém várias colunas separadas por vírgulas. Essas colunas incluem os itens que as letras de opção a seguir especificam, na ordem em que aparecem na cadeia de caracteres LogOptions. Você pode incluir as opções a seguir várias vezes. Você deve incluir pelo menos uma opção.

Opção de log Informações incluídas no arquivo de log

v

O endereço virtual da inconsistência

r

O deslocamento (endereço relativo) da inconsistência no módulo

s

O símbolo que corresponde ao endereço da inconsistência

S

O nome da seção que contém a inconsistência

e

O valor correto que era esperado no local da inconsistência

w

O valor incorreto que estava no local da inconsistência

LogOptions também pode incluir algumas das opções adicionais a seguir, ou nenhuma.

Opção de log Efeito

o

Se já existir um arquivo com o nome LogFile, o arquivo existente será substituído. Por padrão, o depurador acrescenta novas informações ao final de qualquer arquivo existente.

tString

Inclui uma coluna adicional ao arquivo de log. Cada entrada nesta coluna contém String. A opção tString é útil quando você anexa novas informações a um arquivo de log existente e precisa diferenciar os novos registros dos antigos. Não é possível adicionar um espaço entre t e String. Se você usar a opção tIString, ela deverá ser a última opção em LogOptions porque String é usada para incluir todos os caracteres presentes antes do próximo espaço.

Por exemplo, se LogOptions for rSewo, cada linha do arquivo de log conterá o endereço relativo e o nome da seção do local inconsistente, além dos valores esperados e reais nesse local. Essa opção também leva à substituição de arquivos anteriores. Você pode usar a opção -mmw várias vezes para criar múltiplos arquivos de log com opções distintas. Você pode criar até 10 arquivos de log ao mesmo tempo.

Módulo
Especifica o módulo a ser verificado. Module pode ser o nome do módulo, o endereço inicial do módulo, ou qualquer endereço contido no módulo. Se você omitir Module, o depurador usará o módulo contendo o ponteiro de instrução atual.

DLL

Windows XP e posterior

Ext.dll

Comentários

Quando você usa a extensão !chkimg, ela compara a imagem de um arquivo executável na memória com a cópia do arquivo que reside em um repositório de símbolos.

Todas as seções do arquivo são comparadas, exceto as descartáveis, graváveis, não executáveis, com "PAGE" no nome ou que são de INITKDBG. Para alterar esse comportamento, use as opções -ss, -as ou -r.

!chkimg exibe inconsistências entre a imagem e o arquivo como um erro de imagem, com as seguintes exceções:

  • Os endereços ocupados pela IAT (Tabela de Endereços de Importação) não são verificados.

  • Certos endereços específicos em Hal.dll e Ntoskrnl.exe não são verificados porque algumas alterações ocorrem quando essas seções são carregadas. Para verificar esses endereços, inclua a opção -nospec.

  • Se o valor de byte 0x90 estiver presente no arquivo e se o valor 0xF0 estiver presente no byte correspondente da imagem (ou vice-versa), essa situação será considerada uma correspondência. Em geral, o servidor de símbolos contém uma versão de um binário que existe nas versões uniprocessador e multiprocessador. Em um processador baseado em x86, a instrução lock é 0xF0, e essa instrução corresponde a uma instrução nop (0x90) na versão de uniprocessador. Se você desejar que !chkimg exiba esse par como uma inconsistência, defina a opção -noplock.

Observação Se você usar a opção -f para corrigir inconsistências de imagem, !chkimg corrigirá apenas as inconsistências que ela considerar como erro. Por exemplo, !chkimg não altera um byte de 0x90 para um byte de 0xF0, a menos que você inclua -noplock.

Quando você inclui a opção -d, !chkimg exibe um resumo de todas as áreas inconsistentes durante a verificação. Cada inconsistência aparece em duas linhas. A primeira linha inclui o início do intervalo, o final do intervalo, o tamanho do intervalo, o nome do símbolo e o deslocamento que corresponde ao início do intervalo e o número de bytes desde o último erro (entre parênteses). A segunda linha é colocada entre colchetes e inclui os valores de byte hexadecimal esperados, dois-pontos, além dos valores de byte hexadecimal que foram realmente encontrados na imagem. Se o intervalo for superior a 8 bytes, apenas os primeiros 8 bytes aparecerão antes e depois dos dois-pontos. O exemplo a seguir mostra essa situação.

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

Às vezes, um driver altera parte do kernel do Microsoft Windows usando ganchos, redirecionamento ou outros métodos. Mesmo um driver que não está mais na pilha pode alterar parte do kernel. Você pode usar a extensão !chkimg como uma ferramenta de comparação de arquivos para determinar quais partes do kernel do Windows (ou qualquer outra imagem) estão sendo alteradas por drivers e como isso ocorre. Essa comparação é mais eficiente em arquivos de despejo completo.

Verifique cada módulo carregado

Você também pode usar !chkimg com a extensão !for_each_module para verificar a imagem de cada módulo carregado. O exemplo a seguir mostra essa situação.

!for_each_module !chkimg @#ModuleName 

Exemplo de !analyze

Suponha que você encontre uma verificação de bug e comece usando !analyze.

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

Neste exemplo, a saída !analyze sugere que ocorreu uma corrupção de memória e inclui uma linha CHKIMG_EXTENSION sugerindo que Win32k.sys pode ser o módulo corrompido. (Mesmo que essa linha esteja ausente, você poderá considerar possíveis corrupções no módulo na parte superior da pilha.) Comece usando !chkimg sem opção, como mostra o exemplo a seguir.

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

O exemplo a seguir mostra que a memória está de fato corrompida. Use !chkimg -d para exibir todos os erros do módulo 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

Quando você tenta desmontar a imagem corrompida da segunda seção listada, o seguinte resultado pode ser gerado.

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]

Depois, use !chkimg -f para corrigir a memória corrompida.

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

Agora você pode desmontar a exibição corrigida e ver as alterações realizadas.

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

Investigar armazenamento e memória corrompidos

Talvez seja difícil investigar a corrupção de arquivos aleatórios e de memória. Uma ferramenta que pode ser usada em alguns casos é habilitar a verificação de memória adicional, por exemplo, usando o verificador de driver. Para saber mais sobre o verificador de driver, confira Verificador de driver.

Para testar a memória física, use a ferramenta Diagnóstico de Memória do Windows. Seu uso e outras técnicas gerais estão descritos em Dados de tela azul.

Use o utilitário Scan Disk para identificar erros do sistema de arquivos. Mantenha pressionada (ou clique com o botão direito do mouse) a unidade a ser verificada e selecione Propriedades. Selecione Ferramentas. Selecione o botão Verificar agora.