紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7627|回复: 4

谈一下枚举进程句柄表的坑

[复制链接]

2

主题

31

帖子

1

精华

金牌会员

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1244
发表于 2017-11-8 09:04:11 | 显示全部楼层 |阅读模式
“正规”的枚举方法应该是ExEnumHandleTable,虽然这货是导出函数,但是在xp~win7和win8+上有很大不同,比如:函数原型:
  1. NTKERNELAPI BOOLEAN ExEnumHandleTable(
  2.         IN PVOID HandleTable,
  3.         IN PVOID EnumHandleProcedure,
  4.         IN PVOID EnumParameter,
  5.         OUT PHANDLE Handle
  6. );
复制代码



xp~win7 :
  1. BOOLEAN (*EnumHandleProcedure)(
  2.         IN PHANDLE_TABLE_ENTRY HandleTableEntry,
  3.         IN HANDLE Handle,
  4.         IN PVOID EnumParameter
  5. )
复制代码



win8+:
  1. BOOLEAN (*EnumHandleProcedure)(
  2.         IN PVOID HandleTable,
  3.         IN PHANDLE_TABLE_ENTRY HandleTableEntry,
  4.         IN HANDLE Handle,
  5.         IN PVOID EnumParameter
  6. )
复制代码



下面坑爹来了:
在ExEnumHandleTable之前需要PsAcquireProcessExitSynchronization,之后需要PsReleaseProcessExitSynchronization,看过wrk大家都知道,demo...
xp下PsAcquireProcessExitSynchronization并不导出,需要你自己实现PsAcquireProcessExitSynchronization,这个函数很简单,里面只有一个ExAcquireRundownProtection(&Process->RundownProtection)
这时候就要强行弄一个RundownProtection的偏移了(xp是0x80,别的系统不知道)。
而vista以上就很舒服了,有一个导出函数叫ObReferenceProcessHandleTable,你懂的,可以直接代替自己用恶心的(Process + HandleTableOffset)偏移定位句柄表的过程(然而processhacker2还是用偏移定位了)。

下面更坑爹的来了:
你以为只要在EnumHandleProcedure回调里面随便写写就够了?错了!WIN8以上的EnumHandleProcedure的HandleTableEntry是加了锁的!
你需要在对entry干完活之后ObpUnlockHandleTableEntry,这个ObpUnlockHandleTableEntry也得你自己实现(因为ntos里的都被inline了),总的来说就是:
InterlockedExchangeAdd(&HandleTableEntry->u1.VolatileLowValue, 1);
ExfUnblockPushLock(&handleTable->HandleContentionEvent, NULL);(其实IDA一下你就知道了)
但是。。这俩结构也是不公开的,也得你自己根据系统来写offset。
processhacker2的做法是直接每个系统写死offset,win64ast据说不是用ExEnumHandleTable枚举的句柄所以不是很清楚。

下面更更更更坑爹的来了:
WIN8+的HandleTableEntry里有个ObjectPointerBits(结构见http://www.m5home.com/bbs/thread-8847-1-1.html),这货解压之后其实并不是Object,而是ObjectHeader(也就是Object - 12 or -24)

好了,三个坑说完了,剩下的实现就是体力活了,完整代码见https://github.com/processhacker2/processhacker/blob/f525b448d9289b5c64173326c142611651d386dc/KProcessHacker/object.c
(逃

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2017-11-8 11:01:34 | 显示全部楼层
我是直接使用API来枚举句柄的。主要是直接枚举句柄表太麻烦了,成本和效益不成比例。
如果非要直接枚举句柄表,只能『借用』“进程黑客”的代码了。

9

主题

37

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
86
发表于 2017-11-26 17:42:11 | 显示全部楼层
学习 我正好也在研究句柄表 特此上来感谢

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2019-7-2 12:57:13 | 显示全部楼层
ObReferenceProcessHandleTable并没有导出。(win7x64sp1)
关于Process->RundownProtect,其实这个硬编码有骚操作可以动态定位。反汇编PsGetProcessId就能拿到PID的硬编码,然后减去sizeof(void*)就是RundownProtect的偏移。到14393为止都可以这么搞,不过从15063开始,RundownProtect跑到活动进程链后面了。

0

主题

36

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
36
发表于 2022-9-17 16:19:21 | 显示全部楼层
多谢楼主啊 XP下我用那个这个函数枚举一直加载不起驱动 我 无比郁闷啊  2天了
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-19 20:08 , Processed in 0.023751 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表