文章目录

  • 私有句柄表
    • 1.什么是句柄(内核对象)
    • 2.为什么要有句柄?
    • Windows设计理念:
    • 3.句柄表在哪?
  • 全局句柄表
  • 注意

私有句柄表

1.什么是句柄(内核对象)

当一个进程创建或者打开一个内核对象时,将获得一个句柄,通过这个句柄可以访问内核对象
(注意:这里所说的句柄往往对应一个内核对象,调用窗口相关的函数时,也会得到所谓的句柄,但是那种句柄和这里所说的句柄是两回事,这里所说的句柄一定对应一个内核对象,而且这个内核对象其实也就是一个结构体,在0环才能够进行读写的。并非普通窗口,笔刷,字体等对象的句柄,这种对象我们通常称为用户对象,并非内核对象)
如:
HANDLE g_hMutex=::CreateMutex(NULL,FALSE,“XYZ”)
HANDLE g_hMutex=::OpenMutex(MUTEX_ALL_ACCESS,FALSE,“XYZ”)
HANDLE g_hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL)
HANDLE g_hThread=::CreateThread(NULL,0,NULL,0,NULL)

2.为什么要有句柄?

句柄存在的目的是为了避免在应用层直接修改内核对象
HANDLE g_hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL)
如果g_hEvent存储的就是EVENT内核对象的地址,那么就意味着我们可以在应用层修改这个地址,一旦指向了无效的内核内存地址就会蓝屏

如果我们在3环访问一个无效地址,那么最多也就是程序退出。

Windows设计理念:

1.隐藏内核对象指针
2.句柄就是个索引
(每个进程都有一个的表,用来存放进程创建或者打开(Open并不会创建新的内核对象,而是直接返回这个内核对象的地址,然后在表中创建一个索引值)的内核对象的句柄值,)
然后把这个在0环创建的句柄表中的索引值,返回给3环去使用。

3.句柄表在哪?

dt _EPROCESS
+0x0c4 ObjectTable :_HANDLE_TABLE

dt _HANDLE_TABLE
+0x000 TableCode (句柄表地址)
+0x004 QuotaProcess
+0x008 UniqueProcessId
+0x00c HandleTableLock
+0x01c HandleTableList

实际测试:

运行结果

找到当前进程EPROCESS中的_HANDLE_TABLE

然后查看TableCode

684是个索引,需要用684/4=1A1(因为是以4为单位的(为了这个函数保证在其它情况下能用)),但句柄表里的句柄成员每个是8字节,

算法也就是 0xe1cf6000+1A1*8

如下图,转换为8个字节为一组的句柄表值

(因为是使用打开的方式并非使用创建的方式,所以内核对象都是同一个,所以地址都一样)
下面接下来解释一下,3环的函数对句柄表中表项的操作

(1)这一块共两个字节,低字节保留位恒为0,高字节是给SetHandleInformation这个函数用的,比如写成函数SetHandleInformation(Handle,HANDLE_FLAG_PROTECT_FROM_CLOSE,HANDLE_FLAG_PROTECT_FROM_CLOSE),那么这个位置将会被写入0x02;
HANDLE_FLAG_PROTECT_FROM_CLOSE宏的值为0x00000002,取最低字节,最终(1)这块是0x0200

(2)这块是访问掩码,是给OpenProcess这个函数用的
OpenProcess(dwDesiredAccess,BInheritHandle,dwProcessId);具体的存的就是这个函数的第一个参数的值

(3)和(4)这两块共计四个字节,其中bit0-bit2存的是这个句柄的属性,其中bit2 bit0 默认为0,1;bit1表示的函数是该句柄是否可继承;OpenProcess的第二个参数与bit1有关;
bit31-bit3则是存放的该内核对象在内核中的具体的地址

真正的内核对象都是以OBJECT_HEADER开头的,也就是说,以前我们所看到的EPROCESS,ETHREAD都不是完整的内核对象,而是需要再加0x18的OBJECT_HEADER的头

句柄表中指向的内核进程对象(即EPROCESS)的值,把低三位清掉,即0x86050d48,这个地址指向的是有0x18的OBJECT_HEADER头的EPROCESS内核对象。因为程序中是OpenProcess,所以是EPROCESS内核对象

0x174偏移是进程名,毫无疑问,正确

提示:利用句柄表可以做出反调试,扫描全部进程的句柄表,观察句柄表中是否有指向此进程的EPROCESS内核对象的地址,有的话那就说明此进程被打开(正在被调试。。)

全局句柄表

1.所有的进程和线程无论是否打开,都在这个表中。
2.每个进程和线程都有一个唯一的编号:PID和CID,这两个值其实就是全局句柄表中的索引,

进程和线程得到查询,主要是以下三个函数,按照给定的PID和CID从PspCidTable从查找响应的进线程对象:

PsLookupProcessThreadByCid()
PsLookupProcessProcessId()
PsLookupThreadByThreadId()

句柄表结构

如果为1级句柄表的话,那么TableCode低2位为0((4KB)个数最多512个)

如果为2级句柄表的话,那么TableCode低2位为1(第一级存储的都是一个地址,也就是第一级可以存储1024个地址,第二级存储真正句柄信息,也就是可以存1024X512个)

