WINDBG 충돌 스크립트에서 실행 파일 이름을 별칭하는 가장 좋은 방법은 무엇입니까?
-
05-07-2019 - |
문제
배경 정보
충돌 덤프를 저장하기 위해 스크립트가 전달되었습니다. cdb.exe
에서 Debugger
의 가치 AeDebug
레지스트리 키 :
C:\progra~1\debugg~1\cdb.exe -p %ld -e %ld -g -y SRV*c:\mss*http://msdl.microsoft.com/download/symbols -c "$<d:\tgticker\Dumps\RDFD.cdbscript"
다음은 스크립트의 첫 번째 부분입니다.
as /c CrashFirstModule .printf "%mu", @@c++((*(ntdll!_LDR_DATA_TABLE_ENTRY**)&@$peb->Ldr->InLoadOrderModuleList.Flink)->BaseDllName.Buffer)
.logopen /t d:\tgticker\dumps\${CrashFirstModule}_process.log
* (...)
문제
기호를 사용하면 원하는대로 정확하게 작동하며 다음과 같은 현명한 이름의 로그 파일을 얻습니다.
LHCBDRDT.exe_process_147c_2009-01-06_23-10-05-371.log
그러나 기호를 사용할 수없는 경우 다음과 같은 로그 파일 이름을 얻습니다.
${CrashFirstModule}_process_17a8_2009-01-06_23-10-01-124.log
별명 명령이 별칭을 설정하지 못했기 때문입니다. 별칭 명령은 내가 수확 한 명령입니다 dumpanalysis.org. 이 명령은 이미지의 PEB 헤더에서 이름을 꺼냅니다. ntdll.dll
. OS의 기호가 없으면 ntdll.dll에서 호출하는 함수를 어디서 찾을 수 있는지 모릅니다.
질문
이 상황에서 여전히 작동하는 파일 이름에서 사용하기위한 별칭으로 이미지 이름을 알리기 위해 알고 있거나 명령이 있습니까?
해결책
그래서 나는 몇 년 후에 답을 가지고 있습니다.
대답
기호 파일이없는 경우, 이것은 스크립트에서 로그 파일 또는 충돌 덤프를 작성하는 데 파일 이름에 사용될 수 있도록 충돌 한 실행 파일의 이름을 얻는 가장 좋은 방법입니다.
aS ${/v:CrashFirstModule} "UnknownModule"
.foreach /pS b /ps b (name {.imgscan}) { .if($spat("${name}","*.exe") !=0){aS ${/v:CrashFirstModule} "${name}"; .break} }
이 두 줄 뒤에 CrashFirstModule
"알 수없는 모듈"또는 실행 파일의 이름과 별명이됩니다. 이것은 실행 파일이 ".exe"로 끝나는 경우에만 작동하지만, 그것은 나에게 합리적으로 보이며, 내가 그것을 사용하는 경우에 잘 작동합니다. 당신은 다른 것을 추가 할 수 있습니다 .if
".com"과 같은 것들을 지원 해야하는 경우 다른 결말을 처리합니다.
답 : 설명
.imgscan
.imgscan
.exe, .dll, .drv 등이 포함 된 실행 가능한 모듈 목록을 제공합니다. 이는 실행 가능 이름을 찾기위한 시작점입니다.
0:000> .imgscan
MZ at 01000000, prot 00000002, type 01000000 - size 14000
Name: notepad.exe
MZ at 73070000, prot 00000002, type 01000000 - size 27000
Name: WINSPOOL.DRV
MZ at 762b0000, prot 00000002, type 01000000 - size 49000
Name: comdlg32.dll
MZ at 76f50000, prot 00000002, type 01000000 - size 13000
Name: Secur32.dll
MZ at 77380000, prot 00000002, type 01000000 - size 91000
Name: USER32.dll
MZ at 77420000, prot 00000002, type 01000000 - size 103000
Name: COMCTL32.dll
MZ at 77ba0000, prot 00000002, type 01000000 - size 5a000
Name: msvcrt.dll
MZ at 77c00000, prot 00000002, type 01000000 - size 48000
Name: GDI32.dll
MZ at 77c50000, prot 00000002, type 01000000 - size a0000
Name: RPCRT4.dll
MZ at 77e40000, prot 00000002, type 01000000 - size 102000
Name: KERNEL32.dll
MZ at 7c800000, prot 00000002, type 01000000 - size c3000
Name: ntdll.dll
MZ at 7c8d0000, prot 00000002, type 01000000 - size 7ff000
Name: SHELL32.dll
MZ at 7d180000, prot 00000002, type 01000000 - size 52000
Name: SHLWAPI.dll
MZ at 7d1e0000, prot 00000002, type 01000000 - size 9c000
Name: ADVAPI32.dll
.각각
.foreach
이미지 목록을 걷는 데 사용됩니다. /pS
첫 번째 값이 목록에 얼마나 멀리 떨어져 있는지 지정합니다. /ps
값 사이의 거리를 지정합니다. (B = 16 진)) 이것은 다음과 같이 필요합니다. .foreach
공간에서 분리됩니다. 이러한 주장을 통해 목록은 다음과 같습니다.
0:000> .foreach /pS b /ps b (name {.imgscan}) { .echo name }
notepad.exe
WINSPOOL.DRV
comdlg32.dll
Secur32.dll
USER32.dll
COMCTL32.dll
msvcrt.dll
GDI32.dll
RPCRT4.dll
KERNEL32.dll
ntdll.dll
SHELL32.dll
SHLWAPI.dll
ADVAPI32.dll
$ SPAT
$spat
Masm Wildcard String Match 함수입니다. 그것은 두 번째 인수에서 패턴에 대한 첫 번째 인수와 일치 할 것이다. 그것은 대소 문자로 민감하지 않으므로 Notepad.exe 등에 대한 Notepad.exe와 일치합니다.
.if($spat("${name}","*.exe") !=0) {.echo "found it!"}
${}
${}
별칭 통역사입니다. 당신은 포함됩니다 ${<alias name>}
문자열로 별명의 값을 원하는 곳에. 명령에 별명을 사용하는 경우 사용할 수 있습니다. .echo CrashFirstmodule
반향 할 것입니다 notepad.exe
. 실제로 별명의 이름을 의미하는 경우에, 당신은 그것을 다음과 같이 지정할 수 있습니다 ${/v:<alias name>}
별칭 이름으로 해결됩니다. 이 확장 방지는 별칭을 재 할 때 필요합니다. aS CrashFirstModule "${name}"
별명을 설정했을 것입니다 UnknownModule
에게 notepad.exe
, 처럼 CrashFirstModule
명령이 실행되기 전에 그 가치로 확장되었을 것입니다.
처럼
aS
별칭을 할당하는 명령 중 하나입니다. aS
종료됩니다. 또는 라인의 끝과 "항목에서"스트라이프를 제거합니다. 다음 줄은 별명입니다. CrashFirstModule
에게 UnknownModule
:
aS ${/v:CrashFirstModule} "UnknownModule"
.부서지다
.break
끝납니다 .foreach
경기가 발견 된 후.
끝
그것이 내가 사용하는 명령을 구성하는 모든 조각입니다. 다른 사람 이이 질문과 답변으로부터 혜택을 받기를 바랍니다!
다른 팁
PEB 정보를 사용하지 않는 이유는 무엇입니까? 아래는 필요한 것입니다.
?? @$peb->ProcessParameters
ntdll.dll
모든 프로세스에 존재하므로 문제가 기호로드라고 생각합니다.
어쨌든, 이것은 라인 브레이크를 제거하기 위해 작동해야합니다.
.foreach(Module {lm 1m}) { aS CrashApp Module; .break }
.foreach(Module {lm 1m a $exentry}) { aS CrashApp Module }