首页
社区
课程
招聘
[讨论]进程句柄不超过226传说
发表于: 2013-9-18 23:16 6974

[讨论]进程句柄不超过226传说

2013-9-18 23:16
6974
潘爱民老师的《Windows内核原理与实现》一书中关于句柄与句柄表的内容中提到,当句柄大于0小于等于226时为当前进程句柄表中的索引(3.4章,P133)。
51cto上的内容:bc8K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0G2L8$3E0Q4x3X3f1#2x3h3y4@1L8#2)9J5k6h3y4G2L8g2)9J5c8X3q4J5N6q4)9J5c8U0t1H3x3e0l9I4x3g2)9J5c8U0t1K6y4e0M7$3x3#2)9J5k6h3S2@1L8b7`.`.



现在我们来看如何将一个句柄解析成相应的内核对象。首先,一个有效的句柄有4种可能:

-1,代表当前进程。

-2,代表当前线程。

负值,其绝对值为内核句柄表中的索引。仅限于内核模式的函数可以引用。

不超过226 的正值,当前进程的句柄表中的索引。


那么言下之意除了system进程外每个进程的句柄表只能包含226个句柄项了?
WRK中ObReferenceObjectByHandle()的代码逻辑中也没发现相关内容。

于是,纠结了

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
上传的附件:
2013-9-18 23:30
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
3
貌似ObpCreateHandle可以指定是否使用内核句柄表(即system进程的句柄表),决定的参数由上一层传入,而不论是那种似乎都会增加句柄计数吧。。。回到ObOpenObjectByName又发现这个参数是更上一层传来的…
2013-9-18 23:43
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
而且…为啥这幅图里只有一个超过226的。。
2013-9-18 23:46
0
雪    币: 227
活跃值: (450)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
三层句柄表。。。。。三层。。。。
2013-9-19 02:15
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
6
知道这个,就是没明白潘爱民老师那句话啥意思
2013-9-19 08:38
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
根据楼上的楼上

256的3次方 = 1677 7216  ,也就是能有1千多万个句柄,
2013-9-19 09:31
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
好像是这样...
2013-9-19 09:33
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
9
_HANDLE_TABLE_ENTRY的尺寸是8byte
理论上的最大数量是(pagesize/sizeof(PVOID))^2 * pagesize/sizeof(_HANDLE_TABLE_ENTRY),IA32下为1024^2*512
不过微软加了额外的限制,因为内核中不可能有那么多的对象

这些都是很明白的,但令人费解的是书中的这段话:
现在我们来看如何将一个句柄解析成相应的内核对象。首先,一个有效的句柄有4种可能:

-1,代表当前进程。

-2,代表当前线程。

负值,其绝对值为内核句柄表中的索引。仅限于内核模式的函数可以引用。

不超过226 的正值,当前进程的句柄表中的索引。
2013-9-19 14:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
难道是笔误?
2013-9-19 18:15
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
11
怀疑中……

但是为啥要刻意加上这一条
2013-9-19 18:37
0
雪    币: 227
活跃值: (450)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
可以借鉴下你楼上的楼上的文章:
7c3K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6Q4y4h3k6S2j5$3S2A6L8r3I4A6M7#2)9J5c8X3W2@1k6h3#2Q4x3V1k6V1y4K6k6V1k6o6p5&6k6X3q4S2y4U0j5H3k6e0S2V1y4e0V1I4y4o6j5I4x3h3p5`.
2013-9-19 19:28
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
单个进程能拥有的句柄数,同三级表及其中某些位的占用有关,一般来说win8以前可以有一千多万个,win8及以后被占了一些,只有8百万左右了

当然,进程不一定就能沾满这个句柄数,因为这个数量还和内存配额有关,如果已经有其它进程占用了大量句柄,那么就无法达到这么多句柄数
2013-9-20 13:06
0
游客
登录 | 注册 方可回帖
返回