Windows 10 X64 内核对象句柄表解析

news2024/5/18 14:27:04

fweWindows 很多API函数都会创建和使用句柄(传入参数),句柄代表一个内核对象的内存地址,每个进程都有一个句柄表,它保存着进程拥有的句柄,内核也有一个句柄表 PspCidTable,它保存着整个系统的句柄。

ExpLookupHandleTableEntry windows内核句柄表结构解析

PAGE:00000001405F93D0 ExpLookupHandleTableEntry proc near     ; CODE XREF: ObpReferenceObjectByHandleWithTag+EA↑p
PAGE:00000001405F93D0                                         ; NtClose+B5↓p ...
PAGE:00000001405F93D0                 mov     eax, [rcx]
PAGE:00000001405F93D2                 and     rdx, 0FFFFFFFFFFFFFFFCh
PAGE:00000001405F93D6                 cmp     rdx, rax        ; 如果pid大于句柄表地址则认为是无效pid
PAGE:00000001405F93D9                 jnb     short loc_1405F9435
PAGE:00000001405F93DB                 mov     r8, [rcx+8]
PAGE:00000001405F93DF                 mov     eax, r8d
PAGE:00000001405F93E2                 and     eax, 3
PAGE:00000001405F93E5                 cmp     eax, 1          ; 低两位表示句柄表层数level
PAGE:00000001405F93E8                 jnz     short loc_1405F9402 ; 判断是否是2级句柄表
PAGE:00000001405F93EA                 mov     rax, rdx        ; rax=进程ID
PAGE:00000001405F93ED                 shr     rax, 0Ah        ; 进程ID右移0xA
PAGE:00000001405F93F1                 and     edx, 3FFh       ; 进程ID & 0x3ff
PAGE:00000001405F93F7                 mov     rax, [r8+rax*8-1]
PAGE:00000001405F93FC                 lea     rax, [rax+rdx*4]
PAGE:00000001405F9400                 retn
PAGE:00000001405F9400 ; ---------------------------------------------------------------------------
PAGE:00000001405F9401                 align 2
PAGE:00000001405F9402
PAGE:00000001405F9402 loc_1405F9402:                          ; CODE XREF: ExpLookupHandleTableEntry+18↑j
PAGE:00000001405F9402                 test    eax, eax        ; 1级句柄表处理
PAGE:00000001405F9404                 jnz     short loc_1405F940C
PAGE:00000001405F9406                 lea     rax, [r8+rdx*4] ; 进程ID * 4
PAGE:00000001405F940A                 retn
PAGE:00000001405F940A ; ----------------------------------------------------------------

句柄表结构

nt!_HANDLE_TABLE
   +0x000 NextHandleNeedingPool : Uint4B
   +0x004 ExtraInfoPages   : Int4B
   +0x008 TableCode        : Uint8B 句柄表地址低两位表示层级
   +0x010 QuotaProcess     : Ptr64 _EPROCESS
   +0x018 HandleTableList  : _LIST_ENTRY
   +0x028 UniqueProcessId  : Uint4B
   +0x02c Flags            : Uint4B
   +0x02c StrictFIFO       : Pos 0, 1 Bit
   +0x02c EnableHandleExceptions : Pos 1, 1 Bit
   +0x02c Rundown          : Pos 2, 1 Bit
   +0x02c Duplicated       : Pos 3, 1 Bit
   +0x02c RaiseUMExceptionOnInvalidHandleClose : Pos 4, 1 Bit
   +0x030 HandleContentionEvent : _EX_PUSH_LOCK
   +0x038 HandleTableLock  : _EX_PUSH_LOCK
   +0x040 FreeLists        : [1] _HANDLE_TABLE_FREE_LIST
   +0x040 ActualEntry      : [32] UChar
   +0x060 DebugInfo        : Ptr64 _HANDLE_TRACE_DEBUG_INFO

进程句柄表位置

nt!_EPROCESS
+0x570 ObjectTable      : Ptr64 _HANDLE_TABLE

notepad.exe进程的句柄表地址

1: kd> dt _eprocess objecttable 0xffff9f8f1219b080
nt!_EPROCESS
   +0x570 ObjectTable : 0xffff8d85`56370c40 _HANDLE_TABLE

0xffff8d85`570ff000 notepad.exe句柄表地址,低两位为0 表示是1级表

