Windows系统的对象管理中,为了能够从对象头获取对象类型指针,在Win7以前的系统里直接在OBJECT_HEADER里保存了POBJECT_TYPE指针,而这一点在Win7系统里发生了改变。Win7中把所有的对象类型放在了一个表里,这个表叫做ObTypeIndexTable。这个表可以这么定义:
POBJECT_TYPE ObTypeIndexTable[0x100];
Win7的对象头中不再保存ObjectType指针,而是保存了TypeIndex,也就是对象类型在该表中的索引,并且提供了一个函数ObGetObjectType。需要取得对象类型时直接使用导出函数ObGetObjectType就可以得到对应的对象类型了,反而比以前方便。
该函数非常简单,还原成代码如下:
POBJECT_TYPE
ObGetObjectType(
    IN PVOID Object)
{
    POBJECT_HEADER ObjectHeader=OBJECT_TO_OBJECT_HEADER(Object);
    return ObTypeIndexTable[ObjectHeader->TypeIndex];
}
代码很简单,传入一个对象,取对象头中的TypeIndex作为索引,然后返回ObTypeIndexTable中对应的值。
一个简单的获取所有对象类型指针的方法就是:从ObGetObjectType中取ObTypeIndexTable遍历即可,比较简单~
ObTypeIndexTable这个表是在ObInitSystem中被初始化的,这时的初始化并没有实际填充其内容。ObInitSystem中部分代码如下:
83df4420 6a50             push     50h
83df4422 8d8558feffff     lea      eax,[ebp-1A8h]
83df4428 53               push     ebx
83df4429 50               push     eax
83df442a c705c478b983b0b0d0ba mov dword ptr [nt!ObTypeIndexTable+0x4 (83b978c4)],0BAD0B0B0h
83df4434 e807fac9ff       call     nt!memset (83a93e40)
也就是说令ObTypeIndexTable[1]=0xBAD0B0B0,这个常数在Windows中表示一个无效的对象类型指针,从Win2000至Win7都是如此,有效的对象类型则从索引2开始,具体细节可参考 这里。(感谢炉子提供信息)
创建对象类型的函数是ObCreateObjectType,不过这家伙啥也不干,直接调用ObCreateObjectTypeEx去了。
创建一个对象类型时具体干了哪些事,完全可以参考Wrk中的ObCreateObjectType,说简单了就是申请一块内存然后根据传入的参数进行填充一下,需要注意的还是这个Index的值。ObCreateObjectTypeEx每创建一个对象类型都要申请一个索引,用来保存创建的对象类型到ObTypeIndexTable表中的相应位置。不论哪个系统,创建的第一个对象类型就是“对象类型”。听起来确实比较别扭,它的名字是ObpTypeObjectType,正如设备对象的类型叫做IoDeviceObjectType一样。不过不同的是,Win7中ObpTypeObjectType对应的Index是2,而在此以前的系统中,该类型对应的Index总是1.可参考( http://hi.baidu.com/_achillis/blog/item/b175e2d254745ad8a8ec9a69.html)
在ObCreateObjectTypeEx中申请该Index时有如下代码:
BYTE newIndex;
NTSTATUS status;
if ( theObjectType ==   ObpTypeObjectType )
{
     newIndex = 2;
}
else
{
     status = ObpAllocateTypeIndex(&newIndex);
    //省略...
}
可以看到,系统对ObpTypeObjectType有特殊处理,当创建该对象类型时,指定了其TypeIndex为2。否则就调用ObpAllocateTypeIndex申请一个有效的索引。
ObpAllocateTypeIndex实际上是从ObTypeIndexTable[2]这个位置(也就是存放ObpTypeObjectType的位置)开始,依次判断内容是否为0,若不为0,则继续判断下一个
若为0,表明这个Index所在的位置尚未被人使用,就返回这个Index就可以了。
在系统启动的过程中,各种类型的对象类型依次创建并被填充到这个表里。系统启动完成后,ObjectType都创建完毕,完整的ObTypeIndexTable如下:
kd> dd ObTypeIndexTable
83b588c0   00000000 bad0b0b0 84dafd80 84dafcb8
83b588d0   84dafbf0 84daf9a8 84daf868 84daf7a0
83b588e0   84daf6d8 84daf610 84daf548 84e35ca0
83b588f0   84e53d20 84e4f780 84e57e38 84e572b8
83b58900   84e4f1e0 84e48418 84e48350 84e49418
83b58910   84e49350 84e53868 84e537a0 84e536d8
83b58920   84e4a9b8 84e4a8f0 84e4a828 84e4a760
83b58930   84e4a698 84e50f78 84e50eb0 84e50de8
83b58940   84e50d20 84e50b50 84e507b0 84e521f8
83b58950   84e4ca98 84e26f50 84e2aa80 84e55548
83b58960   84e55480 85aae850 85ab18e0 85b17680
83b58970   00000000 00000000 00000000 00000000
83b58980   00000000 00000000 00000000 00000000
索引为2处(偏移为8),即为ObpTypeObjectType,细看一下:
kd> dt _OBJECT_TYPE 84dafd80
nt!_OBJECT_TYPE
    +0x000 TypeList          : _LIST_ENTRY [ 0x84dafd58 - 0x85b17658 ]
    +0x008 Name              : _UNICODE_STRING "Type"
    +0x010 DefaultObject     : 0x83b57ba0
    +0x014 Index             : 0x2 ''
    +0x018 TotalNumberOfObjects : 0x2a
    +0x01c TotalNumberOfHandles : 0
    +0x020 HighWaterNumberOfObjects : 0x2a
    +0x024 HighWaterNumberOfHandles : 0
    +0x028 TypeInfo          : _OBJECT_TYPE_INITIALIZER
    +0x078 TypeLock          : _EX_PUSH_LOCK
    +0x07c Key               : 0x546a624f
    +0x080 CallbackList      : _LIST_ENTRY [ 0x84dafe00 - 0x84dafe00 ]
可以看到TotalNumberOfObjects为0x2a,即42,这与上面的结果是一致的。
同以前的系统一样在,_OBJECT_TYPE->TotalNumberOfObjects指明了某种类型的对象共有多少个,而ObpTypeObjectType作为对象类型的类型,它的TotalNumberOfObjects实际上便是系统中所有ObjectType的个数。要想获取所有的ObjectType,你可以简单地直接遍历这个表来实现。至于表的地址,可以反汇编导出函数ObGetObjectType来得到,有过从PsLookupProcessByProcessId中取PspCidTable地址经历的人搞这个会很容易。由于ObpTypeObjectType的索引固定为2,所以可以使用_ObTypeIndexTable[2]->TotalNumberOfObjects获取到所有对象类型的个数,然后遍历即可。或者,使用TypeIndex从2开始一直遍历到ObTypeIndexTable[TypeIndex]为零止。

另外,要进行上述观察,注意使用新版的Windbg,我一直使用的6.9版Windbg无法识别Win7下的对象~~
下一篇说说Win7的可变对象头的变化,即InfoMask的作用~~

Win7 OBJECT_HEADER之TypeIndex解析相关推荐

  1. 计算机休眠能降低硬件损耗,Win7居然会出现“失眠”——Win7无法休眠问题解析...

    许多用户在安装了win7以后,都出现了无法使用休眠功能的问题,当用户暂时不使用电脑或离开电脑时,系统不能进入休眠状态,使得节电与减少硬件损耗都不能正常进行,显示器也会长时工作,这加速了电脑的整体老化. ...

  2. win7 没有信息服务器地址,win7电脑提示无法解析服务器dns地址,该如何解决?

    大家好我是大明本期问答讲解关于"win7系统提示无法解析服务器dns地址",这个问题的解决方法. 通常出现这类故障的原因可能由以下几种原因导致的: 1.IP地址配置或是DNS服务器 ...

  3. 驱动保护中的ObjectType_Callback探索

    最近学习驱动保护,有点小小心德与大家分享下. 当前环境:VM中的win7 32 保护程序是某游戏的驱动保护. 具体现象是:在用PCHunter工具查看object钩子时发现如下的信息: 疑问点1:在H ...

  4. Win7系统服务全面解析

    对于电脑"老鸟"们来说,系统服务则是经常优化的系统参数,与许多系统表现的参数与选项设置相比,系统服务中的各种优化则能带来更直接.实在的性能提升,因此越来越多的用户开始尝试对系统服务 ...

  5. win7 找不到 计算机策略组,win7打开组策略报错:找不到资源string.Advanced_EnableSSL3Fallback...

    今天要在组策略里关闭几个端口,每次打开组策略时都弹出一个错误提示框,说是找不到资源"string.Advanced_EnableSSL3Fallback". 找不到资源string ...

  6. 【旧文章搬运】Win7可变对象头结构之InfoMask解析

    原文发表于百度空间,2010-08-11 ========================================================================== 对Win ...

  7. window7不要光盘修复计算机,Win7若崩溃了就靠它——Win7系统修复光盘制作方法解析...

    修复光盘相信许多用户都使用过,很多电脑维修员都准备了一张WinPE光盘,无论是系统中毒.缺少文件.甚至是系统崩溃,利用WinPE都可以很方便地解决.而许多用户都认为制作修复光盘是非常麻烦的事,其实Wi ...

  8. win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法

    win7 64位 VS2010调试提示"ORA-12154: TNS: 无法解析指定的连接标识符"的解决方法 参考文章: (1)win7 64位 VS2010调试提示"O ...

  9. 系统也需和谐共存——Win7与XP安装同一盘符方法解析

    XP的高效.通用性一直是最倍受用户亲赖的系统代表,经过Vista后的Win7系统,华丽的界面与更加完善的功能使得用户难以抗拒,然而大多数用户都希望即能拥有XP的精简高效又能体验Win7的华丽,这就出现 ...

最新文章

  1. Log控制台打印设置
  2. 汪劲:生命系统中的非平衡物理学
  3. oralce主键自动生成
  4. vu项目中按F5刷新element菜单没有根据路由匹配菜单解决办法
  5. nyoj 720 项目安排(dp+二分优化)
  6. 数据仓库—stg层_手把手教你创建BI数据仓库STG层
  7. qpython3编辑器怎么用_Python快速入门系列:Pyqt5界面开发好帮手-Qss样式编辑器介绍...
  8. html dot标签,html – CSS Dot符号命名约定
  9. Linux命令解释之grep
  10. python就业有哪些方向_Python就业有哪些方向?最全信息在这里!
  11. 微信模板消息发送不显示小程序链接的处理
  12. EBS 销售订单登记提示错误 ORA-00604 LPX-00225
  13. linux excel自动换行,Excel中巧用样式列表快速实现文本换行
  14. Excel中序号自动填充
  15. 端午节送点话费给大家,千万别错过!
  16. 在VS中怎么用vb画矩形_怎样画颜色绚丽的插画?
  17. 小程序实现漂亮的个人中心版面
  18. 雨天在火车站台上撑伞会触电吗?
  19. 博图os更新_博图os更新_工控随笔_24_西门子TIA 博图硬件目录的更新
  20. 小说里的编程 【连载之七】元宇宙里月亮弯弯

热门文章

  1. OAuth2.0的理解基础
  2. 数据结构-王道-树和二叉树
  3. cf559C. Gerald and Giant Chess(容斥原理)
  4. 添加面部跟踪和实时识别到您的Android应用程序
  5. redis报protocol error的真正原凶
  6. springMVC 注解 controller层的优化
  7. 开发路上踩过的坑要一个个填起来————持续更新······(7月30日)
  8. C++中虚函数与多态实现
  9. 【090】Excel VBA 基础
  10. 在SQL和ERWIN中用自定义类型、规则和默认值实现check约束从而保证数据的完整性...