3

我可以使用从任意模块转储类型

dt modulename!type

在某些情况下,我看到例如

dt nt!_TEB

(并且它有效)虽然该模块被称为ntdll

0:001> lm m nt
start             end                 module name
0:001> lm m ntdll
start             end                 module name
00000000`76e00000 00000000`76fa9000   ntdll      (pdb symbols)          d:\...\ntdll.pdb

正如您在上面看到的,ntdll不能总是替换为nt.

与它有区别dt nt!type还是dt ntdll!type可以始终以其快捷方式使用?我正在寻找一个可靠的来源答案,而不仅仅是“是”。

我试过了:

  • 阅读 WinDbg 帮助.hh dt

如果你有一些你想分享的背景知识,额外的问题:

  • 是否有其他命令nt可以用来代替ntdll或者是这个dt特定的?
  • 是否还有其他具有快捷方式的模块?
  • 这是从哪里来的(例如,这种行为是否有一些历史背景)?
4

2 回答 2

5

nt$ntsym是由调试器查找或设置的自动别名$ntnsym。解释在 WinDbg 帮助“使用别名”(MSDN 的在线版本)中。您可以在需要该别名的任何地方使用它。

假设您有一个在内核模式和用户模式下都可以工作的脚本。您可以使用 {nt} 来表示ntdllntkrnlpantkrnlmp或。ntoskrnlntwowxxxx

不仅在内核模式ntdllntXXXXX具有此自动别名,因为两者都具有相同的功能代码。没有其他模块具有像这两个模块这样的通用代码。例如ntdll!NtCreateFile,有一个等价物nt!NtCreateFile ,前者是一个存根,它通过系统调用在后者中到达真正的实现。

你不能使用nt,因为它无处不在
尝试dt nt!_p在用户模式下自动完成它不会自动完成但
dt ntdll!_p会正确 完成evaluate nt它会出错无法评估但
评估? ntdll将在 dt 命令中得到正确的评估 nt 被专门解析并具有分配适当模块的功能字符串的值,因此它可以按原样在 dt 中使用

解析 nt 的函数的伪代码是这样的

switch(GetToken(wcschr(inputstr ,"!")) == "nt" )
case usermode nt = "ntdll";
case kmode    nt = "Nt" using machineinfo.NtModule (ntos .......)
case wow      nt = "Nt32" using getnt32module()

如果您好奇,反汇编 dbgeng 并搜索其中包含字符串类型转储的函数,该函数是 x dbgeng!*typedump* 其中一个函数具有解析字符串 nt 并为其分配值的子调用

于 2015-04-09T08:43:08.167 回答
1

nt 和 ntdll 是完全不同的模块。nt 是一个内核模式模块,它包含执行子系统和 Windows 内核(我们通常将此映像简称为“内核”)。ntdll 是一个用户模式 ​​DLL,它提供了一些用户模式 ​​API 用于与内核交互。

dt 命令显示给定模块的类型。在这种情况下,两个模块恰好包含相同的数据类型。就好像您和我都编写了使用相同数据结构的驱动程序,您可以从任一模块转储它并获得相同的结果。

至于为什么它们不能完全互换,您只能使用“dt nt!” 如果您正在调试内核模式目标(实时或转储),则形成。

正如其他人指出的那样,“nt”的特殊之处在于它是内核真实名称的别名。根据处理器架构和特性,该模块有不同的名称,因此别名可以让我们在不知道确切名称的情况下引用该模块。唯一适用的其他模块是硬件抽象层(HAL),它有各种名称,但可以在调试器中简单地用“hal”来引用。

于 2015-04-09T18:21:16.890 回答