wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1678回复:5

关于对象管理器

楼主#
更多 发布于:2002-02-06 17:16
看了webcrazy的《剖析Windows NT/2000内核对象组织》,作了一个程序,遍历所有的对象,但是看不到所有的为命名对象。
另外,也看不到任何的File类型的对象(无论命名没有)。
但是通过ZwQuerySystemInformation询问SymtemObjectInformation(17),可以得到所有的File类型对象。只是对象的名称不完整。
我想知道怎样得到所有的未命名对象?

最新喜欢:

ljmmaryljmmar...
tsu00
驱动牛犊
驱动牛犊
  • 注册日期2002-02-01
  • 最后登录2006-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-02-06 19:27
我在《剖析Windows NT/2000内核对象组织》中提供的代码是非常初级的实现,本身也没根据hashtable数据结构来严格实现,当初写这代码时,只是为了清楚的知道各个定义的具体偏移。
你说的未命名对象与file等对象windows 2k/xp没有使用系统全局命名内核区(由内核变量ObpRootDirectoryObject指定),因为系统全局命名内核区中的对象是system-wide的,所以只有命名对象。
未命名对象与file对象(win2k内部并不将file对象文件名作为对象名,所以也是未命名对象,多个进程共享file数据,使用section内核对象)。如果你要寻找未命名对象请遍历process handle表,因为这些对象是process-wide的。

至于ZwQuerySystemInformation可以找到file对象等其它未命名对象,他自己查找handle表。实际上这个native api几乎可以看到所有system信息。他使用class参数来区别system信息类别。

这些我在《剖析Windows NT/2000内核对象组织》中都讲得很清楚的。
Welcome to [url]http://webcrazy.yeah.net[/url]!
wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-02-07 20:16
我知道《剖析Windows NT/2000内核对象组织》中有错误,也写信给你说过(但是没反应)。我的代码已经纠正了一些错误。其中,一个严重的错误是:你的程序表明对象名在-0x24,但是我发现在-0x34。不知道是不是版本的原因?
File及未命名对象都是内核对象,都是全局的。我可以给你证据:
1。使用File对象的指针,可以通过ObReferenceObject增加计数,然后在所有的驱动程序(无论处于什么上下文)中都可以使用该对象。IoGetDeviceObjectPointer也会返回一个File对象的指针,可以在任何驱动中使用。
2。我发现每一种类型的内核对象都放在一个表中,这个表记录了同类型的所有的内核对象的指针,但是关于这个表的具体内容、格式和怎样的到表的开头还不清楚。
tsu00
驱动牛犊
驱动牛犊
  • 注册日期2002-02-01
  • 最后登录2006-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-02-07 21:39
首先,很感谢您曾经给我过mail,不过我刚才查了263,没发现有关于内核对象的此类反馈,不过还是要谢谢你。

关于你提出的错误,其实关于结构的一些项目偏移,我在文中也指出过,也说过代码Only test on Windows 2000 Server Chinese Edition Build 2195(Free),不知道你的版本是什么。我要说明的是我文中的代码我至少有测试过,不过由于都是一些undocumnet的内容,所以可能会出现这种问题,xp出来时,我曾经有打算对网站的一些重要的信息作一些更新,不过由于原理均基本相同,加上.net等技术呈出不穷,该学的也越来越多,所以就没有实施。

至于你提出的证据,在解释我的想法前,想引用我在《小议Windows NT/2000分页机制》中的一句话:
 
在后2G(内核空间,Windows 2000 Server的ntoskrnl.exe的MmSystemRangeStart指出其线性地址的开始位置),大部分物理空间均由两个实例共享,实际上不同程序所有运行的例程均共享这2G,当然页目录(C0300000h)与页表(C0000000h)等其它比较特殊的操作除外

意思是内核模式下的内存空间对于所有进程基本上都是一致的,所以你在驱动中可以直接引用对象数据,就像你说的使用ObReferenceObject等可以得到文件对象句柄或是指针。所以从这种意义上这些对象都是system-wide的。而对于用户模式,则有严格的system-wide与process-wide的区别,这你应该不难理解吧。所以说不能单凭这点就说file对象是全局的。

至于你说的我发现每一种类型的内核对象都放在一个表中,我想windows nt/2k出于效率等其他因素,可能会有这种现象。而这也只可能是对内核模式来说的。因为不管怎么样,在用户态全局不全局肯定是严格区分的。(你说的这种情况,我未加证实)

本身我来这儿也是来交流学习的。欢迎讨论赐教。

 

我知道《剖析Windows NT/2000内核对象组织》中有错误,也写信给你说过(但是没反应)。我的代码已经纠正了一些错误。其中,一个严重的错误是:你的程序表明对象名在-0x24,但是我发现在-0x34。不知道是不是版本的原因?
File及未命名对象都是内核对象,都是全局的。我可以给你证据:
1。使用File对象的指针,可以通过ObReferenceObject增加计数,然后在所有的驱动程序(无论处于什么上下文)中都可以使用该对象。IoGetDeviceObjectPointer也会返回一个File对象的指针,可以在任何驱动中使用。
2。我发现每一种类型的内核对象都放在一个表中,这个表记录了同类型的所有的内核对象的指针,但是关于这个表的具体内容、格式和怎样的到表的开头还不清楚。
 
Welcome to [url]http://webcrazy.yeah.net[/url]!
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-02-11 10:15
FILE对象是ExAllocatePool得来. 对象管理器中没有对应的链表.
FILE OBJECT只在IRP_MJ_CREATE时能确保其名是完整的. 而且在IRP_MJ_CREATE的调用栈中可能会被改动.
对象管理器管理的对象名本身的位置是不确定的. 有时有有时没有, 有时位置变化.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
Supermi
驱动牛犊
驱动牛犊
  • 注册日期2001-10-20
  • 最后登录2014-06-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-02-23 03:24
我在看一些资料的时候看到有人说 IopParseDevice 函数(是对象管理器中的undocument的函数)是用来构建FileObject用的,但是我不知道则个函数究竟是则么定义的,我翻遍了DDK和IFS,都找不到。如果斑竹知道,能否告诉我一声。另外,我不知道构建FileObject的好方法,我发了一帖在“哪位狠心的同志请看”上。公布了我的源码。但我总觉得该方法有些蹩。因为我是学生,我能得到的资料有限,希望得到版主的指导。我的Email: li-gen@x263.net,thanks for advance
游客

返回顶部