内核——全局句柄表

实验环境:win7 x32

首先引入一段基础概念;

  • 1.在windows下所有的资源都是用对象的方式进行管理的(文件、进程、设备等都是对象),当要访问一个对象时,如打开一个文件,系统就会创建一个对象句柄,通过这个句柄可以对这个文件进行各种操作。
  • 2.句柄和对象的联系是通过句柄表来进行的,准确来说一个句柄就是它所对应的对象在句柄表中的索引。
  • 3.通过句柄可以在句柄表中找到对象的指针,通过指针就可以对,对象进行操作。

PspCidTable 就是这样的一种表(内核句柄表),表的内部存放的是进程EPROCESS线程ETHREAD的内核对象,并通过进程PID线程TID进行索引,ID号以4递增。

首先第一步先要得到PspCidTable内存地址,在windbg中输入dp PspCidTable即可得到,如果在程序中则是调用MmGetSystemRoutineAddress取PsLookupProcessByProcessId函数里面的PspCidTable

PspCidTable是一个_HANDLE_TALBE结构,当新建一个进程时,对应的会在PspCidTable存在一个该进程和线程对应的HANDLE_TABLE_ENTRY项。在windows10中依然采用动态扩展的方法,当句柄数少的时候就采用下层表,多的时候才启用中层表或上层表。 

最重要的字段是:TableCode,当这个字段值的低2位,决定了有几层表,如果0x9c29c001,低2位是0,就代表只有一层,0x9c29c000指向的就是最终的全局句柄表,如果0x9c29c001,低2位是1,就代表只有两层,0x9c29c000指向下一层表,然后下一层表才指向最终的全局句柄表,那么0x9c29c002同理,最多只能有3层表

需要注意的是,每次层表的大小是4k(4096),除了最终的全局句柄表的每一项是8字节,其他上层表每项都是4字节大小,假如只有一层,那么可以存放的句柄:4096 / 8 = 512项,而一般我们的PC不可能只有512个句柄,所以基本但是两层以上,即:(4096 / 4)*(4096 / 8) = 524288项。比如我的物理机就是69000多项。

根据TableCode的值,可以推断有两层,Windbg查看下一层:dp 0x9c29c000

可以看到这个上层表(1024项),只用到了2项(虚拟机Win7 x32),我们以“x32dbg”为例,pid:3636,3636 / 4 = 909(全局句柄表索引),通过上图,我们知道有2张表(每张表512项),而909项明显在第二张表里面,那么它在第二张表的具体索引是:909 - 512 = 397(0x18D),

那么dt _handle_table_entry 9c2a0000 +0x18D*8,其中最重要的字段:Object,同样该字段的最低位是属性位(去掉)。因为我们前面是找的x32dbg的pid,所以这里可以直接用EPROCESS结构解释。

 

如果,我们不知道这个id到底是进程的还是线程的怎么办?

其实,dt _handle_table_entry 9c2a0000 +0x18D*8,其中最重要的字段:Object,其真实结构是指向_OBJECT_HEADER的Body字段,但这个结构里面TypeIndex字段描述着这个Object究竟是进程还是线程。

 所以,dt _OBJECT_HEADER 0x8766d030 - 0x18 ,就指向了_OBJECT_HEADER的首地址

 可以看到TypeIndex字段的值是0x7,它其实也是一个表的索引,这个表就表示这个值是进程还是线程还是其他,我们 dp ObTypeIndexTable

继续用 dt _object_type  86ad8e38,解析它,可以看到name字段指明它是进程还是线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows系统类似于linux的nohup命令后台启动jar服务

一、首先新建一个后缀名为.bat文件 二、将jar包放在与jar包同一个路径下 三、编写.bat文件 echo off start javaw -Xms512m -Xmx1024m -XX:PermSize256m -XX:MaxPermSize512m -XX:MaxNewSize512m -jar xxxxx-22900.jar >> StartupLog.log 2>&1 & exit 四…

PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置

在工作中,碰到PC端类似聊天框,鼠标向上滚动,触顶时分页获取数据;但是将接口获得的数据连接到循环数组数据前面时,由于数据变化,滚动条会直接滚动到最顶端,显然这个效果不友好。最好的效果就是&a…

随着飞行汽车的亮相,在环保方面有什么保护措施吗

飞行汽车具备环保潜力,采用电动或混合动力系统减少污染,并拓展应用场景。多家企业布局,沃飞长空作为国内eVTOL(电动垂直起降航空器)研发的领先企业,在环保这一点做的非常到位,AE200采用纯电动力系统,零碳排放,静默飞行…

【Excel】常用公式记录

