【发布时间】:2018-09-05 13:10:07
【问题描述】:
我经常需要以相同的方式调查转储文件,并且我希望将其自动化。我正在使用 Windbg 作为工具,并且正在考虑使用 Windbg 脚本。
我已经对 PYKD 进行了一些初步尝试,但我不太喜欢开销,所以我选择了标准的 Windbg 脚本,但这会变成一场噩梦,让我告诉你我想要什么做:
0:001> kb
# RetAddr : Args to Child : Call Site
00 00007ffc`26272685 : ffffffff`fffffffe 00007ff7`06e563f0 00007ff7`00000000 0000005a`1fb6fd70 : user32!NtUserGetMessage+0xa
01 00007ff7`06d87596 : 00000000`00000008 00007ff7`06e5d048 00000000`00007c1c 0000005a`00000004 : user32!GetMessageW+0x25
02 00007ff7`06d87673 : 0000005a`1f2b3710 00007ff7`06e5c7d0 0000005a`1f2ac270 00000000`00000002 : <Application>!CServiceModule::Run+0x8ee [sourcefile.cpp @ 1905]
03 00007ffc`26875ada : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : <Application>!CServiceModule::ServiceMain+0x63 [sourcefile.cpp @ 1379]
04 00007ffc`26ef13d2 : 00007ffc`26875aa0 0000005a`1f2ac270 00000000`00000000 00000000`00000000 : sechost!ScSvcctrlThreadA+0x3a
05 00007ffc`270454f4 : 00007ffc`26ef13b0 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0x22
06 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x34
0:001> dx Debugger.Sessions[0].Processes[26520].Threads[14812].Stack.Frames[2].SwitchTo();dv /t /v
// The second command "dx ..." happens by clicking on the DML link of the line, corresponding with the line, containing "CServiceModule::Run".
现在,如何在 Windbg 脚本中执行此操作?
- 启动
kb命令并将结果放入变量中。 (怎么做?我已经尝试过使用as和aS,但似乎都不起作用) -
如果我无法将整个
kb结果转化为一个变量,请尝试使用.foreach,如下例所示:.foreach ( token { kb} ) { .printf "TEST\n" }=> 即使这样也不起作用:
kb有大约 8 行结果,而单词TEST打印了 78 次。 不要打印单词“TEST”,而是打印变量
token并查看它的样子。
=> 怎么做?我已经尝试过.printf "%msu \n" , ${token}或@$token,...但没有任何效果。即使我得到这个工作:我怎样才能进行字符串操作,十进制/十六进制数字转换,...?
不要忘记:如何编译这样的脚本?我目前正在尝试在 Windbg 中运行脚本,有时会出现编译错误,但那些非常不可读(我添加了一个新行,导致出现问题,但并发症错误(不是拼写错误)甚至没有提到新添加的行)。
您可能会说:看看this URL 下提到的示例,但我找不到一个正在运行的标准 Windbg 命令示例,并将其结果存储在一个变量中(即我需要做的第一件事)。
如果我的脚本正常工作,我可能会将这篇文章变成一般的“Windbg 脚本常见问题解答”,以解决上述(和新添加的)问题。
第一次回答后编辑
我意识到我误用了kb 命令:我需要使用的实际命令是~* k,结果如下:
(小注:我只是截图,而不是文字副本,为了强调DML超链接)
如您所见,有一些DML结果,我想“点击”一下,包含CServiceModule::Run。当我手动执行此操作时,似乎有对以下命令的翻译:
dx Debugger.Sessions[0].Processes[26520].Threads[14812].Stack.Frames[2].SwitchTo()
这里的 26520 是 6798 的 HexToDec 转换,
而14812是39DC的HexToDec转换。
(均取自截图Id: 6798.39dc)
所以我“需要”字符串操作和 HexToDec 转换来模拟 DML 点击。但是,如果您知道将这个“点击”操作放入脚本的更简单方法,我将非常感谢!
【问题讨论】:
标签: debugging scripting windbg dump