首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dt nt!_TEB和dt ntdll!_TEB有区别吗?

dt nt!_TEB和dt ntdll!_TEB有区别吗?
EN

Stack Overflow用户
提问于 2015-04-08 21:55:36
回答 2查看 883关注 0票数 4

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

代码语言:javascript
运行
复制
dt modulename!type

在某些情况下,我看到了。

代码语言:javascript
运行
复制
dt nt!_TEB

(它可以工作)尽管这个模块名为ntdll

代码语言:javascript
运行
复制
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 help .hh dt

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

  • 是否还有其他命令可以使用nt而不是ntdll,或者这是dt-specific?
  • 是否还有其他具有快捷形式的模块?
  • 这从何而来(例如,这种行为是否有一定的历史背景)?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-09 08:43:08

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

假设您有一个脚本,它既可以在内核模式下工作,也可以在用户模式下工作。可以使用{nt}表示ntdllntkrnlpantkrnlmpntoskrnlntwowxxxx之一。

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

您不能像任何地方一样使用nt。例如,在用户模式下自动完成dt nt!_p不会自动完成,但是dt ntdll!_p将正确地自动完成。evaluate nt,它将错误与无法评估,但评估? ntdll将工作。

nt是在dt命令中特别解析的,它有一个函数为字符串分配一个适当的模块值,这样它就可以按原样在dt中使用。

解析nt的函数的伪代码如下所示:

代码语言:javascript
运行
复制
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并为其赋值。

票数 6
EN

Stack Overflow用户

发布于 2015-04-09 18:21:16

nt和ntdll是完全不同的模块。nt是一个内核模式模块,包含执行子系统和Windows内核(我们通常称之为“内核”)。ntdll是一个用户模式DLL,它提供了一些用户模式API来与内核进行接口。

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

至于为什么它们不能完全互换,你只能使用"dt nt!“窗体,如果您正在调试内核模式目标(活动或转储)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29526072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档