如果为3级句柄表的话,那么TableCode低2位为2(第一级存储的都是一个地址,第二级存储的都是一个地址,第三级存储真正句柄信息,句柄数量也就是1024X1024X512个)

首先通过全局变量PspCidTable查找全局句柄表

然后通过_HANDLE_TABLE查看

找到了TableCode后直接进入

然后假如PID是1044
那么1044/4=261,索引也就是261,转换成16进制后是0x105
然后0x105乘以8


值为0x86201781,去掉低3位为0x86201780,它直接指向了EPROCESS,没有OBJECT_HEADER头结构

注意

全局句柄表和私有句柄表有差异,私有句柄表中指向的是带有OBJECT_HEADER头的内核对象,但是全局句柄表中指向的并没有带OBJECT_HEADER头

私有句柄表(内核对象,并非用户对象),全局句柄表相关推荐

  1. Windows句柄表学习笔记 —— 句柄表全局句柄表

    Windows句柄表学习笔记 -- 句柄表&全局句柄表 句柄表 实验一:在WinDbg中查看句柄表 第一步:打开一个Win32窗口程序 第二步:编译并运行以下代码 第三步:查看运行结果 第四步 ...

  2. 进程句柄表初始化,扩展,插入删除句柄源码分析

    一.为什么要有句柄 句柄是一个8字节的结构体,用途是指向内核对象.3环程序无法通过地址直接访问内核对象,所以需要用句柄来间接访问. 本文重点介绍句柄表,句柄本身则留到下一篇博客介绍.但因为接下来介绍句 ...

  3. (66)全局句柄表,遍历全局句柄表

    一.回顾 前面的课程我们学习了进程的句柄表,全局句柄表和进程句柄表非常像,只有一些小区别. 这节课的课后作业我先给出来: 编写程序,通过全局句柄表PsdCidTable,遍历所有进程(包括隐藏进程). ...

  4. 达梦数据库删除用户_DM 达梦数据库 删除表空间 [-3412]:试图删除已经使用的表空间. 错误 处理方法...

    达梦数据库drop 表空间时报如下错误: [dave@www.cndba.cn ~]$ disql SYSDBA/SYSDBA@127.0.0.1:6236 服务器[127.0.0.1:6236]:处 ...

  5. windows 获取当前进程/线程的ID、句柄和内核地址

    获取当前进程 / 线程的 ID .句柄和内核地址 在用户态( RING3 )和内核态( RING0 )下,获取这些值的函数是不同的,而且这些函数的实现原理也是不同的,下面做个小结: 1. 用户态( R ...

  6. Oracle常用数据字典表 Oracle常用数据字典表 查看当前用户的缺省表空间

    Oracle常用数据字典表 Oracle常用数据字典表 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; ...

  7. 命令行使用mysql创建表空间_达梦命令行创建表空间

    1.2命令方式创建 到数据库安装目录   cd /home/dmdba/bin 执行创建数据库实例的命令: ./dminit  path=/home/dmdba/data db_name=数据库名 i ...

  8. matlab可以对多张表同时操作吗,update操作多张表

    sql 语句多张表UPDATE用法 一.当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰.飞.飞Asp技术乐园 并且要注意, ...

  9. php中 如何制作报名表,如何在问卷网上制作一份报名表?

    在 用户登录 进入表单编辑页面,从常用题型与更多题型中选择题型,可单击或拖拽题型以添加题目,可添加的题型有:单选题.多选题.图片选择题.文字投票题.图片投票题.填空题.姓名题.手机题.邮箱题.地址题. ...

最新文章

  1. 假如计算机是中国人发明的,那代码应该这么写
  2. idea provided和compile区别
  3. python能做什么游戏ll-是Python的语法LL(1)吗?
  4. 注释和简单用户交互程序
  5. 使用Bean验证扩展PrimeFaces CSV
  6. 有人说智能制造装备前景大好,那么智能制造装备产业园的潜力如何?
  7. 华为郑叶来:致敬开发者,共创“ AI ”的世界
  8. 惠普企业(HPE)是否免不了最终被关停的命?
  9. Docker for mac安装教程及国内镜像加速器配置
  10. 【全志A64/R18】Android平台获取Chip ID
  11. MATLAB-非线性回归
  12. 用户认证授权系统方案思考
  13. learning psychology
  14. CAD中怎么旋转箭头符号?
  15. 51单片机开发实例 基于51单片机的万年历
  16. 判断三角形 java_java中判断是否三角形的方法
  17. 【Git】使用git上传代码到gitee
  18. 疯狂java学习笔记三
  19. dos bat批处理的魅力 批处理读取文本中的每一行 操作文件
  20. NGS测序嵌合体是个需要去除的错误扩增序列

热门文章

  1. 成功解决 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”
  2. 成功解决Docker Desktop requires Windows 10 Pro or Enterprise version 15063 to run.
  3. 成功解决ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device
  4. 成功解决Building wheels for collected packages: dlib Running setup.py bdist_wheel for dlib ... error
  5. 集成学习-Boosting集成学习算法LightGBM
  6. TensorFlowIO操作(一)----线程和队列
  7. 在博文顶部添加文章字数及阅读时间信息:阅读本文需要xx分钟
  8. ASP.NET Core 1.1 Preview 1 简介(包含.NETCore 1.1升级公告)
  9. FORMS变量类型和消息提示
  10. Win32环境下两种用于C++的线程同步类(上)