debugging dt nt!_TEB和dt ntdll!_TEB之间是否存在差异?

v7pvogib  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(200)

我可以使用

dt modulename!type

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

dt nt!_TEB

(and它工作),尽管该模块被称为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的命令?
  • 是否有其他模块具有快捷方式表单?
  • 这是从哪里来的(例如,这种行为是否有一些历史背景)?
3lxsmp7m

3lxsmp7m1#

nt是调试器查找为$ntsym$ntnsym设置的自动别名。有关解释,请参阅WinDbg帮助“使用别名”(online version at MSDN)。您可以在需要该别名的任何地方使用它。
假设您有一个在内核模式和用户模式下都能工作的脚本。您可以使用{nt}来表示ntdllntkrnlpantkrnlmpntoskrnlntwowxxxx
不仅ntdllntXXXXX在内核模式下有这个自动别名,因为两者都有功能上相同的代码。没有其他模块有像这两个模块一样的代码。例如,ntdll!NtCreateFile有一个等效的nt!NtCreateFile,前者是一个存根,通过syscall到达后者的真实的实现。
你不能像在任何地方一样使用nt。例如,在用户模式下自动完成dt nt!_p不会自动完成,但dt ntdll!_p会正确地自动完成。evaluate nt会错误地显示 cannot evaluate,但对? ntdll求值会起作用。
ntdt命令中被专门解析,并具有为字符串分配适当模块值的功能,以便可以按原样在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并为其赋值。

bnlyeluc

bnlyeluc2#

nt和ntdll是完全不同的模块。nt是一个内核模式模块,包含执行子系统和Windows内核(我们通常简称此映像为“内核”)。ntdll是一个用户模式DLL,提供一些用户模式API以与内核交互。
dt命令显示给定模块的类型。在这种情况下,两个模块恰好包含相同的数据类型。这就好像你和我都编写了使用相同数据结构的驱动程序,你可以从任何一个模块转储它,并得到相同的结果。
至于为什么它们不能完全互换,如果您正在调试内核模式目标(live或dump),则只能使用“dt nt!”形式。
正如其他人所指出的,“nt”的特殊之处在于它是内核真实的名称的别名。基于处理器架构和特性,该模块有不同的名称,因此别名使我们在不知道确切名称的情况下引用该模块。唯一适用于该模块的是硬件抽象层(HAL),它有各种各样的名称,但在调试器中可以简单地用“hal”来引用。

相关问题