【问题标题】:Does WinDBG support multi-line commands?WinDBG 是否支持多行命令?
【发布时间】:2023-03-21 12:17:01
【问题描述】:

为了可读性,最好能有多行“脚本”(无论 WinDBG 的语法是什么)代码。

例如,我想在一块内存中搜索看起来有点像 wxArrayString 的东西...

r $t1 = 0xe53801c
r $t2 = 0x2e800
.for (r $t3 = 0; @$t3 < 0x400; r $t3 = @$t3 + 1) {
   .if (@@c++(
     ((int)(((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_compareFunction) >= 0x10000) &&
     ((int)(((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_pItems) >= 0x10000) &&
     (((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_nCount <= 5000) &&
     (((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_nCount > 0) &&
     (((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_nSize <= 10000) &&
     (((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))->m_nSize > 0)
   )) {
     dx ((MyModule!wxArrayString*)(@$t1+@$t2+(@$t3*8)))
   }  
}

将其合并到一行中并不太难,但如果我不必每次想测试代码更改时都必须这样做,那就太好了。

有没有办法做到这一点(使用续行或其他魔法)?

【问题讨论】:

  • @LexLi,这是一个已知的限制吗?这至少可以回答我的问题。
  • 运行脚本的命令是什么?还是将其复制/粘贴到 WinDbg 命令窗口中?
  • 我正在复制/粘贴,但我想可以轻松切换到运行脚本。
  • 我想对实际问题的简短回答是:否。 WinDBG 不以任何正常/合理的方式支持多行命令。

标签: windbg


【解决方案1】:

如果您的编辑器允许并支持具有不同行尾的文件(在一个文件中!),这是可行的:

在您希望 WinDbg 结束语句的位置插入 Macintosh 换行符 (CR;0x0D) 和 Unix 换行符 (LF;0x0A)。

$<, $><, $$<, $$><, $$ >a<(MSDN;不是注入)有一些细节:

$$>

其实这个说法是错误的。它将0x0A 替换为分号,即LF(换行)而不是回车(CR)。

例子:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  2E 65 63 68 6F 20 22 57 6F 77 0D 2E 65 63 68 6F  .echo "Wow..echo
00000010  20 74 68 65 72 65 20 69 73 20 61 20 6C 69 6E 65   there is a line
00000020  62 72 65 61 6B 22 0A 72 20 24 74 30 0A 6B 20 4C  break".r $t0.k L
00000030  31     

看起来像 4 行,但将作为 1 行执行:

2:004> $$>a< b:\newline.windbg
Wow .echo there is a linebreak
$t0=00000000
 # ChildEBP RetAddr      
00 0116f508 7726c088     ntdll!LdrpDoDebuggerBreak+0x2b

WinDbg 命令解析器、脚本解析器和任何实现的解析器……呃……我认为是以非常简单的方式实现的。他们没有过多考虑转义字符等。请注意,他们不关心.echo",甚至会替换甚至替换字符串中间的LF。这样的例子还有很多。

也许您想使用 研究 Python 脚本,实现 WinDbg 扩展或类似的。

【讨论】:

  • 哈!利用 MS 自身的弱点为我谋取优势。
  • 我试图避免在这种情况下使用 pykd,因为它需要正式的 Python 安装(它希望注册表数据运行py.exe),而我只有一个便携式安装。我不想在我可能会迭代开发此脚本代码的系统(例如客户机器)上强加一堆先决条件。
  • @mojo:明白了。我仍然使用 WinDbg 脚本的原因之一。
【解决方案2】:

m_compareFunction 和 m_pItems 的那些数字/地址 10000 是示例而不是实际值吗??

m_compareFunction 是一个函数指针

0:000> ?? labels[0].m_compareFunction
<function> * 0x00000000`00000000 

m_pItems 是一个 wxString *

0:000> ?? labels[0].m_pItems
class wxString * 0x000001c8`2553f598
   =00007ff7`cc3b8a60 npos             : 0xffffffff`ffffffff
   +0x000 m_impl           : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
   +0x028 m_convertedToChar : wxString::ConvertedBuffer<char>

也可以去掉$t1+$t2

无论如何,将您的脚本放在 myscript.wds 之类的 txt 文件中并使用
$$>a
执行它 您可以将脚本编写为多行

:\>cat d:\myscript.wds
r? $t0 = labels
?? @$t0
?? @$t0[0]
?? @$t0[1].m_pItems
?? @$t0[3].m_nCount
:\>

执行

0:000> $$>a< d:\myscript.wds
class wxArrayString [8] 0x00000035`350fe650
   +0x000 m_compareFunction : (null) 
   +0x008 m_nSize          : 0x20
   +0x010 m_nCount         : 0x13
   +0x018 m_pItems         : 0x000001c8`2553f598 wxString
   +0x020 m_autoSort       : 0
class wxArrayString
   +0x000 m_compareFunction : (null) 
   +0x008 m_nSize          : 0x20
   +0x010 m_nCount         : 0x13
   +0x018 m_pItems         : 0x000001c8`2553f598 wxString
   +0x020 m_autoSort       : 0
class wxString * 0x000001c8`26f40fa8
   =00007ff7`cc3b8a60 npos             : 0xffffffff`ffffffff
   +0x000 m_impl           : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
   +0x028 m_convertedToChar : wxString::ConvertedBuffer<char>
unsigned int64 0

如果你使用 r?你可以消除所有的演员表

0:000> r @$t0 = 0x00000035`350fe654
0:000> r? $t19 = (widgets!wxArrayString *)@$t0
0:000> ?? @$t19
class wxArrayString * 0x00000035`350fe654
   +0x000 m_compareFunction : 0x00000020`00000000     int  +2000000000
   +0x008 m_nSize          : 0x00000013`00000000
   +0x010 m_nCount         : 0x2553f598`00000000
   +0x018 m_pItems         : 0x350ff800`000001c8 wxString
   +0x020 m_autoSort       : 35

【讨论】:

  • 0x10000 是对指针值的完整性检查。 IE。 “这是一个(有效的)指针吗?”没有真正的检查这样的事情,但我试图辨别我是否应该尝试尊重指针。
  • r? 啊啊! WinDBG 有这么多 命令!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多