ithurricane 发表于 2012-1-19 22:52:39

简单的过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 13:51:25

本帖最后由 yxd199512041 于 2012-1-21 17:25 编辑

要是有1.9的解锁就好了

xmlpull 发表于 2012-1-24 14:28:43

{:soso_e142:}学习收藏!!!!

kk1025 发表于 2013-4-9 22:19:41

學習學習!
页: [1]
查看完整版本: 简单的过Unlocker1.8.9的方法和自己的解决对策