【问题标题】:Is there a difference in dt nt!_TEB and dt ntdll!_TEB?dt nt!_TEB 和 dt ntdll!_TEB 有区别吗?
【发布时间】:2015-04-08 21:55:36
【问题描述】:

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

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!typedt ntdll!type 有区别吗?或者它总是可以以快捷方式使用?我正在寻找有来源的可靠答案,而不仅仅是“是”。

我试过了:

  • 阅读WinDbg帮助.hh dt

如果您有一些想要分享的背景知识,请回答问题:

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

【问题讨论】:

  • nt = Windbg 中的 kernel.exe 而不是 ntdll
  • @magicandre1981:至少两个命令(dt nt!_TEBdt ntdll!_TEB)都在用户模式调试下工作,为什么要引用那里的内核?

标签: debugging windbg usermode


【解决方案1】:

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

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

不仅内核模式下的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 并为其分配一个值

【讨论】:

  • 谢谢。这解释了为什么我也可以使用 dt $ntsym!_TEB,但不是真的为什么我可以使用 nt(尤其是没有 $ 或 ${})
  • 不,您不能使用 nt,因为它在任何地方都被解析并在 typedump 函数中分配了适当的值试试? nt 在用户模式下它不会评估查看扩展编辑回复
【解决方案2】:

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

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

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

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

【讨论】:

  • “如果你正在调试内核模式目标,你只能使用“dt nt!”形式”——这不是真的。它在用户模式实时调试中也能正常工作,使用 WinDbg 6.2.9200(amd64 和 x86)。
  • "nt 是一个内核模式模块" - 我在我的系统上既找不到nt.dll 也找不到nt.exe。有ntkrnlpa.exentoskrnl.exe,所以恕我直言,这句话并不准确。后来你说“它是内核真实名称的别名”,这个可能性更大。
猜你喜欢
  • 2013-04-20
  • 2017-11-06
  • 1970-01-01
  • 2021-02-03
  • 2015-08-28
  • 1970-01-01
  • 2017-07-25
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多