pspCidTAble完全解读.pdf





《pspCidTAble完全解读.pdf》由会员分享,可在线阅读,更多相关《pspCidTAble完全解读.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-一、句柄一、句柄句柄:HADNLE 在 winnt.h 定义如下:typedef void*HANDLE;是一个 32 位无类型指针,充当内核对象在内核的索引.句柄本质内核对象(object)的索引每个进程都有自己的进程句柄表,当操作进程对象时,会把对象指针放在自己的句柄表中,返回一个句柄,通过句柄来索引对象指针,然后操作对象。进程句柄表是根据 HANDLE 索引对象指针的,而 pspcidtable(未导出,需要自己定位地址)是根据 CI
2、D 索引对象指针的.EPROCESS 和 ETHREAD 分别是进程对象和线程对象应用程序HANDLE(句柄)用户空间用户空间内核空间内核空间NT 执行体执行体对象执行体对象NT 内核内核对象 图一、句柄、NT 执行体对象和 NT 内核对象IPspCidTablePspCidTable 完全解读 by sysdog 2009.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-用户空间用户空间内核空间内核空间NT 执行体EPROCESS(进程对象)ETHREAD(线程对象)NT 内核KPROCESS(PCB)(进程描述表)KTHREAD(线程描述表)图二、进程和线程描述表NT
3、 执行体处理进程线程对象,进程和线程描述表可由 EPROCESS 结构来访问,NT 内核处理进程和线程描述表二、句柄表二、句柄表XP 下句柄表是动态分配的,是个三层表,1 级表(称为基本表)存放系统底层的。句柄表大小为 1 页即 4K,而每个表项是一个 HANDLE_TABLE_ENTRY占 8 个字节,所以每个表最多只能放 512 个表项,又因为表项索引是以 4 递增的,因此一个最终表能承受的最大索引值也是 2048 即 0 x800,两个表最大为 0 x1000,三个表就是 0 x1800。句柄表的格式如下:PspCidTablePspCidTable 完全解读 by sysdog 200
4、9.5.1 Whu完全解读 by sysdog 2009.5.1 Whu-II句柄表就是 HANDLE_TABLE 结构,如下:里面没有指针结构啊,那么句柄表到底存储在那里?实际是保存在 TableCode 里面,但是 TableCode 并不是地址,它比地址所担任的责任多一点:标明这个指针指向的是哪一级别的句柄,在 x86 上面 Windows 总是分配内存使其沿四个字节对齐,所以实际的句柄表地址的低两位一定是 0?。XP 就用这两位来标示这个表是哪个级别,00 表示 1 级表,01 表示 2 级表,02表示 3 级表。2 级表存放的是 1 级表的指针,3 级表存放的是 2 级表的指针。Ta
5、bleCode 转变一下就是 HANDLE_TABLE_ENTRY 了,转变也很简单,就是低两位清零,因为底两位代表当前句柄表的级数,HANDLE_TABLE 里面存放的是一些信息,HANDLE_TABLE_ENTRY 才是真正的句柄表。HANDLE_TABLE_ENTRY结构如下:如果是一级表 HANDLE_TABLE_ENTRY=TableCode如果是二级表 HANDLE_TABLE_ENTRY 需要根据 2 级表中的指针来找 1 级表的基址,然后再根据 1 级表中的偏移找到进程对象.三级表类推III三、内核对象三、内核对象作为一个 Wi n d o w s 软件开发人员,经常需要创建、
6、打开和操作各种内核对象。系统要创建和操作若干类型的内核对象,比如存取符号对象、事件对象、文件对象、文件映射对象、I/O 完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。这些对象都是通过调用函数来创建的。例如,C r e a t e F i l e Ma p p i n g 函数可使系统能够创建一个文件映射对象。每个内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于定的对象类型。例如,进程对象
7、有一个进程 I D、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容。M i c r o s o f t 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 M i c r o s o f t 能够在不破坏任何应用程序的情况下在这些结构中添加、删除和修改数据成员。如果我们不能直接改变这些数据结构,那么我们的应用程序如何才能操作这些内核对象呢?解决办法是,Wi n d o w s 提供了一组函数,以便用定义得很好的方法来对这些结构进行操
8、作。这些内核对象始终都可以通过这些函数进行访问。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个不透明值,你的进程中的任何线程都可以使用这个值。将这个句柄传递给 Wi n d o w s 的各个函数,这样,系统就能知道你想操作哪个内核对象。四、PspCidTable四、PspCidTable对象指针:从其线形地址来看,它将常驻内存的结构体划分为两部分:一个对象头和一个对象体。对象指针并没有指向对象自身的基地址,而是指向了对象体,由于紧接着对象头的就是对象体,所以可以给对象指针加上一个负的偏移量来访问对象头。IV对象头(Object Header)对
9、象指针对象体(Object)对象根据根据 HANDLEHANDLE 索引句柄对象体过程索引句柄对象体过程EPROCESSHANDLE_TABLEObject Table对象根据 HANDLE索引对象头Object HeaderTableCodeObject通过 PID 索引进程对象体过程PspCidTable HANDLE_TABLE索引 HANDLE_TABLE_ENTRYTableCodePIDObjectEPROCESSVPspCidTable:指向 HANDLE_TABLE 的指针,未导出结构,存放所有进程及线程对象指针。lkd dt _handle_table指针ntdll!_HAN
10、DLE_TABLEPspCidTable +0 x000TableCode +0 x004QuotaProcess +0 x008UniqueProcessId +0 x00cHandleTableLock +0 x01cHandleTableList+0 x024 HandleContentionEvent+0 x028 DebugInfo +0 x02cExtraInfoPages+0 x030 FirstFree +0 x034LastFree +0 x038NextHandleNeedingPool +0 x03cHandleCount+0 x040 Flags+0 x040 Stri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pspCidTAble 完全 解读

限制150内