Frage

Hintergrund-Informationen

Für die Rettung aus crash-dumps, ich habe ein Skript übergeben cdb.exe in der Debugger Wert der AeDebug registry-Schlüssel:

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"

Hier ist der erste Teil des Skripts:

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

* (...)

Das Problem

Mit Symbolen, das funktioniert genau so, wie ich möchte, bekomme ich die log-Dateien mit sinnvollen Namen wie:

  • LHCBDRDT.exe_process_147c_2009-01-06_23-10-05-371.log

Jedoch, wenn die Symbole nicht verfügbar sind, bekomme ich eine log-Datei-Namen wie diese:

  • ${CrashFirstModule}_process_17a8_2009-01-06_23-10-01-124.log

Dies ist, weil der alias-Befehl fehlgeschlagen ist, um den alias.Der alias-Befehl ist eine, die ich geerntet DumpAnalysis.org.Dieser Befehl zieht den Namen aus der PEB-Header für das Bild, mit ntdll.dll.Ohne Symbole für das Betriebssystem, die es nicht wissen, wo Sie die Funktion aufrufen von ntdll.dll.

Die Frage

Weiß jemand, oder einen Befehl, um den Namen des Bildes als alias für die Verwendung in Dateinamen, die noch funktionierten, in diesen Situationen?

War es hilfreich?

Lösung

Also hier bin ich Jahre später mit einer Antwort.

Die Antwort

In der Abwesenheit von Symboldateien, dies ist der beste Weg, den ich gefunden habe, um den Namen der ausführbaren Datei abgestürzt ist, so dass es kann verwendet werden in einem Dateinamen für das schreiben einer log-Datei oder crash-dump von einem Skript aus:

aS ${/v:CrashFirstModule} "UnknownModule"
.foreach /pS b /ps b (name {.imgscan}) { .if($spat("${name}","*.exe") !=0){aS ${/v:CrashFirstModule} "${name}"; .break} }

Nach diesen zwei Linien, CrashFirstModule wird ein Aliasing auf "UnknownModule" oder der name der ausführbaren Datei.Dies funktioniert nur, wenn die ausführbare Datei endet auf ".exe", aber das scheint mir vernünftig, und funktioniert gut in dem Fall, wo ich bin, es zu verwenden.Man könnte hinzufügen, ein anderes .if Griff andere Ende, wenn Sie benötigen, um Unterstützung mit Dingen wie ".com".

Die Antwort:Erklärt

.imgscan

.imgscan gibt eine Liste von ausführbaren Modulen, die umfassen wird .exe, .dll, .drv etc.Dies ist der Ausgangspunkt für die Suche nach den Namen der ausführbaren Datei.

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

.foreach wird verwendet, um zu Fuss die Liste der Bilder. /pS legt fest, wie weit Sie in der Liste den ersten Wert ist. /ps legt den Abstand zwischen den Werten.(b = 11 hex) Dies ist notwendig, da .foreach separate Räume auf.Mit diesen Argumenten wird die Liste:

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

$spuckte

$spat ist die MASM-wildcard-string-match-Funktion.Es wird mit dem ersten argument gegen die Muster, die im zweiten argument.Es ist nicht case sensitive, so wird diese match NOTEPAD.EXE sowie NotePad.eXe etc.

.if($spat("${name}","*.exe") !=0) {.echo "found it!"}

${}

${} ist der alias-interpreter.Sie einzubetten ${<alias name>} wo immer Sie wollen den Wert Ihrer alias written in a string.wenn Sie mithilfe des alias in einem Befehl, Sie können es einfach verwenden, also .echo CrashFirstmodule würde echo aus notepad.exe.In jenen Fällen, wo man tatsächlich bedeutet der name des alias, Sie können geben Sie es als ${/v:<alias name>} die einfach zu beheben, um den alias-Namen.Diese Erweiterung Prävention ist notwendig, wenn eine Neuzuweisung eines Pseudonyms gestattet. aS CrashFirstModule "${name}" geführt hätte Einstellung der alias - UnknownModule zu notepad.exe, als CrashFirstModule hätte erweitert werden, um seinen Wert, bevor der Befehl ausgeführt wurde.

als

aS wird einer der Befehle zum zuweisen von Aliasnamen. aS gekündigt wird ;oder das Ende der Zeile und ziehen die " aus dem Eintrag.Die folgende Zeile den alias CrashFirstModule zu UnknownModule:

aS ${/v:CrashFirstModule} "UnknownModule"

.Pause

.break endet die .foreach nachdem eine übereinstimmung gefunden wurde.

Ende

Das ist alles, die Stücke, aus denen sich der Befehl, den ich verwende.Ich hoffe, jemand anderes bekommt einige profitieren von dieser Frage und Antwort!

Andere Tipps

warum nicht peb info?Unten ist das, was Sie benötigen:

?? @$peb->ProcessParameters

ntdll.dll wird in jedem Prozess, so dass ich vermute, das problem ist das symbol laden.

Trotzdem sollte diese Arbeit, um loszuwerden, die Linie zu brechen:

.foreach(Module {lm 1m}) { aS CrashApp Module; .break }

.foreach(Module {lm 1m a $exentry}) { aS CrashApp Module }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top