1: kd> dq 0xffff8d85`570ff000
ffff8d85`570ff000  00000000`00000000 00000000`00000000
ffff8d85`570ff010  9f8f124d`1d30ffff 00000000`001f0003
ffff8d85`570ff020  9f8f124d`14b0fff3 00000000`001f0003
ffff8d85`570ff030  9f8f1212`67b0fff5 00000000`00000001
ffff8d85`570ff040  9f8f1227`9290ffd7 00000000`001f0003
ffff8d85`570ff050  9f8f123d`39d0ff89 00000000`000f00ff
ffff8d85`570ff060  9f8f121f`2370ffff 00000000`00100002
ffff8d85`570ff070  9f8f1212`7990ffff 00000000`00000001

解析这个句柄对象 9f8f124d`14b0fff3

(句柄项>>0x10)&0xfffffffffffffff0 = 对象地址(低位)

(0x9f8f124d14b0fff3>>0x10)&0xfffffffffffffff0 =  0x9f8f124d14b0 加上高位 0xffff 等于 0xffff9f8f124d14b0

dt _object_header 0xffff9f8f124d14b0

+0x000 PointerCount     : 0n32764
   +0x008 HandleCount      : 0n1
   +0x008 NextToFree       : 0x00000000`00000001 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex        : 0x2d '-' 句柄类型
   +0x019 TraceFlags       : 0 ''
   +0x019 DbgRefTrace      : 0y0
   +0x019 DbgTracePermanent : 0y0

计算对象类型索引

2d^ObHeaderCookie^(对象地址倒数第二个字节14)

1: kd> ?? 0x2d^0x14^0x29
int 0n16

逆向内核函数 ObGetObjectType得知计算方式

PAGE:00000001406FD860 ObGetObjectType proc near               ; DATA XREF: .pdata:000000014010986C↑o
PAGE:00000001406FD860                 lea     rax, [rcx-30h]
PAGE:00000001406FD864                 movzx   ecx, byte ptr [rcx-18h]
PAGE:00000001406FD868                 shr     rax, 8
PAGE:00000001406FD86C                 movzx   eax, al
PAGE:00000001406FD86F                 xor     rax, rcx
PAGE:00000001406FD872                 movzx   ecx, byte ptr cs:ObHeaderCookie
PAGE:00000001406FD879                 xor     rax, rcx
PAGE:00000001406FD87C                 lea     rcx, ObTypeIndexTable
PAGE:00000001406FD883                 mov     rax, [rcx+rax*8]
PAGE:00000001406FD887                 retn
PAGE:00000001406FD887 ObGetObjectType endp

ObTypeIndexTable+(Index*8)
1: kd> dq fffff801`1af08e10+0x16*8
fffff801`1af08ec0  ffff9f8f`0ceca560 ffff9f8f`0cecac40
fffff801`1af08ed0  ffff9f8f`0ceca6c0 ffff9f8f`0cec97a0
fffff801`1af08ee0  ffff9f8f`0cecada0 ffff9f8f`0cec9a60
fffff801`1af08ef0  ffff9f8f`0cec9d20 ffff9f8f`0cee1e80
fffff801`1af08f00  ffff9f8f`0cee14e0 ffff9f8f`0cee1d20
fffff801`1af08f10  ffff9f8f`0cee1220 ffff9f8f`0cee2ae0
fffff801`1af08f20  ffff9f8f`0cee22a0 ffff9f8f`0cee2140
fffff801`1af08f30  ffff9f8f`0cee2f00 ffff9f8f`0cee17a0

1: kd> dt _object_type ffff9f8f`0ceca560
nt!_OBJECT_TYPE
   +0x000 TypeList         : _LIST_ENTRY [ 0xffff9f8f`0ceca560 - 0xffff9f8f`0ceca560 ]
   +0x010 Name             : _UNICODE_STRING "Profile"
   +0x020 DefaultObject    : (null) 
   +0x028 Index            : 0x16 ''
   +0x02c TotalNumberOfObjects : 0
   +0x030 TotalNumberOfHandles : 0
   +0x034 HighWaterNumberOfObjects : 0
   +0x038 HighWaterNumberOfHandles : 0
   +0x040 TypeInfo         : _OBJECT_TYPE_INITIALIZER
   +0x0b8 TypeLock         : _EX_PUSH_LOCK
   +0x0c0 Key              : 0x666f7250
   +0x0c8 CallbackList     : _LIST_ENTRY [ 0xffff9f8f`0ceca628 - 0xffff9f8f`0ceca628 ]

可以看到这个句柄类型是 Profile类型 

 
 

内核句柄表

PspCidTable 内核变量存储内核全局句柄表的内存地址

1: kd> dq PspCidTable 
fffff801`1af085c0  ffff8d85`50279dc0 ffff9f8f`0cef6d80
fffff801`1af085d0  ffff9f8f`0cee2140 00000000`00000002
fffff801`1af085e0  00000000`00000000 00001000`00010000
fffff801`1af085f0  00000000`00000000 00000000`00005000
fffff801`1af08600  00000000`00000000 000001db`00000000
fffff801`1af08610  00000000`00000000 00000000`00000000
fffff801`1af08620  00000000`00000000 00000000`00000000
fffff801`1af08630  ffff9f8f`0cfef900 fffff801`19d06000

0xffff8d85`53efc001 低两位为1 表示是一个二级表
1: kd> dt _handle_table ffff8d85`50279dc0
nt!_HANDLE_TABLE
   +0x000 NextHandleNeedingPool : 0x1c00
   +0x004 ExtraInfoPages   : 0n0
   +0x008 TableCode        : 0xffff8d85`53efc001
   +0x010 QuotaProcess     : (null) 
   +0x018 HandleTableList  : _LIST_ENTRY [ 0xffff8d85`50279dd8 - 0xffff8d85`50279dd8 ]
   +0x028 UniqueProcessId  : 0
   +0x02c Flags            : 1
   +0x02c StrictFIFO       : 0y1
   +0x02c EnableHandleExceptions : 0y0
   +0x02c Rundown          : 0y0

