首页
社区
课程
招聘
[原创]关于Ring3解锁文件句柄的一些总结吧……
发表于: 2013-6-10 23:35 17623

[原创]关于Ring3解锁文件句柄的一些总结吧……

2013-6-10 23:35
17623

在看Windows内核原理与实现的时候,看到进程句柄表这小节,突然想起,很久本打算弄个Ring3解锁文件的东西,后来不了了之。既然想起来,那就翻出来把它做完……

    书中对于进程句柄的描述:当一个进程利用名称创建或者打开一个对象(Object)时,将获得一个句柄,该句柄所指向所创建或者打开的对象。对象管理器中的对象或者执行体对象,位于系统空间中,所以在进程空间中不能通过地址来引用(对象地址值都大于0x80000000)。在windows中,句柄仅在进程范围内有效。一个进程中的句柄传递给另一个进程后,句柄值不再有效。

    在windows中每一个用户进程都有一个自己的句柄表,句柄表结构为:HANDLE_TABLE,每一个句柄项结构为:HANDLE_TABLE_ENTRY(具体结构定义,请参见相关书本)。

    除了用户进程的句柄表外,还有一个内核句柄表,即:系统空间中的全局句柄表。在WRK中即变量:ObpKernelHandleTable,也是System进程的句柄表(用XT看了一下,里面也有进程对象和线程对象)。

   说到进程,其实进程惟一ID的分配也是通过句柄表实现的,在一个全局句柄表PspCidTable中穿件的句柄索引值,也称为CID句柄表,该表中每一个句柄项都包含了进程或线程的对象地址(以上提及进程或线程对象地址的地方应该可以用来检测隐藏进程)。

    全局句柄表和用户进程的句柄表通过对象引用计数实现对象引用的一致性。当用户进程引用某个对象时,全局句柄表对应的该对象的引用计数加一,当用户进程不使用该对象时即使解除引用,即全局引用计数减一( 在内核代码中,我们经常看到ObReferenceObjectByHandle 和 ObDereferenceObject成对出现)。当引用计数为0时,当前对象从全局句柄表和局部句柄表中移除,相关资源释放。

    转入正题:Ring3解锁文件引用过程:提升进程权限,获取系统句柄表,拷贝,每一个进程中相同访问权限的文件对象(FileObject),解析文件对象名,查找需要解锁的文件,执行解锁操作。

(1)提升进程权限(古老的东西)
//打开进程权限令牌

result=::OpenProcessToken(::GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hTokenHandle);
if(result){
	result=::LookupPrivilegeValueW(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
	if(result){
		TokenPrivileges.PrivilegeCount = 1;
		TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
		//提升进程权限
	result=::AdjustTokenPrivileges(hTokenHandle,FALSE,&TokenPrivileges,0,NULL,0);
	}
}
pInfo = (ULONG)HeapAlloc(hHeap,HEAP_GENERATE_EXCEPTIONS,0x1000);
//第一次调用获取所需空间大小
status = NtQuerySystemInformation(InfoClass,(PVOID)pInfo,0x1000,&ReturnBytes);
if(STATUS_INFO_LENGTH_MISMATCH == status)
{
	HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,(PVOID)pInfo);
	while(status != STATUS_SUCCESS)//多次调用
	{
		pInfo = (ULONG)HeapAlloc(hHeap,HEAP_GENERATE_EXCEPTIONS,ReturnBytes);
		//继续调用看当前提交空间是否足够(可能是系统句柄表大小会变)
		status = NtQuerySystemInformation(InfoClass,(PVOID)pInfo,ReturnBytes,&ReturnBytes);
		if(status == STATUS_INFO_LENGTH_MISMATCH)
		{
			HeapFree(hHeap,HEAP_GENERATE_EXCEPTIONS,(PVOID)pInfo);
		}
	}
}

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

上传的附件:
收藏
免费 5
支持
分享
最新回复 (24)
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
资料好久了,还是感谢整理
2013-6-11 02:55
0
雪    币: 74
活跃值: (1230)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
板凳。。
2013-6-11 02:58
0
雪    币: 227
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
NtQueryObject好使么?我记得以前在ring0里鼓捣了半天,好像查询某种Pipe句柄时会遇到问题然后程序就卡住了..
2013-6-11 07:07
0
雪    币: 328
活跃值: (154)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
5
在Ring3里面,用线程来调用,设置线程等待时间,如果超时,就结束线程……
2013-6-11 10:50
0
雪    币: 227
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
好吧..我当时是用VB6写的,不支持多线程。。所以苦恼了半天
2013-6-12 18:52
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没什么大用……
用SetHandleInformation设置一下打开句柄的属性即可……你这玩意就关不掉句柄了……
2013-6-12 19:22
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
把自己的过滤驱动插到设备栈底……向下发送删除请求不是很好麽?又强大,兼容性又好……何必去关句柄讷……
2013-6-12 19:24
0
雪    币: 328
活跃值: (154)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
9
驱动当然强大,这个只是Ring3下的小玩具而已
2013-6-12 21:44
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
但不过你也应该考虑一下r3下句柄熟悉被修改的情况呀……
2013-6-12 22:02
0
雪    币: 2529
活跃值: (2480)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
11
结束不了的句柄,其实只要再次调用SetHandleInformation函数,把保护属性去掉即可。
2013-6-13 10:57
0
雪    币: 154
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
解锁干啥。。。NTFS HardLink。。。
2013-6-13 14:42
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
如果是独占的话HardLink反而会增加删除的难度
2013-6-13 18:48
0
雪    币: 328
活跃值: (154)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
14
学习了……
2013-6-13 19:11
0
雪    币: 14
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持一下,留名
2013-6-13 19:45
0
雪    币: 458
活跃值: (93)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持一下
2013-6-14 09:03
0
雪    币: 2087
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
留个脚印
2013-6-14 10:10
0
雪    币: 53
活跃值: (558)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持Lz整理。。。
2013-6-14 22:28
0
雪    币: 227
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
19
我没说我要解锁啊
只是说查询句柄时遇到的这些个细节问题挺麻烦的
不过还真没想过你说的方法,没看明白,加过滤驱动删什么?
2013-6-15 07:57
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
随便在某个删除请求下发的时候……偷梁换柱一下……因为你已经是在栈底了……上层过滤驱动无法截获你的删除请求了……这比250安全卫生那个发请求删除文件强多了,他那玩意mini文件系统过滤驱动都可以拦截……
2013-6-15 10:21
0
雪    币: 227
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
21
感觉360的强删应该不止这个程度吧..不过确实还真没试过
我觉得解析文件系统,硬盘上直接清零~应该是最底层的了
不过NTFS要想分析透了就得下些功夫了
据说WIN8还出了个新的文件系统叫Por什么什么来的..
2013-6-15 10:58
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
slj
22
还不错,值得试试
2013-6-15 11:30
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
360无非就是恢复恢复钩子什么的……
2013-6-15 11:44
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
解析文件系统也要看如何解析……如果一般的解析方式
我完全可以挂载一个磁盘过滤驱动,一个文件系统过滤驱动
如果在磁盘过滤驱动发现这个请求包没有经过文件系统过滤驱动。就证明可能是有人在直接解析磁盘……直接返回失败即可
2013-6-15 11:46
0
雪    币: 227
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
25
见招拆招,永无止境..
2013-6-15 12:14
0
游客
登录 | 注册 方可回帖
返回