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

Tho*_*ler 3 debugging windbg usermode

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

dt modulename!type
Run Code Online (Sandbox Code Playgroud)

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

dt nt!_TEB
Run Code Online (Sandbox Code Playgroud)

(并且它有效)虽然模块被调用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
Run Code Online (Sandbox Code Playgroud)

如您所见,ntdll不能总是被替换nt.

是否有差异dt nt!type对比dt ntdll!type或可它总是以它的快捷方式的形式使用?我正在寻找一个可靠的答案来源,而不仅仅是"是".

我试过了:

  • 阅读WinDbg的帮助 .hh dt

如果您有一些您想分享的背景知识,可以获得奖励:

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

bla*_*abb 5

nt是由调试器查找为$ntsym或设置的自动别名$ntnsym.解释是在WinDbg帮助"使用别名"(在MSDN上的在线版本).您可以在需要别名时使用它.

假设您有一个在kernelmode和usermode中都有效的脚本.您可以使用{} NT表示任ntdll,ntkrnlpa,ntkrnlmp,ntoskrnlntwowxxxx.

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

你不能使用,nt因为它是无处不在
尝试dt nt!_p在usermode 自动完成它不会自动完成,但
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()
Run Code Online (Sandbox Code Playgroud)

如果你好奇反汇编dbgeng并搜索其中包含字符串typedump的函数,那就是 x dbgeng!*typedump* 其中一个函数有一个suball解析字符串nt并为其赋值