《Windows核心编程》第3章——深入理解handle

2023-05-16

本文借助windbg来理解程序中的函数如何使用handle对句柄表进行查询的。所以先要开启Win7下Windbg的内和调试功能。

  • 解决win7下内核调试的问题
win7下debug默认无法进行内核调试(!process等命令无法使用),除非是双机调试。或改用livekd进行调试。
尝试 http://blog.csdn.net/hutao1101175783/article/details/50522767中提出的方法,开启windbg的内和调试功能:

重启之后开启Local Kernel Debugging:

开启成功:

加载符号表之后,就可以使用!process命令了:

 

  • 解决windbg源码调试的问题:

 添加源文件路径:

 

开启源码级别的调试:

给TestHandle.exe的main函数下断点:
运行后自动弹出源码调试:

 

  • 研究句柄 

 再开一个windbg用内核调试。!process 0 0 命令找到TestHandle.exe的信息:

查看这个进程的所有句柄信息(同时也显示出了OBJECT的信息,来给我们提供验证):

 

下面,借助对TestHandle.exe的调试我们知道38号句柄是hEvent:

查看0x38号句柄的信息(这个信息被我当做“结果”来验证我的“推理”过程):

  • 推理步骤

 查看TestHandle的EProcess结构:

 

得到TableCode,这个值指向一级、二级或三级句柄表(具体是几级句柄表由末尾数决定):

 

