《Windows核心编程》第3章——深入理解handle
本文借助windbg来理解程序中的函数如何使用handle对句柄表进行查询的。所以先要开启Win7下Windbg的内和调试功能。
- 解决win7下内核调试的问题
重启之后开启Local Kernel Debugging:


开启成功:

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

- 解决windbg源码调试的问题:
添加源文件路径:

开启源码级别的调试:



- 研究句柄
再开一个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):
那么句柄值乘以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):

- handle的类型

- 为什么要除以4?



这个 TagBit 值占两位(bit 0 到 bit 1),被清为 0 值。因此:tHandle.Value 值就是对齐在 4 bytes 边界上。(出于某种原因)使用高30位作为索引来查找句柄表,低两位的存在没有意义。参考:https://www.cnblogs.com/ck1020/p/5897460.html
现在低两位没有意义不代表将来低两位没有意义,handle的含义和使用可能在未来发生变化。
《Windows核心编程》第3章——深入理解handle的更多相关文章
- windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...
- windows核心编程 第5章job lab示例程序 解决小技巧
看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里” 用process explorer程序查看 ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程 第十七章 -内存映射文件(上)
第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...
- Windows核心编程 第六章 线程基础知识 (上)
第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...
- Windows核心编程 第四章 进程(上)
第4章 进 程 本章介绍系统如何管理所有正在运行的应用程序.首先讲述什么是进程,以及系统如何创建进程内核对象,以便管理每个进程.然后将说明如何使用相关的内核对象来对进程进行操作.接着,要介绍进 ...
- Windows核心编程 第三章 内核对象
第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...
- windows核心编程---第四章 进程
上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构.操作系统内核通过 ...
- Windows核心编程 第27章 硬件输入模型和局部输入状态
第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...
- Windows核心编程 第十七章 -内存映射文件(下)
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...
随机推荐
- uniDAC 7.2.14直联sqlite存在问题
用最新的uniDAC 7.2.14,设置Direct=True,直联sqlite数据库,发现Release状态下出错,Debug没有问题. 改成Direct=False,则没有问题. 警告! 各 ...
- centos安装pip扩展包
1.安装 epel-release扩展yum源# yum install -y epel-release# yum clean all# yum makecache2.安装setuptools# yu ...
- 2019-03-14-day010-函数进阶
昨日回顾 1.函数: 函数的定义 函数的参数 位置参数 关键字参数 混合参数 形参的位置上(默认参数) 实参的位置上(关键字参数) 位置参数 > 默认参数 三元运算符: c = a if a&g ...
- java学习笔记20(Arraylist复习,Collection接口方法,迭代器,增强型for循环)
集合:集合是Java提供的一种容器,可以用来存储多个数据: 集合与数组的区别:集合的长度是可变的,数组的长度是固定的 集合中存储的数据必须是引用类型数据: ArrayList回顾: public cl ...
- Python 区分方法和函数
def func(): print("我是函数") class Foo: def chi(self): print("我是吃") # print(func) # ...
- HDU 6045 17多校2 Is Derek lying?
题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6045 Time Limit: 3000/1000 MS (Java/Others) Memory ...
- SQL注入之Sqli-labs系列第十五关和第十六关(基于POST的时间盲注)
开始挑战第十五关(Blind- Boolian Based- String)和 第十六关(Blind- Time Based- Double quotes- String) 访问地址,输入报错语句 ' ...
- JavaScript条件语句4--分支语句--if
JavaScript条件语句--分支语句 学习目标 1.掌握条件语句if 2.掌握prompt()的应用 3.掌握alert的应用 If语句 语法一: If(condition){ statement ...
- NHibernate many-to-one映射
many-to-one 数据方面,多条对一条. 非主键字段与主键字段的关联,在类中实现了一对一的单向映射.在类中是单实体映射. 订单充值业务.显然,一单位可以有多个充值信息. 通过表 Deposit里 ...
- Elasticsearch基本用法(2)--Spring Data Elasticsearch
Spring Data Elasticsearch是Spring Data项目下的一个子模块. 查看 Spring Data的官网:http://projects.spring.io/spring-d ...