Win64 驱动内核编程-29.强制解锁文件

本文介绍了如何通过Win64驱动程序强制解锁被其他进程占用而无法删除的文件。主要步骤包括枚举系统句柄、复制句柄、检查句柄类型和名称,针对文件句柄进行关闭操作。详细过程涉及到使用ZwQuerySystemInformation、ZwQueryObject、KeStackAttachProcess等API,并特别说明了在Win7 X64系统上的适用性。
摘要由CSDN通过智能技术生成

强制解锁文件

    强制解锁因其他进程占用而无法删除的文件。

1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄

2.打开拥有此句柄的进程并把此句柄复制到自己的进程

3.用 ZwQueryObject 查询句柄的类型和名称

4.如果 发现此句柄的类型是文件句柄, 名称和被锁定的文件一致,就关闭此句柄

5.重复 2、3、4 步,直到遍历完系统里所有的句柄

 

第4步中因为是要解锁其他进程占用的文件所以有如下细节:

1.用 KeStackAttachProcess“依附”到目标进程

2.用 ObSetHandleAttributes 设置句柄为“可以关闭”

3.用 ZwClose 关闭句柄

4.用 KeUnstackDetachProcess 脱离“依附”目标进程

 

以下代码适用于Win7  X64,如果想支持全系统,请对应调教。

 

 

#include <ntddk.h>
 
#define kprintf	DbgPrint
#define kmalloc(_s)	ExAllocatePoolWithTag(NonPagedPool, _s, 'SYSQ')
#define kfree(_p)	ExFreePool(_p)
 
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{
USHORT	UniqueProcessId;
USHORT	CreatorBackTraceIndex;
UCHAR	ObjectTypeIndex;
UCHAR	HandleAttributes;
USHORT	HandleValue;
PVOID	Object;
ULONG	GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
 
typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG64 NumberOfHandles;
SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
 
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryObject
(
HANDLE	Handle,
ULONG	ObjectInformationClass,
PVOID	ObjectInformation,
ULONG	ObjectInformationLength,
PULONG	ReturnLength OPTIONAL
);
 
NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation
(   
ULONG	SystemInformationClass,
PVOID	SystemInformation,
ULONG	SystemInformationLength,
PULONG	ReturnLength
);
 
NTSYSAPI
NTSTAT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值