!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 바이트 값(잠금 명령)을 사용하여 일치하지 않는 영역을 표시합니다. 기본적으로 이러한 불일치는 표시되지 않습니다.

-np
패치된 명령이 인식되도록 합니다.

-d
검색이 발생하는 동안 일치하지 않는 모든 영역에 대한 요약을 표시합니다. 이 요약 텍스트에 대한 자세한 내용은 설명 섹션을 참조하세요.

-db
db 디버거 명령과 유사한 형식으로 일치하지 않는 영역을 표시합니다. 따라서 각 표시줄은 줄에 있는 첫 번째 바이트의 주소를 표시한 다음 최대 166개의 16진수 바이트 값을 표시합니다. 바이트 값 바로 뒤에 해당 ASCII 값이 잇습니다. 캐리지 리턴 및 줄 바꿈과 같은 인쇄할 수 없는 모든 문자는 마침표(.)로 표시됩니다. 일치하지 않는 바이트는 별표(*)로 표시됩니다.

-lo ****
-d 또는 -db표시하는 출력 줄 수를 줄 수로 제한합니다.

-v
자세한 정보를 표시합니다.

-mmw
로그 파일을 만들고 이 파일에 !chkimg활동을 기록합니다. 로그 파일의 각 줄은 단일 불일치를 나타냅니다.

LogFile
로그 파일의 전체 경로를 지정합니다. 상대 경로를 지정하는 경우 경로는 현재 경로를 기준으로 합니다.

LogOptions
로그 파일의 내용을 지정합니다. LogOptions 는 다양한 문자의 연결로 구성된 문자열입니다. 로그 파일의 각 줄에는 쉼표로 구분된 여러 열이 포함되어 있습니다. 이러한 열에는 다음 옵션 문자가 LogOptions 문자열에 문자가 표시되는 순서대로 지정하는 항목이 포함됩니다 . 다음 옵션을 여러 번 포함할 수 있습니다. 하나 이상의 옵션을 포함해야 합니다.

로그 옵션 로그 파일에 포함된 정보

v

불일치의 가상 주소

r

모듈 내 불일치의 오프셋(상대 주소)

s

불일치의 주소에 해당하는 기호입니다.

S

불일치가 포함된 섹션의 이름입니다.

e

일치하지 않는 위치에서 예상한 올바른 값입니다.

w

일치하지 않는 위치에 있었던 잘못된 값입니다.

LogOptions는 다음 추가 옵션 중 일부 또는 없음을 포함할 수도 있습니다.

로그 옵션 효과

o

이름이 LogFile 인 파일이 이미 있는 경우 기존 파일을 덮어씁니다. 기본적으로 디버거는 기존 파일의 끝에 새 정보를 추가합니다.

t문자열

로그 파일에 추가 열을 추가합니다. 이 열의 각 항목에는 String이 포함됩니다. t문자열 옵션은 기존 로그 파일에 새 정보를 추가하고 새 레코드를 이전 레코드와 구분해야 하는 경우에 유용합니다. t와 String 사이에 공백을 추가할 수 없습니다. t I String 옵션을 사용하는 경우 문자열은 다음 공백 앞에 있는 모든 문자를 포함하도록 설정되므로 LogOptions 의 최종 옵션이어야 합니다.

예를 들어 LogOptionsrSewo인 경우 로그 파일의 각 줄에는 불일치 위치의 상대 주소 및 섹션 이름과 해당 위치의 예상 및 실제 값이 포함됩니다. 또한 이 옵션을 사용하면 이전 파일을 덮어씁니다. 다른 옵션이 있는 여러 로그 파일을 만들려는 경우 -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은 오류로 간주되는 불일치만 수정합니다. 예를 들어 -noplock을 포함하지 않는 한 !chkimg는 0x90 바이트를 0xF0 바이트로 변경하지 않습니다.

-d 옵션을 포함하면 !chkimg은 검색이 발생하는 동안 일치하지 않는 모든 영역의 요약을 표시합니다. 각 불일치는 두 줄에 표시됩니다. 첫 번째 줄에는 범위의 시작, 범위의 끝, 범위의 크기, 범위 시작에 해당하는 기호 이름 및 오프셋, 마지막 오류 이후의 바이트 수(괄호)가 포함됩니다. 두 번째 줄은 대괄호로 묶이고 예상된 16진수 바이트 값, 콜론 및 이미지에서 실제로 발생한 16진수 바이트 값을 포함합니다. 범위가 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 

!analyze 예제

예를 들어 버그 검사가 발생하고 !analyze를 사용하여 시작한다고 가정합니다.

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

이 예제 에서 !analyze 출력은 메모리 손상이 발생했음을 시사하며 Win32k.sys 손상된 모듈일 수 있음을 시사하는 CHKIMG_EXTENSION 줄을 포함합니다. (이 줄이 없더라도 스택 맨 위에 있는 모듈의 손상 가능성을 고려할 수 있습니다.) 다음 예제와 같이 스위치 없이 !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 메모리 진단 도구를 사용합니다. 이 기능은 사용 중이며 다른 일반적인 기술은 Blue Screen Data설명되어 있습니다.

디스크 검사 유틸리티를 사용하여 파일 시스템 오류를 식별합니다. 검색할 드라이브를 선택하고 길게 누르거나 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 도구를 선택합니다. 지금 확인 단추를 선택합니다.