这里写自定义目录标题 根据身份证号获取年龄 根据身份证号获取年龄 替换公式中的 A2 TEXT(SUMPRODUCT(DATEDIF(TEXT(IF(LEN(A2)15,19,0)&MID(A2,7,LEN(A2)/2-1),“#0-00-00”),NOW(),{“y”,“ym”,“md”})*{10000,100,1}),“00岁零00个月零00天”)

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 云直播服务-》鉴权直播 -》播放 ,左键单击可以拉取矩形框,放大选中…

Android笔记(三十一):Deeplink失效问题

背景 通过deeplink启动应用之后,没关闭应用的情况下,再次使用deeplink会失效的问题,是系统bug导致的。此bug仅在某些设备(Nexus 5X)上重现,launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…

人工智能能改变哪些行业?深入分析应用场景与前景

人工智能(AI)技术的发展历程可追溯到20世纪50年代。最初,AI的概念是由计算机科学家阿兰图灵提出的,他设想了一种能够模拟人类思维的机器。随后,在1956年的达特茅斯会议上,人工智能作为一门独立学科正式诞生…

【缓存与加速技术实践】Redis数据类型

文章目录 Redis 数据类型String 数据类型List 数据类型Hash 数据类型Set 数据类型Sorted Set 数据类型 Redis 数据类型 Redis支持五种主要的数据类型: String(字符串)、List(列表)、Hash(散列)…

【java】以<内存图>的形式理解数组的增删

数组 数组在内存里地址连续 定义一个数组,数组中的数据类型一样(二进制串位数相同),故可以直接通过下标获取数组中的内容。 基本类型存的是值,引用类型存的是地址 数组的下标从0开始。 初始值: Int :0 char &am…

Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置

在开始开发 Swift 应用之前,了解 Swift 语言的背景和设置开发环境非常重要。接下来,我们将逐步介绍 Swift 的基本概念,并带你完成开发环境的安装和项目创建。 1.1 Swift 简介 Swift 是由 Apple 开发的一种现代化编程语言,于 201…

时代变了!Megabit兆比特英伟达纳入道琼斯指数,英特尔被取代

△英特尔VS英伟达市值对比(截至今年2月) 最新消息,英伟达将在2024年11月8日替代英特尔成为道琼斯工业平均指数的组成成员。 Megabit兆比特自成立以来,Megabit凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 这是历史最悠久的美…

算法竞赛(Python)-大事化小,小事化了(分治)

文章目录 前言一、数乘型分治1 疯狂的细胞分裂 二 矩阵乘法的分治1 神秘数字 三 、线性结构问题的分治1 自助餐厅(1)2 自助餐厅(2) 四 、树形结构的分治1 二叉树的最大深度 前言 分治思想:将一个大问题分词几个小问题&…

React.js教程:从JSX到Redux的全面解析

文章目录 介绍react脚手架jsx语法和react组件jsx的基本语法jsx的行内样式jsx的类名classNameif条件渲染map循环渲染创建组件方法 可视区渲染 (React- virtualized)React-redux 介绍 javascript库,起源于Facebook的内部项目,类似于vue特点 声明式组件化 …

使用Jupyter Notebook进行数据科学项目

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

在校大学生考了个PMP证书

作为一个大学生,大学生活其实还是蛮充实的,尤其是现在大环境不好,很多同学都会趁着在校期间多考几个证书,多去大厂实习攒经验啥的,我也不例外。 偶然了解到PMP这个证书跟我毕业之后的工作有关系,这不&…

21、基于AT89C52的电子密码锁proteus仿真设计

一、仿真原理图: 二、仿真效果: 三、相关代码: 1、定时中断: void Time0(void ) interrupt 1 using 1 { count++; if(count == 50) { count = 0; buffer = keyScan(); if(buffer < 16) { value[index++…

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier, @Styles

【HarmonyOS】鸿蒙应用设置控件通用样式AttributeModifier&#xff0c; Styles 前言 在鸿蒙中UI开发经常需要对控件样式进行统一的封装&#xff0c;在API早前版本&#xff0c;一般是通过 Styles进行样式封装复用&#xff1a; Entry Component struct Index {build() {Column(…

【MySQL】可重复读级别下基于Next Key Lock解决幻读

昨天读到了一篇文章[1]&#xff0c;里面讲&#xff0c;面试官说mysql的可重复读级别下有解决幻读的方式&#xff0c;最后公布了答案&#xff0c;是在sql后面加for update。这么说倒是没错&#xff0c;但是这种问法给我一种奇怪的感觉&#xff0c;因为for update无论在哪个隔离级…

vite项目弹窗,抽屉,上传图片,富文本框

一、调整目录 删除一些初始化的默认文件 删除剩余代码内容&#xff0c; 新增调整需要的目录结构&#xff08;utils,api,stores,views,router&#xff09; 拷贝全局样式和图片&#xff0c;安装预处理器支持 二、路由初始化 1.创建路由实例由createRouter实现 2.路由模式&…

Mybatis学习笔记(三)

十、MyBatis的逆向工程 (一)逆向工程介绍 MyBatis的一个主要的特点就是需要程序员自己编写sql&#xff0c;那么如果表太多的话&#xff0c;难免会很麻烦&#xff0c;所以mybatis官方提供了一个逆向工程&#xff0c;可以针对单表自动生成mybatis执行所需要的代码&#xff08;包…