dt nt有什么区别!_TEB和dt ntdll!_TEB?

时间:2015-04-08 21:55:37

标签: debugging windbg usermode

我可以使用

从任意模块转储类型
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具体?
  • 是否有其他模块有快捷方式?
  • 这是从哪里来的(例如,这种行为有一些历史背景)?

2 个答案:

答案 0 :(得分:5)

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

假设您有一个在kernelmode和usermode中都有效的脚本。 您可以使用{nt}来表示ntdllntkrnlpantkrnlmpntoskrnlntwowxxxx

内核模式中的ntdllntXXXXX不仅具有此自动别名,因为两者具有共同的功能等效代码。没有其他模块具有像这两个模块这样的通用代码。 例如,ntdll!NtCreateFile具有等效的nt!NtCreateFile 前者是通过系统调用实现后者实际实现的存根。

你无法使用nt,因为它无处不在 尝试在usermode中自动完成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并搜索其中包含字符串typedump的函数x dbgeng!*typedump*,其中一个函数有一个解析字符串nt并为其赋值的子查询

答案 1 :(得分:1)

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

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

至于他们为什么不能完全互换,你只能使用" dt nt!"如果您正在调试内核模式目标(实时或转储),请填写表单。

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