根据低两位判断句柄表的层级。TableCode低位是1,说明是一个二级句柄表(可以参考这个文章的分析:https://www.cnblogs.com/lsh123/p/7296423.html):

 
这里显示了两个一级句柄表
不同级别的句柄表可以参考文章: https://www.2cto.com/kf/201609/543902.html
和图:

那么句柄值乘以4再加上fffff8a0`19ca8000就是指向对应的handle_table_entry://为什么这里要乘以4?句柄是0x38,索引就是0x38/4,又由于每个handle_table_entry的大小是16字节。那么为什么索引是0x38/4?后面会回答

 找到对应的handle_table_entry:

其中fffffa80`11399951 就是Object指针,偏移0x30-1就可以定位到OBJECT:

 

因为是在64位系统下,所以偏移是0x30-1,偏移发生了变化(32位系统下就是0x17):

这样就通过句柄取到了内核对象,整个流程思路参考了: http://www.cppblog.com/sleepwom/archive/2011/10/19/72591.html
并参考了图片:

 

  •  handle的类型

 

在WinNT.h中定义的handle是这样的:
typedef void* handle;

 

而DECLARE_HANDLE(HWND);就是:
  struct HWND__ { int unused;};
  typedef struct HWND__ *HWND;
所以DECLARE_HANDLE的作用就是将name定义为一个指向结构体的指针。
handle是一个无类型指针,而HWND是一个指向结构体的指针。
Handle是一个void存储着一个整形数据类型作为“伪索引”。
参考: https://www.cnblogs.com/zpcdbky/p/4656449.html
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380143fd3d1027fa3c215cc79051a0071e4cf6678475886d27b135bfc1541baae6b272a4266e4dd93d957deb0902f248b2631701c844213d719a9c84524c627935ee3aa04f3ffad72c5a1888083020d9d44050bc2b4d60156&p=c449ca5f86cc41ac52a5d02d021494&newp=81798f16d9c111a058ee9e124f43c9231610db2151d4d2116b82c825d7331b001c3bbfb423251007d7c07d6304aa4858eff6357033092ba3dda5c91d9fb4c57479&user=baidu&fm=sc&query=handle+pvoid&qid=b9f8680100001e9b&p1=5
 
  • 为什么要除以4?
如果要根据句柄查找相应的handle_table_entry,就会调用这个函数:
ExMapHandleToPointer ( __in PHANDLE_TABLE HandleTable, __in HANDLE Handle )

 

这里的handle就是我们本例中传入的0x38。ExMapHandleToPointer 中又会调用ExpLookupHandleTableEntry。
在使用句柄去查找进程的句柄表时会调用函数ExpLookupHandleTableEntry,其原型如下:

 

参数 HandleTable 是查找目标所在的 Handle table 地址,而 tHandle 是结构化的 Handle 值。参考: http://www.mamicode.com/info-detail-1539980.html
handle与exhandle的关系如下:
这个 tHandle 结构将 Handle 值分为几个部分,如下图所示:

 

这个 TagBit 值占两位(bit 0 到 bit 1),被清为 0 值。因此:tHandle.Value 值就是对齐在 4 bytes 边界上。(出于某种原因)使用高30位作为索引来查找句柄表,低两位的存在没有意义。参考:https://www.cnblogs.com/ck1020/p/5897460.html

 现在低两位没有意义不代表将来低两位没有意义,handle的含义和使用可能在未来发生变化。

 

转载于:https://www.cnblogs.com/predator-wang/p/8468563.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Windows核心编程》第3章——深入理解handle 的相关文章

随机推荐

  • 性能实战分析-问题分析(三)

    问题四 xff1a 数据库连接池不释放 搭e6mall需要使用tomcat7搭建 过程 xff1a 压测一个商品的详情页请求 xff0c 看看报错如何 xff1f 按照上面方法分析 1 先访问tomcat的初始页面 xff0c 可以访问 x
  • 解决Navicat无法连接到MySQL的问题

    解决Navicat无法连接到MySQL的问题 问题一 xff1a 本地IP xff08 xxx xxx xxx xxx xff09 没有访问远程数据库的权限 于是下面开启本地IP xff08 xxx xxx xxx xxx xff09 对远
  • Linux下用于查看系统当前登录用户信息的4种方法

    https www cnblogs com weijiangbao p 7868965 html 转载于 https www cnblogs com wuzm p 11377948 html
  • python学习

    https www cnblogs com dinghanhua tag python default html page 61 2 转载于 https www cnblogs com wuzm p 11381519 html
  • python学习笔记(8)迭代器和生成器

    迭代器 迭代是Python最强大的功能之一 xff0c 是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 xff0c 直到所有的元素被访问完结束 迭代器只能往前不会后退 迭代器有两个基本的
  • 基于立体视觉和GPU加速的视觉里程系统(VINS)

    注意 xff1a 本文只适用于 Kerloud SLAM Indoor无人机产品 Kerloud SLAM Indoor配备有Nvidia TX2模块和Intel Realsense D435i立体摄像头 凭借更强大的GPU内核 xff0c
  • python学习笔记(9)函数(一)

    定义一个函数 你可以定义一个由自己想要功能的函数 xff0c 以下是简单的规则 xff1a 函数代码块以 def 关键词开头 xff0c 后接函数标识符名称和圆括号 任何传入参数和自变量必须放在圆括号中间 xff0c 圆括号之间可以用于定义
  • python学习笔记(10)函数(二)

    xff08 函数的参数 amp 递归函数 xff09 一 函数的参数 Python的函数定义非常简单 xff0c 但灵活度却非常大 除了正常定义的必选参数外 xff0c 还可以使用默认参数 可变参数和关键字参数 xff0c 使得函数定义出来
  • python学习笔记(2)数据类型-字符串

    字符串是 Python 中最常用的数据类型 我们可以使用引号 39 或 34 来创建字符串 创建字符串很简单 xff0c 只要为变量分配一个值即可 例如 xff1a var1 61 39 Hello World 39 var2 61 34
  • python学习笔记(11)文件操作

    一 读文件 读写文件是最常见的IO操作 Python内置了读写文件的函数 xff0c 用法和C是兼容的 读写文件前 xff0c 我们先必须了解一下 xff0c 在磁盘上读写文件的功能都是由操作系统提供的 xff0c 现代操作系统不允许普通的
  • 作业2

    作业2 xff1a 写一个随机产生138开头手机号的程序 1 输入一个数量 xff0c 产生xx条手机号 prefix 61 39 138 39 2 产生的这些手机号不能重复 转载于 https www cnblogs com wuzm p
  • mysql索引详细介绍

    博客 xff1a https blog csdn net tongdanping article details 79878302 E4 B8 89 E3 80 81 E7 B4 A2 E5 BC 95 E7 9A 84 E5 88 86
  • 作业1

    作业一 xff1a 写一个登录的程序 xff0c 1 最多登陆失败3次 2 登录成功 xff0c 提示欢迎xx登录 xff0c 今天的日期是xxx xff0c 程序结束 3 要检验输入是否为空 账号和密码不能为空 4 账号不区分大小写 im
  • 常用的SQL优化

    转自 xff1a https www cnblogs com Cheney222 articles 5876382 html 一 优化 SQL 语句的一般步骤 1 通过 show status 命令了解各种 SQL 的执行频率 MySQL
  • B+tree

    https www cnblogs com nullzx p 8729425 html 简介 xff1a 本文主要介绍了B树和B 43 树的插入 删除操作 写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B 43 树的相关操作 xff
  • Mysql监控调优

    一 Mysql性能介绍 1 什么是Mysql xff1f 它有什么优点 xff1f MySQL是一个关系型数据库管理系统 xff0c 由瑞典MySQL AB公司开发 xff0c 目前属于Oracle公司 MySQL是一种关联数据库管理系统
  • [云讷科技] Kerloud PX4飞控的EKF2程序导航

    一 介绍 EKF拓展卡尔曼滤波器是px4开源飞控框架采用的核心状态估计方法 xff0c EKF2是px4飞控中的对应的软件模块 xff0c 可以支持各类传感器信号 xff0c 包括IMU xff0c 磁感计 xff0c 激光测距仪 xff0
  • 第5.4节 Python函数中的变量及作用域

    一 函数中的变量使用规则 函数执行时 xff0c 使用的全局空间是调用方的全局空间 xff0c 参数及函数使用的局部变量存储在函数单独的局部名字空间内 xff1b 函数的形参在函数中修改了值时 xff0c 并不影响调用方本身的数据 xff0
  • PX4 IO [14] serial [转载]

    PX4 IO 14 serial PX4 IO 14 serial 转载请注明出处 更多笔记请访问我的博客 xff1a merafour blog 163 com 2014
  • 《Windows核心编程》第3章——深入理解handle

    本文借助windbg来理解程序中的函数如何使用handle对句柄表进行查询的 所以先要开启Win7下Windbg的内和调试功能 解决win7下内核调试的问题 win7下debug默认无法进行内核调试 xff08 xff01 process等