简单的过Unlocker1.8.9的方法和自己的解决对策
一般在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);
把这个句柄关闭了,就完成了解锁的过程
补充一句:在驱动里关闭其它进程里的句柄,需要先依附到那个进程的进程空间。
完整的代码: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((" CloseHandle Exception!"));
} 本帖最后由 yxd199512041 于 2012-1-21 17:25 编辑
要是有1.9的解锁就好了 {:soso_e142:}学习收藏!!!! 學習學習!
页:
[1]