WINDBG 충돌 스크립트에서 실행 파일 이름을 별칭하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/420442

문제

배경 정보

충돌 덤프를 저장하기 위해 스크립트가 전달되었습니다. 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 }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top