|
一般在Ring3下面强占一个文件只要
HANDLE hFile = CreateFile(L"XXX.XXX", GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); 并且不关闭句柄即可,用Unlocker可以轻松解锁这样的句柄,并且删除
不过如果设置了句柄的属性,情况就不一样了
SetHandleInformation(hFile, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE);
把句柄的属性设置成保护的句柄,Unlocker就无法解锁了,
我自己研究了个方法对付这种顽固句柄,
思路是去掉这个保护的属性,然后关闭句柄即可
typedef struct _OBJECT_HANDLE_FLAG_INFORMATION
{
BOOLEAN Inherit;
BOOLEAN ProtectFromClose;
}OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION;
设置这个结构的属性
pHandleFlags->Inherit = 0;
pHandleFlags->ProtectFromClose = 0; // 把保护属性去掉
然后调用一个导出的标准API即可
ObSetHandleAttributes(Handle, pHandleFlags, KernelMode);
最后用ZwClose(Handle);
把这个句柄关闭了,就完成了解锁的过程
(, 下载次数: 1)
补充一句:在驱动里关闭其它进程里的句柄,需要先依附到那个进程的进程空间。
完整的代码:- POBJECT_HANDLE_FLAG_INFORMATION pHandleFlags;
- pHandleFlags = ExAllocatePool(NonPagedPool, sizeof(OBJECT_HANDLE_FLAG_INFORMATION));
- pHandleFlags->Inherit = 0;
- pHandleFlags->ProtectFromClose = 0;
- __try
- {
- KeAttachProcess(EPROCESS);
- status = ObSetHandleAttributes((HANDLE)(paramater->Handle), pHandleFlags, KernelMode);
- if ( NT_SUCCESS(status) )
- {
- status = ZwClose((HANDLE)(paramater->Handle));
- }
- KeDetachProcess();
- }
- __except(EXCEPTION_EXECUTE_HANDLER)
- {
- KdPrint(("[kEvP] CloseHandle Exception!"));
- }
复制代码 |
|