暴力搜索内存进程对象反隐藏进程这篇文章中,我们提到:

Object Header偏移0×008处Type成员为对象类型值,相同类型的对象具有相同的值.  自Window  7开始, _OBJECT_HEADER及其之前的一些结构发生了变化.

lkd> dt _object_header

nt!_OBJECT_HEADER

+0×000 PointerCount      : Int4B

+0×004 HandleCount       :Int4B

+0×004 NextToFree        : Ptr32 Void

+0×008 Lock             : _EX_PUSH_LOCK

+0x00c TypeIndex          : UChar

……

可以看到, 0×008处的指向_OBJECT_TYPE的指针已经没有了,  取而代之的是在0x00c 处的类型索引值. 但Windows7中添加了一个函数ObGetObjectType, 返回Object_type对象指针.

看过黑月教主文章也大概知道是怎么回事了,这里我再来扯一扯。。。

首先我们来对ObGetObjectType进行反汇编:

把参数object的地址赋给eax。

82a8f3fb 8b4508          mov     eax,dword ptr [ebp+8]

获取TypeIndex的值,解释一下为什么是减去0Ch。正常的计算应该是:

object地址-Object_header的大小+TypeIndex的偏移,所以有:

eax-0x18h+0x0Ch 即为 eax – 0x0Ch

82a8f3fe 0fb640f4        movzx   eax,byte ptr [eax-0Ch]

根据索引值在ObTypeIndexTable数组中找到对应的ObjectType。

82a8f402 8b0485c0b89882  mov     eax,dword ptr nt!ObTypeIndexTable (8298b8c0)[eax*4]

验证下ObTypeIndexTable 是不是一个数组。

我们随便找个进程,然后查看它的TypeIndex,发现是0x7h,那来看看索引为7的ObjectType对象是不是进程的ObjectType。

事实证明确实是的。

在ObInitSystem函数中,可以找到创建对象类型的函数:

不论哪个系统,创建的第一个对象类型就是“对象类型”。听起来确实比较别扭,它的名字是ObpTypeObjectType,正如设备对象的类型叫做IoDeviceObjectType一样。不过不同的是,Win7中ObpTypeObjectType对应的Index是2,而在此以前的系统中,该类型对应的Index总是1.

在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就可以了。(引用自黑月教主)

反汇编也可以看到。

在ObTypeIndexTable 中来查看,地址为84133c98 。

可以看到TotalNumberOfObjects为0x2a,即42,和dd ObTypeIndexTable 看到的结果是一样的。

同以前的系统一样在,_OBJECT_TYPE->TotalNumberOfObjects指明了某种类型的对象共有多少个,而ObpTypeObjectType作为对象类型的类型,它的TotalNumberOfObjects实际上便是系统中所有ObjectType的个数。要想获取所有的ObjectType,你可以简单地直接遍历这个表来实现。至于表的地址,可以反汇编导出函数ObGetObjectType来得到,有过从PsLookupProcessByProcessId中取PspCidTable地址经历的人搞这个会很容易。由于ObpTypeObjectType的索引固定为2,所以可以使用_ObTypeIndexTable[2]->TotalNumberOfObjects获取到所有对象类型的个数,然后遍历即可。或者,使用TypeIndex从2开始一直遍历到ObTypeIndexTable[TypeIndex]为零止。

本文链接:http://www.blogfshare.com/win7-obtypeindextable.html

 jpg 改 rar

Win7 Object_Header之TypeIndex解析的更多相关文章

  1. 【旧文章搬运】Win7 OBJECT_HEADER之TypeIndex解析

    原文发表于百度空间,2010-08-09========================================================================== 在Wind ...

  2. 一个简单的Object Hook的例子(win7 32bit)

    Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改. _OBJECT_HEADER: kd> dt _OBJECT_HEA ...

  3. 驱动保护中的ObjectType_Callback探索

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

  4. Android逆向之旅---解析编译之后的Dex文件格式

    一.前言 新的一年又开始了,大家是否还记得去年年末的时候,我们还有一件事没有做,那就是解析Android中编译之后的classes.dex文件格式,我们在去年的时候已经介绍了: 如何解析编译之后的xm ...

  5. Win7 _Object_header 中的 TypeIndex

    Win7 比较 xp下ObjectHeader中的内容有所变化,xp直接在OBJECT_HEADER里保存了POBJECT_TYPE指针,而Win7中把所有的对象类型放在了一个表里,这个表叫做ObTy ...

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

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

  7. win7 64位系统 pl/sql 无法解析指定的连接标识符解决办法

    我用的是win764位,装好后,装了pl/sql 和toad,都连不上数据库,报错位“无法解析指定的连接标识符” 解决办法,经过研究发现安装目录有问题.默认会安装在“C:\Program Files ...

  8. win7下PLSQL Developer提示“ORA-12154: TNS:无法解析指定的连接标识符”

    解决方法:卸载掉重新安装,注意安装的目录的文件夹不要有特殊的符号,例如64位系统的的安装目录会到Program Files (x86),这时候就会出现"ORA-12154: TNS:无法解析 ...

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

    如果使用工具可以连接Oralce说明与Oralce安装无法. 解决方法: 解决步骤: 1.去网上下载"instantclient-basic-win32-11.2.0.1.0.zip&quo ...

随机推荐

  1. Twisted安装

    Debian sudo apt-get install gcc python-dev && sudo pip install twisted CentOS sudo yum insta ...

  2. offset求结构体成员的偏移量

    [代码]  C++ Code  12345678910111213141516171819202122232425262728293031   /* version: 1.0 author: hell ...

  3. MySQL Got fatal error 1236原因和解决方法【转】

    本文来自:http://blog.itpub.net/22664653/viewspace-1714269/ 一 前言  MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主 ...

  4. codeforces 567D.One-Dimensional Battle Ships 解题报告

    题目链接:http://codeforces.com/problemset/problem/567/D 题目意思:给出 1 * n 的 field,编号从左至右依次为 1,2,...,n.问射 m 枪 ...

  5. 【编程之美】2.5 寻找最大的k个数

    有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2 ...

  6. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  7. wkwebview 代理介绍

    iOS 8引入了一个新的框架——WebKit,之后变得好起来了.在WebKit框架中,有WKWebView可以替换UIKit的UIWebView和AppKit的WebView,而且提供了在两个平台可以 ...

  8. net 页面跳转

    前台: < a href="xx.html" target="_blank"> 后台: Response.Redirect("XXX.as ...

  9. C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制(当然目前C++ 11 ...

  10. cocospod 安装和使用 podfile 问题解决

    Podfile 不识别 usr_framework!,系本地Pods版本太低,要在0.36以上. 以下转自:http://blog.csdn.net/eqera/article/details/393 ...