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

c/c++游戏逆向驱动开发,游戏辅助保护盾 功能介绍:1.降低游戏权限,提升游戏权限,禁止游戏后台截图。2.保护进程,隐藏进程,进程内存不被读取。如图: 部分功能展示: 演示程序下载:c/c++游戏逆向驱动开发,游戏辅助保护盾-桌面系统文档类资源-优快云下载使用效果图如下:(更多功能自行下载测试,测试觉得有用的铁铁可以联系我)... 阅读详情

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"



Windows内核理论基础学习 近俩天的学习-Windows内核基础的学习笔记。算是一个概述,毕竟每一个小点单拉出来都可以讲好久。学了这俩天,对内核的理解算是清晰了那么一点点了,持续学习ing…欢迎师傅一起交流讨论私信andwx都欢迎。参考文献:《加密与解密》Windows内核基础《Windows内核原理与实现》系统总述《深入理解Windows操作系统》Chat Gpt…MSDN文档。一些零零散散的大佬的blog。 阅读详情

相关推荐

Windows 内核之双机调试与windbg命令大全

在今后会有相当的实验环节,对于windows内核实验,调试环境是必不可少的,本章讲解双机调试的环境搭建与常见的WINDBG指令。 准备材料: VMware workstation : [https://www.vmware.com/go/downloadworkstation-cn] windows 7 x64 ISO (请使用种子下载工具进行下载): [ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|34205573

玄道的网安博客 1340

ExpLookupHandleTableEntry

ExpLookupHandleTableEntry

求索 1962

枚举内核句柄表(Windows内核学习笔记)

前面我写过有关内核句柄表的一些知识,今天来在这里跟大家分享一下我自己写的内核枚举进程句柄方法。 #include"EnumProcessHandleTable.h" #ifdef _WIN64 #define _HANDLE_TABLE_ 0x200 //硬偏移Win7x64下的HANDLE_TABLE字段在EPROCESS下的偏移 #define _OFFSET_ ...

KOOKNUT的博客 1237

Win10遍历句柄表+修改权限过Callback保护

本帖转载于http://www.m5home.com/bbs/thread-8847-1-1.html 本想发到看雪,但自己太菜,看雪“牛人”又太多,想想还是发到紫水晶吧。 感谢 TA 的 WIN64 教程带我走上驱动之路,想想除了个 VIP 账号就没教过学费,以后多在论坛发帖来回报一下吧。 正篇: XP 和 Win7 上关于句柄表的文章不少,一点不懂的朋友请自行百度谷歌搜索,方法没变,依旧使用 ...

xlaomlng的博客 4175

Windows文件句柄查看工具Handle实战解析

在Windows系统管理和调试领域,Handle工具是一个极为实用的命令行工具,能够帮助用户查看、分析并管理系统的文件句柄资源。该工具由微软官方的Sysinternals团队开发,广泛应用于系统调试、资源占用分析、故障排查等场景。本章将深入介绍Handle工具的基本功能、命令行参数、安装配置方式,并结合实际应用场景,帮助读者掌握其使用方法。Handle工具是一款轻量级但功能强大的命令行工具,允许用户查看哪些进程正在使用特定的文件、注册表项或设备等资源。

weixin_42128315的博客 2155

艾德克斯电子负载IT8510维修

2年前从朋友那收了这台艾德克斯电子负载,收来的时候上面的编码器就不好用,就是旋转的时候一会增加一会减小这种现象,不过其他功能都是正常的,自己也就将就用这。直到昨天,电子负载开机发现空载的时候电压不是0,开始有mV级的跳动,心想这个不正常。又测试了一下恒流功能,已经不能正常工作了。

mainbanp 4651

ExpLookupHandleTableEntry函数分析之第二型句柄表的一个例子

ExpLookupHandleTableEntry函数分析之第二型句柄表的一个例子

linux-0.11调试教程 1210

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3502

驱动开发:内核枚举PspCidTable句柄表

在上一篇文章中我们通过枚举特征码的方式找到了DPC定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找Windows 10系统下面的内核句柄表地址。首先引入一段基础概念;windowsPspCidTable 就是这样的一种表(内核句柄表),表的内部存放的是进程EPROCESS和线程ETHREAD的内核对象,并通过进程PID和线程TID进行索引,ID号以4递增,内核句柄表不属于任何进程,也不连接在系统的句柄表上,通过它可以返回系统的任何对象。

微软技术分享 1万+

生信人填坑记 orthofinder的安装和基础使用

其中常用的有两个结果,第一个是Orthogroups文件夹下的Orthogroups.GeneCount.tsv,这个文件里保存着每个家族在每个物种里的成员数量。(写到这儿饭点到了,吃饭要紧…在国内使用conda的同学我相信很多人都会遇到-|- -|- -|- -|- -|- -|- -|- -|- 一直转圈。软件的是由很简单,将你要跑的物种的蛋白质文件放在work/data目录下,文件名都用物种缩写,后缀统一就行。当然,很多软件都会自带一个这样的文件,conda装不了的时候可以去软件官网溜达溜达。

qq_43337286的博客 5381

vCenter Server出现no healthy upstream的解决方法

可以通过"VMware vCenter Server Management(服务)"来排查问题,在网页里面找到“服务”模块,会发现有很多服务没有启动起来,而且手动启动也无法启动。7.0 地址后,页面出现“no healthy upstream”,无法正常登录vCenter,重启后依旧如此,该故障的前提是没有对vCenter做过任何配置,如下图所示。于是用命令查询是否有证书过期,发现真有多个服务依赖的证书在当天早上过期。使用如下命令尝试打开服务发现不分服务可以打开,不分服务无法打开。

1万+

win10 x64进程句柄表

win10 x64进程句柄表研究测试

weixin_41725706的博客 938

开关电源环路补偿--开关电源进阶知识补充1

笔记 一 . 做开关电源环路补偿时候为了使得环路更加稳定。 1 .-- > 希望开关电源的相位裕量在45° 以上, 2. – > 希望开关电源的增益裕量在10db 以上 3. – > 希望开关电源增益曲线在过0db 时候以20db /dec 斜率下降(体现1个极点) 4. – > 希望开关电源补偿之后的带宽达到开关频率的是1/5 ~1/10,用以原理开关电源的开关噪音。 左边图示电源瞬态拉载和释放负载的时候输出电压存在明显的振铃,说明这个目前的环路相位裕量(phase m

qq_29776365的博客 1万+

24.IDA逆向句柄表算法-Windows驱动

句柄表 游戏逆向 游戏安全 游戏攻防 c++ 反游戏外挂 保姆级攻略 Windows 汇编 x64游戏

计算机王的博客 1260

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 476

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 581

x64 Global HANDLE 全局句柄表

全局句柄表 0: kd> dq PspCidTable fffff800`04070408 fffff8a0`00004880 00000000`00000000 fffff800`04070418 ffffffff`80000020 00000000`00000101 fffff800`04070428 ffffffff`80000298 ffffffff`80000024 fffff800`04070438 00000000`00000000 00000000`00000113 fffff

Mikasys的博客 1156

中台战略-第五章、中台建设方法论

文章目录第五章、中台建设方法论5.1 中台架构整体策略5.2 业务顶层设计5.3 业务中台设计方法论5.3.1 能力支撑是基础5.3.2 中心自治是承载形式5.3.3 3层模型是骨架5.3.4 5步法是指导思想1. 业务抽象2. 高阶设计3. 组件建模4. 开发交付5. 持续运营5.4 数据中台设计方法论5.4.1 总体规划5.4.2 数据集成5.4.3 模型建设5.4.4 通用研发5.4.5 资产管理5.4.6 数据服务5.5 应用向中台迁移的3中途径和方法5.5.1 方法1:新应用替换旧应用5.5.2

沧海之巅的专栏 1460

6.5 Windows驱动开发:内核枚举PspCidTable句柄表

在 Windows 操作系统内核中,PspCidTable 通常是与进程(Process)管理相关的数据结构之一。它与进程的标识和管理有关,每个进程都有一个唯一的标识符,称为进程 ID(PID)。与之相关的是客户端 ID,它是一个结构,其中包含唯一标识进程的信息。这样的标识符在进程管理、线程管理和内核对象的创建等方面都起到关键作用。

微软技术分享 5450

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Windows指针与句柄全解析:内存地址与内核凭证的核心差异

在C/C++工程实践中,资源管理始终是开发者绕不开的核心议题,而指针与句柄正是两种最具代表性的资源访问模型。指针直接映射虚拟内存地址,赋予程序高效读写数据的能力,但也伴随着悬垂、泄漏等生命周期风险;句柄则以不透明值的方式,通过内核对象表间接引用受保护资源,由系统统一完成权限校验与引用计数管理。深入理解两者的底层原理,不仅能规避“空指针”“句柄泄漏”等高频故障,更能帮助开发者设计出健壮的RAII封装与现代C++智能指针方案。从定时器回调、桌面句柄获取到跨进程协作,掌握指针与句柄的本质差异,是构建高可靠Wind

weixin_34246551的博客 295

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

理解Windows x64 SSDT与win32k影子服务表:NtCall64系统调用Fuzzer背后的理论基石

NtCall64 是一个面向 Windows x64 的**系统调用 Fuzzer**(syscall fuzzer),它通过模糊测试内核系统调用表——ntoskrnl 的 SSDT(KiServiceTable)和 win32k 的影子服务表(Shadow SSDT)——来挖掘稳定性问题与潜在漏洞。要读懂这个工具为什么"敢直接乱调系统调用",必须先搞懂三件事:SSDT 是什么、win32k 影子

gitblog_00781的博客 889

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

用户句柄表的遍历

私有句柄表 _HANDLE_TABLE_ENTRY的Object直接指向_OBJECT_HEADER不用减 #include <ntifs.h> //一个页最大容纳的_HANDLE_TABLE_ENTRY #define MAX_ENTRY_COUNT (0x1000/sizeof(HANDLE_TABLE_ENTRY)) //未公开未文档化 typedef PVOID(NTAPI *OBGETOBJECTTYPE)(IN PVOID pObject); EXTERN_C NTKERNE

Mikasys的博客 785

R3 x64枚举进程句柄

转载:https://blog.youkuaiyun.com/zhuhuibeishadiao/article/details/51292608 需要注意的是:在R3使用ZwQueryObject很容易锁死,需要放到线程中,如果线程超过500ms就说明卡死了 就只能放弃这个句柄了 这个句柄外面是一个FileObject类型,但真实是一个信号类型 还有在R3中枚举 有一个句柄我们是没有权限...

476

内核对象管理器学习笔记

Windows 内核对象学习笔记 对象组成 _HANDLE_HEADER +0x000 PointerCount : Int8B +0x008 HandleCount : Int8B +0x008 NextToFree : Ptr64 Void +0x010 Lock : _EX_PUSH_LOCK +0x018 TypeIndex : Uchar //global variable ObTypeIndex

ip1234pi的博客 612

(Win7) PspCidTable遍历进程句柄表,枚举进程

本文出自悠然品鉴小悠,转载请注明出处http://www.youranshare.com/blog/sid/102.html 先说一下句柄表是什么 在windows内核中定义了很多内核对象,像文件对象,线程对象,信号量对象啊等等;而Windows中并没有让我们直接去使用这些对象资源,而是通过句柄让我们去引用这些资源,句柄表就相当于资源的数组,而句柄就是对应资源的索引,每个进程内部都有一个自

qiaoli的知识备忘录 3184
上一篇: openpilot 项目解析及 xgnpilot
下一篇: .Net Core 动态加载和卸载程序集
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值