查找notepad.exe的句柄 pid 为  6264 (0x1878)

由上内核函数逆向可知

句柄表地址+(进程ID>>0xa*8)-1 

1: kd> dq 0xffff8d85`53efc001+(6*8)-1 ffff8d85`53efc030 ffff8d85`565fb000 00000000`00000000

 得到进程所在1级表地址  ffff8d85`565fb000

得到内核对象句柄项

1: kd> dq ffff8d85`565fb000+(0x78*4)

ffff8d85`565fb480 9f8f121a`3080fffd 00000000`00000000

从内核句柄项中解析出内核对象地址

 (0x9f8f121a`3080fffd>>0x10)&0xfffffffffffffff0 = 0xffff9f8f1219b080

1: kd> dt _eprocess imagefilename 0xffff9f8f1219b080
nt!_EPROCESS
   +0x5a8 ImageFileName : [15]  "notepad.exe"

 
 

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

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

相关文章

内网外网分离模式下,通过网关转发,来部署前后端分离的系统

前言 最近为某银行系统部署了一套商城系统,网络环境比较特别,思路记录下,其中商场系统使用前后端分离模式部署。 该银行网络环境: 外网服务器:外网可以访问到它,不能访问外网。 网关服务器:跟…

UE5电脑配置要求是什么?2023虚幻5电脑配置推荐

虚幻引擎对于游戏创作者来说已经不再陌生。该软件为程序员构建和设计终极视频游戏,以创建壮观的游戏场景和流畅的动作。此外,它还处理音效、物理碰撞效果和控制。尤其是人工智能对角色的控制。与其他软件一样,Unreal Engine也有最低系统要求才…

Atcoder beginner contest 302

A - Attack AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> #define int long long using namespace std; signed main() {int a, b;cin >> a >> b;if (a % b 0) cout << a / b << endl;else c…

Springboot +spring security,PasswordEncoder详解与应用

一.简介 在前面的文章有提到过PasswordEncoder: 为什么密码使用{noop}开头呢&#xff1f;也做出了相应的解释&#xff0c;这篇文章了解PasswordEncoder。 二.PassworderEncoder 详解 2.1主要方法 String encode(CharSequence rawPassword)&#xff1a;密码加密boolean matc…

【送书福利-第五期】《网络结构数据分析与应用》

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 送书福利-第五期 1、前言2、内容简介3、作…

CodeForces.1786A1.简单发牌.[简单][flg标识][找数学规律]

题目描述&#xff1a; 题目解读&#xff1a; 简单发牌问题&#xff0c;给两个人发牌&#xff0c;每次发牌数量依次递增&#xff0c; 给a发1张&#xff0c;然后给b发2&#xff0c;3张&#xff1b; 给a发4&#xff0c;5张&#xff0c;给b发6&#xff0c;7张&#xff1b; 给a发…

微信小程序【发送给朋友】和【复制链接】功能,灰色不可用

每日鸡汤&#xff1a;悲观者可能正确&#xff0c;但是乐观者往往成功 假设你是一个用户&#xff0c;你随便找一个小程序可以看到这几个功能 转发给朋友分享到朋友圈复制链接 很常见的功能&#xff0c;但是如果你作为开发者&#xff0c;这几个功能就需要自己做喽&#xff0c;并…

day9 - 对花朵图像进行边缘检测

