免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 深度分析windows句柄分配

深度分析windows句柄分配

时间:2012-02-14 17:01来源:未知 整理:寂涯网络 点击:

对象管理器是一个用于创建、删除、保护和跟踪对象的执行体组件,在对象 与对象结构体之间起着桥梁作用。Ring3级应用程序只有通过对象标识才能访问 到系统资源,句柄类型已经成为除整型、string类型之外最常见的变量类型。但至今句柄类型的精确格式Microsoft并没给出任何官方文档。因此,对象标识符可以视为数量id、特殊位图格式甚至是传统指针等。其主要原因是没有与句柄相关的服务或者api函数可利用到句柄值特性。理论上,仅对象管理器会对对象id的布局感兴趣,因为其负责执行句柄与对象之间的翻译工作,即如何从句柄值映射到具体对象上。Windows内核的其它部分若需要访问这些对象,必须借助对象 管理器提供的公共接口,即以“Ob”为前缀的内核导出函数方式进行访问,如 nt! 0匕尺6亡6『61^6013』_6^8711&1^16或者1^ ! ObDereferenceObject.虽然如此,但可 能更多读者对特殊句柄值格式以及句柄分配算法感兴趣。如在整个系统会话过程 中句柄分配与释放的内部实现等,这些对”1^(^8底层程序开发者更为受用,这 些原理或许可帮助他们利用句柄使用、释放漏洞控制系统/主机特定资源的数值类型等。
句柄格式与作用域
Windows句柄值与处理器数据数据宽度一致,即32bit的系统占32bit,64bit 系统占64bit。这些值都作为句柄表的索引管理,典型的32-1^1句柄值如图1所示。
Image 1. Standard Windows 32-bit handle bit layout
Extra bits, can be used by a win32 developer
句柄值的每部分含义解析:
a)内核句柄标识——用户模式下进程无法访问,是受系统范围保护的句柄。
(2)句柄实体——句柄表中的索引值,这部分内容值不能为0,即最小值为014.
(3)额外bit位——保留给程序开发者使用,保留tw0 “化的额外信息可参考町1^(^8内 核研究资源及其公共头如表1所示。
Listing 1: Background information about the custom-defined bits attached toahandle value
\base\ntos\inc\ex.h:
#define HANDLE_VALUE_INC 4 // Amount to increment the Value to get to the next handle
ntdef.h:
//
// Low order two bits of a handle are ignored by the system and available // for use by application code as tag bits. The remaining bits are opaque // and used to store a serial number and table index,
#define OBJ HANDLE TAGBITS 0x00000003L
Raymond Chen^EThe Old New Thing blog上详细分析了额外的两比特内容在内核句柄 中的作用,可参考(WWW.jybase.net/b/oldnewthing/archive/2008/08/27/8898863 .aspx, ^archive/2008/08/28/8902173. aspx, ^archive/2008/08/29/8904342. aspx.句 柄表由一组结构体列表组成(句柄描述符),其中也包含使用此表先前打开的对象指针。尽
管表结构是三层级方式实现,但缺省下只使用第1级,而后随着进程请求的句柄对象增加, 而引入其它层级。每个进程都拥有一个句柄表且仅有一个,整个机制非常类似工86虚拟内存 分页管理,即借助三级页表管理内存地址的映射。同样,虚拟地址015化00000在两个进程的 上下文内并不会指向同一个物理内存地址,而且0110句柄也不会访问到相同的系统资源。当 然,也存在一'些特例,如的!?800^^^1316和 nt!ObpKernelHandleTable. ?8。0^虹&1316虽然 是一个句柄表,其格式与普通的句柄表也是完全一样的,但它与每个进程私有的句柄表存在 一定差异,如下:
(1)pspcidtable是一个独立的句柄表,而每个进程私有句柄表则通过一个双链表即 Handletablelisthead建立连接,不属于任何进程;
(2)pspcidtable中存放的对象是系统中所有的进程和线程对象,其索引即pid和tid;
(3)pspcidtable中存放的直接是对象体氓?如0£33和£1^^仙),而每个进程的私有句柄 表则存放的是对象头(OBJECT_HEADER)。8旰10和110分别是£?肋0£33和£1观£仙对象 ?8卩01虹&1316这个句柄表中的索引。
表2的代码片段给出了系统内核为新创建的应用程序分配进程和线程0)的具体方式:
Listing 2: Assigning newThreadand Process IDs tothe newlycreated execution items
\base\ntos\ps\create.c;
Thread->Cid.UniqueProcess = Process->UniqueProcessId;
CidEntry.Object = Thread;
CidEntry.Granted&ccess = 0;
Thread->Cid.UniqueThread = ExCreateHandle (PspCidTatole,
11 Create the process ID
if
CidEntry.Object = Process;
CidEntxy.GrantedAccess = 0;
Process->UniqueProcessId = ExCreateHandle {PspCidTatole, if (Process->UniqueProcessId = HDMi)~{
StatUS = STATUS_mSUFFICIENT_RESOURCES ; goto exit_and_deref;

本页地址 http://www.jybase.net/biancheng/20120214771.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com