如何最好的别名一个可执行的名称在一个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.这个命令拉的名字的多头的图像,使用 ntdll.dll
.没有符号,它不知道在哪里可以找到的功能,它是打电话ntdll.dll.
这个问题
没有人知道或有命令,以获得图像的名称作为别名使用名称,这仍将工作在这些情况?
解决方案
所以我在这里几年后一个答案。
答案
在没有符号文件,这是最好的办法,我发现,获得姓名的可执行的坠毁,以便它可以用在一个文件编写记录文件或崩溃转储从脚本:
aS ${/v:CrashFirstModule} "UnknownModule"
.foreach /pS b /ps b (name {.imgscan}) { .if($spat("${name}","*.exe") !=0){aS ${/v:CrashFirstModule} "${name}"; .break} }
之后这两条线, CrashFirstModule
将别名为"UnknownModule"或名称的可执行的。这只是工作,如果可执行的结束"。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
.foreach
是用来走路的图像的列表。 /pS
指定到该列表的第一个价值。 /ps
指定之间的距离的价值观。(b=11hex),这是必要的,因为 .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
是的MASM配符串匹配的功能。它会比赛的第一个参数对该模式的第二个论点。它不是情况的敏感,因此这将匹配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->ProcessParameters
ntdll.dll
将存在于每一个进程,因此我猜测的问题是符号的装载。
无论如何,这应当努力摆脱线的中断:
.foreach(Module {lm 1m}) { aS CrashApp Module; .break }
.foreach(Module {lm 1m a $exentry}) { aS CrashApp Module }