本期主要介绍常用于进行图像边缘检测的滤波器&#xff08;算子&#xff09;&#xff1a;Sobel算子、Scharr算子、Laplacian算子&#xff1b;通过实验比较不同的算子的处理效果以及使用场景。 完成本期内容&#xff0c;你可以&#xff1a; 了解图像梯度的原理和应用 掌握使用S…

QxRibbon 知:搭建 PyQt5 环境

文章目录 安装 Python安装 PyQt5安装 PyCharm构建 QxRibbon参考资料 安装 Python 参考其它教程 安装 PyQt5 PyQt5 版本&#xff1a;5.15.2 运行 windows cmd.exe 命令提示符&#xff0c;通过下列方法进行安装&#xff08;友情提醒&#xff1a;关闭流氓软件 360&#xff09; …

B站w_rid逆向

文章目录 目标网站加密参数定位算法还原很久没有看过B站的项目了,正好有小伙伴问B站的w_rid咋逆向的, w_rid?初一听没啥印象啊,以前的B站应该没有这个东东,去看了一下,原来是更新了。 就看了下B站pc端作品列表,开始有校验w_rid了,本次目标就是逆向这个参数。 目标网…

Live800在线客服系统:客户体验即是业绩来源

“客户就是上帝”&#xff0c;这一论断在商业行为中早已成为不争的事实。 所有企业都知道&#xff0c;满足客户的需求才能让企业稳步发展。在产品同质化严重的今天&#xff0c;客户服务成为核心竞争力&#xff0c;试想一下&#xff0c;在产品、价格相差无几的两个企业中&#…

网络安全——应用层安全协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用层安全协议 1.应用层安全威胁 2.电子邮件安全协议 1.MIME协议 2.电…

es 二、核心概念

目录 Nrt cluster集群概念 node节点 Document 文档 Index 索引 Field字段 Type 类型 shard分片 Replica shard副本 数据库和es概念对比 Nrt 写入一秒后就能搜到 cluster集群概念 一台机器启动一个实例即可&#xff0c;多个组成 node节点 一个实例一个节点 Documen…

Hover.css动画库的使用

目录 1、 Hover.css是什么&#xff1f; 2、引入 2.1、整个文件引入 2.2、复制所需要的代码 案例&#xff1a; 1. 卷边效果 2. 调整大小的卷边 类别&#xff1a; 1、 Hover.css是什么&#xff1f; Hover.css是一个CSS3鼠标悬停的动画方案&#xff0c;里面包含了许多纯c…

Linux驱动入门(二)——嵌入式处理器介绍和构建驱动程序开发环境

文章目录 嵌入式处理器和开发板介绍处理器简述处理器种类Intel的PXA系列处理器StrongARM系列处理器MIPS处理器摩托罗拉龙珠(DragonBall)系列处理器日立SH3处理器德州仪器OMAP系列处理器 ARM处理器ARM处理器简介ARM处理器的特点ARM处理器系列ARM处理器的应用ARM处理器选型 STM32…

Netty实战(八)

引导 一、引导1.1 什么是引导1.2 Bootstrap 类1.3 引导客户端和无连接协议1.4 引导客户端1.5 Channel 和 EventLoopGroup 的兼容性 二、引导服务器2.1 ServerBootstrap 类2.2 引导服务器 三、从 Channel 引导客户端四、在引导过程中添加多个 ChannelHandler五、使用 Netty 的 C…

1.实验技术-收藏吃灰去,深入浅出常规PCR

1.PCR 原理与过程 2.PCR 体系组分 3.PCR 应用 4.PCR 常见问题及解决方案 前言 PCR&#xff08;Polymerase Chain Reaction&#xff0c;聚合酶链式反应&#xff09;是现代生物学中一项必不可少的技术&#xff0c;能进行体外扩增DNA序列&#xff0c;为基因组研究和分子诊断提供…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心&#xff1a;IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作&#xff0c;注意&#xff1a;此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

想用Python做副业?看这一篇就够了

大家好&#xff0c;我是耿直。 随着人工智能、大数据、物联网的广泛应用&#xff0c;与之紧密关联的Python技术开始受到人们的极大关注。各行业对Python技术服务的需求量呈指数级暴增&#xff0c;尤以爬虫技术服务为甚&#xff0c;供不应求早已成为常态。 而近两年受到各种不…

Springboot +spring security,实现RememberMe和实现原理分析

一.简介 我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我。 比如下面这个截图&#xff1a; Spring Security 也提供了这个功能&#xff0c;今天来实践下。 二.创建项目 如何创建一个SpringSecurity项目&#xff0…