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

当前位置: 主页 > 系统综合 > 各类编程 > 讲讲句柄与系统内核对象

讲讲句柄与系统内核对象

时间:2011-12-08 13:25来源:未知 整理:寂涯网络 点击:

 

  对象找个词对于大家来说想必是耳熟能详了吧。对象的具体定义是:“一个或者一组数
据结构和定义其上的若干操作”。既然对象是数据结构和操作,那么有内核对象(存在内核
空间),和用户对象(存在用户空间)。当然,我们关心的是内核对象。内核对象可以让用户
通过系统调用来操作是有必要的,但是内核对象只是在内核空间中的一堆数据,在 R3 中如
何定位对象呢?答案就是句柄。通俗的说句柄就是在R3的程序中联系内核对象的一个数值。
在 R3 下编程中,经常会用到各种对象,如:文件对象、符号对象、事件对象、文件映射对
象等等。对于这些对象,在操作对象之前,必然是通过API 函数先打开或者创建,这些函数
都会返回个值,在 R3 中我们叫做句柄,在对这些对象执行具体操作的时候,就用句柄来指
定目标对象。如文件对象,就要用到CreateFileW函数创建文件对象,并且返回句柄,在读
写文件的时候,传入文件句柄就可以让系统知道操作的文件了。同时,在 R3 的程序中,句
柄只是在本程序是唯一的,在全局并不是唯一的。所以,2 个进程可以有同一个句柄值,但
是它们可能指向不同的对象。
  既然我们知道通过句柄可以找到内核对象,那么系统是如何实现的呢?今天我通过一个 

小程序带大家了解句柄表和对象的关系,这个程序可以遍历指定进程的句柄指向的对象,并
且输出该对象的重要信息,在此过程中除了调用PsGetProcessbyProcessId和DbgPrint外,
将不调用其他任何函数。
 XP 系统中,每个进程都有个句柄表,保存本进程的对象指针。而句柄则是对象在句柄
表的索引值。先来说句柄表。在 XP 系统中,句柄表是动态的,最多可以扩展至三级。每级
表是 4KB 的大小。一级表是HANDLE_TABLE_ENTRY结构的数组,HANDLE_TABLE_ENTRY结构大
小是 8字节,当一级表满,系统就创建二级表,表中每个ULONG数是一级表的指针,当二级
表满,就创建三级表,表中每个ULONG 数是一个二级表的指针。
  如何获得句柄表的地址呢?在 EPROCESS 结构中,有个数据成员 ObjectTable 指向
HANDLE_TABLE结构。我们看看 HANDLE_TABLE结构:

其中 TableCode这个数据保存句柄表地址的相关信息,得到TableCode的代码如下: 

[code]
status=PsLookupProcessByProcessId((HANDLE)pid,&epr);   //得到进程的
eprocess
  if(!NT_SUCCESS(status))
 {
  DbgPrint("get erpocess is error\n");
   return;
 }
 DbgPrint("the eprocess is %x\n",epr);
 handltable=(PHANDLE_TABLE)*(int *)((PUCHAR)epr+0xc4);
  //TableCode在eprocess中的偏移是0xc4
[/code]

由于系统在创建一个新的 HANDLE_TABLE_ENTRY 的时候,总是在句柄表的前面找空位置插入
(如果没有,则在尾部插入),所以句柄的值大致是连续的。我们可以 0 为起始句柄,4 为
步进来暴力搜索(WINDOWS规定句柄以4为步进),也只有这样才能遍历所有句柄。

[code]
for(handle=0;(tableentry=GetTableEntryByHandle(handltable,handle))!=NULL;ha
ndle=(HANDLE)((ULONG)handle+4))
[/code]

下面,我们来看看如何根据句柄在句柄表中定位HANDLE_TALBE_ENTRY结构。
首先,要根据 TableCode 的低 2 位判读该句柄表是几级句柄表,然后将 TableCode 的低 2
位置 0作为句柄表的地址,然后根据句柄的值定位HANDLE_TABLE_ENTRY。
对于句柄值:
低 2位无用,因为windows规定句柄是以4步进的
第 3 位至第11位表示在一级表中的索引
第 12位至第21位表示在二级表中的索引
第 22为至第30位为表示在三级表中的索引
第 32 位表示该句柄是内核句柄(这里的内核句柄是指由系统初始化创建的句柄,在用户程
序不存在的)。
具体代码如下:

[code]
ULONG leave;
  ULONG tablebase;
 PHANDLE_TABLE_ENTRY entry;
 ULONG i,j;
 i=j=0;
  if (!((ULONG)handle & 0x7fc))   //由于一级表的第一个
HANDLE_TABLE_ENTRY项为0,所以句柄的第三位至第11位为0,就直接返回-1。表示无效
句柄
 {

return (PHANDLE_TABLE_ENTRY)-1;

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

百度搜索更多

谷歌搜索更多

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

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


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

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