首页
社区
课程
招聘
[原创]Windows 8 32/64-Bit中关于PspCidTable的变更
发表于: 2013-4-22 11:21 12432

[原创]Windows 8 32/64-Bit中关于PspCidTable的变更

2013-4-22 11:21
12432
/************************************************************************
* Author(s)                        : Stanford Zhang
* E-Mail                        : zhangstanford@gmail.com
*
***********************************************************************/

最近学习通过 PspCidTable 遍历进程列表,分享一点遍历 PspCidTable 在Windows 8 32/64-Bit 中的变化。网上关于 PspCidTable 的文章多如牛毛,在这里就不再赘述,可参考百度和 Google,在这里推荐 sysdog 的《PspCidTable完全解读》。
本文中只详细查看了 Windows XP 32-Bit、Windows 7 32/64-Bit、Windows 8 32/64-Bit 五个版本的Windows相关内核信息,如果其他系统略有差异,请具实际情况而论。PspCidTable 在 Windows XP 32-Bit 和 Window 7 32/64-Bit 中两个结构 _HANDLE_TABLE 和 _HANDLE_TABLE_ENTRY 没有变化,只是在 64-Bit 系统中一些指针和字段偏移变成64-Bit,其他都是一样的(下文中选中Windows XP 32-Bit 为被比较对象),其遍历方法请参考网上相关文章。
1.        PspCidTable变化之 Windows 8 32/64-Bit - _HANDLE_TABLE


图1-1 Windows 7 32-Bit _HANDLE_TABLE结构


图1-2 Windows 8 32-Bit _HANDLE_TABLE结构


图1-3 Windows 8 64-Bit _HANDLE_TABLE结构

如以上3图所示,Windows 8中的 _HANDLE_TABLE 与其他系统中的 TableCode 字段偏移不一样,所以在查找地址的时候要加上偏移(0x008),且 Windows 8 32-Bi t和 64-Bit TableCode 字段的偏移是一样。TableCode 字段的解释与其他系统中一样的,低 3 Bits 表示是几层表结构,低3位清0之后的值就是层表地址。

2.        PspCidTable变化之 Windows 8 64-Bit - _HANDLE_TABLE_ENTRY

图2-1 Windows 7 32-Bit _HANDLE_TABLE_ENTRY结构


图2-2 Windows 8 32-Bit _HANDLE_TABLE_ENTRY结构


图2-3 Windows 8 64-Bit _HANDLE_TABLE_ENTRY结构

        如以上图所示,Windows 7 32-Bit中的_HANDLE_TABLE_ENTRY和Windows 8 32-Bit/64-Bit都不一样。但在实验过程中发现,Window 7 32-Bit 与Windows 8 32-Bit中偏移0x000处的4个字节的解释是一样的,只不过Windows 8 32-Bit中的结构用位域将信息详细表达了出来。从Windows 8 32-Bit中可看出低3 Bits另有用处,在解释的时候和Windows 7 32-Bit是一样的,将低3 Bits清零和最高Bit置1。计算公式如下:
        Object Address = (Object/ObjectPointerBits & 0xFFFFFFF8) | 0x80000000
注:这里的ObjectPointerBits是Windows 8 32-Bit中的字段。
        如图2-3中所示,Windows 8 64-Bit 中Unlocked字段没变,但多了一个RefCnt(Windows 8 32-Bit中RefCnt字段是在偏移为0x004的4字节中,从第26 Bit开始的6 Bits)字段且占从第1 Bit开始的19 Bits,Attributes字段名称没变但从原来占2 Bits变成占3 Bits(从第20 Bit开始),ObjectPointerBits占位从第23 Bit的41 Bits。同时,1 + 19 + 3 + 41 = 64,正是64-Bit系统中地址所占位数。
这里变化最大的是ObjectPointerBits字段,Windows 64-Bit系统中地址占64 Bits中的44 Bits,所在这里猜测将_HANDLE_TABLE_ENTRY的前8个字节右移19位,这样结构就和Windows 8 32-Bit系统中的结构是一样的了,所以得以下计算公式:
Object Address = ((ObjectPointerBits >> 19) & (~0xF)) | 0xFFFFF00000000000
        经过实验验证,在这之后对这个地址进行处理就可以得到相应的进程之类的信息。
注:由于实验资源有限,只在两台Windows 8 x64系统上经过测试无误,如果在其他系统中有误,请告知,谢谢。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 2177
活跃值: (2045)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
2
支持一下,  叉64
2013-4-22 13:05
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
3
X64的一直都比较少
2013-4-22 13:47
0
雪    币: 2620
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
标记一下,日后用
2013-4-22 19:13
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WINDOWS越来越复杂,没意思啊
2013-4-23 08:48
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这篇很不错,比刚刚看到的一个号称“原创”结果代码全是抄的讨论Win8驱动签名的帖子好太多了。

WIN8句柄表多了几位给属性/引用信息,所以句柄表本身支持的最大数量降低了一个数量级,算是一个损失。
2013-4-24 00:00
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
Thanks for share.
2013-4-24 14:37
0
雪    币: 97
活跃值: (141)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
不错,留个标记。
2013-5-19 11:27
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最近也在看pspcidTable,多谢楼主分享
2013-6-17 09:33
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark 下  留着学习
2013-6-17 23:27
0
雪    币: 371
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
正好用到,谢谢楼主分享
2013-7-8 16:20
0
雪    币: 346
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
MARK
2017-4-4 18:01
0
游客
登录 | 注册 方可回帖
返回
//