zoukankan      html  css  js  c++  java
  • 【转】枚举系统句柄

    标 题: 【原创】枚举系统句柄

    作 者: nightxie

    时 间: 2008-10-17,15:33:10

    链 接: http://bbs.pediy.com/showthread.php?t=74824

    之前我在这儿问了关于这个驱动的问题。感谢sudami的回复。。。问题解决了,这里把我的代码贴出来。。
    原来问的问题:

    引用:
    本来想写一个枚举句柄的驱动,可是不料出现了很奇怪的加载驱动失败的问题。我又太菜,看不出是为什么,所以跑过来请教各位大虾!

    奇怪的地方是在DriverEntry里加上AYA_EnumHandle函数后,加载就失败,就是连DriverEntry都进不去了。。。但是去掉AYA_EnumHandle就正常加载驱动了。。。我无语了。 完全晕了。。。。。。

    代码:

    一直在使用一个小工具叫unlocker。知道它是用关闭句柄的方法来删除文件的,但是自己也没有怎么研究过这东西。传说中更厉害的方法是直接向磁盘写0和Xcb大法,
    最近准备好好研究这些删除方法。那么就从句柄开始吧。这里我只做枚举句柄的工作,因为关闭句柄就是把ZwDuplicateObject
    的Options 这个参数赋值为DUPLICATE_CLOSE_SOURCE 。这里还要感谢一下sudami和NetRoc同学。。。O(∩_∩)O哈哈~ #include <ntddk.h> #define AYA_DEVICE L"\Device\EnumHandle" #define AYA_LINK L"\DosDevices\EnumHandle" #define SystemHandleInformation 16 #define OB_TYPE_PROCESS 5 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 { ULONG NumberOfHandles; SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[]; } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; typedef enum _OBJECT_INFORMATION_CLASS { ObjectBasicInformation, ObjectNameInformation, ObjectTypeInformation, ObjectAllInformation, ObjectDataInformation } OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS; typedef struct _OBJECT_BASIC_INFORMATION { ULONG Attributes; ACCESS_MASK DesiredAccess; ULONG HandleCount; ULONG ReferenceCount; ULONG PagedPoolUsage; ULONG NonPagedPoolUsage; ULONG Reserved[3]; ULONG NameInformationLength; ULONG TypeInformationLength; ULONG SecurityDescriptorLength; LARGE_INTEGER CreationTime; } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; typedef struct _KOBJECT_NAME_INFORMATION { UNICODE_STRING Name; WCHAR NameBuffer[]; } KOBJECT_NAME_INFORMATION, *PKOBJECT_NAME_INFORMATION;
    typedef struct _OBJECT_TYPE_INFORMATION {
    	UNICODE_STRING          TypeName;
    	ULONG                   TotalNumberOfHandles;
    	ULONG                   TotalNumberOfObjects;
    	WCHAR                   Unused1[8];
    	ULONG                   HighWaterNumberOfHandles;
    	ULONG                   HighWaterNumberOfObjects;
    	WCHAR                   Unused2[8];
    	ACCESS_MASK             InvalidAttributes;
    	GENERIC_MAPPING         GenericMapping;
    	ACCESS_MASK             ValidAttributes;
    	BOOLEAN                 SecurityRequired;
    	BOOLEAN                 MaintainHandleCount;
    	USHORT                  MaintainTypeList;
    	POOL_TYPE               PoolType;
    	ULONG                   DefaultPagedPoolCharge;
    	ULONG                   DefaultNonPagedPoolCharge;
    } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
    
    
    
    NTSYSAPI
    NTSTATUS
    NTAPI
    ZwQueryObject(
    IN HANDLE Handle,
    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    OUT PVOID ObjectInformation,
    IN ULONG ObjectInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );
     
     
    NTSYSAPI
    NTSTATUS
    NTAPI
    ZwQuerySystemInformation(
    ULONG    SystemInformationClass,
    PVOID    SystemInformation,
    ULONG    SystemInformationLength,
    PULONG    ReturnLength
    );
    NTSYSAPI
    NTSTATUS
    NTAPI
    ZwDuplicateObject(
    IN HANDLE SourceProcessHandle,
    IN HANDLE SourceHandle,
    IN HANDLE TargetProcessHandle OPTIONAL,
    OUT PHANDLE TargetHandle OPTIONAL,
    IN ACCESS_MASK DesiredAccess,
    IN ULONG HandleAttributes,
    IN ULONG Options
    );
     
    NTSYSAPI
    NTSTATUS
    NTAPI
    ZwOpenProcess(
    OUT PHANDLE             ProcessHandle,
    IN ACCESS_MASK          AccessMask,
    IN POBJECT_ATTRIBUTES   ObjectAttributes,
    IN PCLIENT_ID           ClientId
    );
     
     
    NTSTATUS NTAPI AYA_EnumHandle();
    void AYA_Unload(IN PDRIVER_OBJECT pDriverObj)
    {
    	UNICODE_STRING Temp;
    	RtlInitUnicodeString(&Temp, AYA_LINK);
    	IoDeleteSymbolicLink(&Temp);
    	IoDeleteDevice(pDriverObj->DeviceObject);
    }
     
    NTSTATUS AYA_Dispatch(IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp)
    {
    	NTSTATUS ns = STATUS_SUCCESS;
    	PIO_STACK_LOCATION stIrp;
     
    	stIrp = IoGetCurrentIrpStackLocation(pIrp);
     
    	switch (stIrp->MajorFunction)
    	{
    	case IRP_MJ_CREATE:
    		break;
    	case IRP_MJ_CLOSE:
    		break;
    	case IRP_MJ_DEVICE_CONTROL:
    		break;
    	default:
    		pIrp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    		break;
    	}
     
    	ns = pIrp->IoStatus.Status;
    	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    	return ns;
    }
     
    NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObj, IN PUNICODE_STRING RegistryPath)
    {
    	NTSTATUS ns = STATUS_SUCCESS;
    	UNICODE_STRING AYA;
    	UNICODE_STRING AYAL;
    	PDEVICE_OBJECT pDevice;
     
    	ns = AYA_EnumHandle();
    	RtlInitUnicodeString(&AYA, AYA_DEVICE);
    	ns = IoCreateDevice(pDriverObj, 0, &AYA, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice);
     
    	RtlInitUnicodeString(&AYAL, AYA_LINK);
    	ns = IoCreateSymbolicLink(&AYAL, &AYA);
     
    	pDriverObj->MajorFunction[IRP_MJ_CREATE] =
    		pDriverObj->MajorFunction[IRP_MJ_CLOSE] =
    		pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AYA_Dispatch;
     
    	pDriverObj->DriverUnload = AYA_Unload;
     
     
    	return ns;
     
    }
     
     
    NTSTATUS AYA_EnumHandle()
    {
    	NTSTATUS ns = STATUS_SUCCESS;
    	ULONG ulSize;
    	PVOID pSysBuffer;
    	PSYSTEM_HANDLE_INFORMATION pSysHandleInfo;
    	SYSTEM_HANDLE_TABLE_ENTRY_INFO pSysHandleTEI;
    	OBJECT_BASIC_INFORMATION BasicInfo;
    	PKOBJECT_NAME_INFORMATION pNameInfo;
    	POBJECT_TYPE_INFORMATION pTypeInfo;
    	OBJECT_ATTRIBUTES oa;
    	ULONG ulProcessID;
    	HANDLE hProcess;
    	HANDLE hHandle;
    	HANDLE hDupObj;
    	CLIENT_ID cid;
    	ULONG i;
     
    	ulSize = 100;
    	do
    	{
    		pSysBuffer = ExAllocatePoolWithTag(PagedPool, ulSize, 'A0');
    		ns = ZwQuerySystemInformation(SystemHandleInformation, pSysBuffer, ulSize, NULL);
    		ulSize *= 2;
    		if (!NT_SUCCESS(ns))
    		{
    			ExFreePool(pSysBuffer);
    		}
     
    	} while (!NT_SUCCESS(ns));
     
     
    	pSysHandleInfo = (PSYSTEM_HANDLE_INFORMATION)pSysBuffer;
    	for (i = 0; i < pSysHandleInfo->NumberOfHandles; i++)
    	{
    		pSysHandleTEI = pSysHandleInfo->Handles[i];
     
    		if (pSysHandleTEI.ObjectTypeIndex != OB_TYPE_PROCESS)
    		{
    			continue;
    		}
     
    		ulProcessID = (ULONG)pSysHandleTEI.UniqueProcessId;
    		cid.UniqueProcess = (HANDLE)ulProcessID;
    		cid.UniqueThread = (HANDLE)0;
    		hHandle = (HANDLE)pSysHandleTEI.HandleValue;
     
     
    		InitializeObjectAttributes(&oa, NULL, 0, NULL, NULL);
    		ns = ZwOpenProcess(&hProcess, PROCESS_DUP_HANDLE, &oa, &cid);
    		if (!NT_SUCCESS(ns))
    		{
    			KdPrint(("ZwOpenProcess : Fail "));
    			break;
    		}
    		ns = ZwDuplicateObject(hProcess, hHandle, NtCurrentProcess(), &hDupObj, 
    			PROCESS_ALL_ACCESS, 0, DUPLICATE_SAME_ACCESS);
     
    		if (!NT_SUCCESS(ns))
    		{
    			KdPrint(("ZwDuplicateObject : Fail "));
    			break;
    		}
     
    		ZwQueryObject(hDupObj, ObjectBasicInformation, &BasicInfo, 
    			sizeof(OBJECT_BASIC_INFORMATION), NULL);
     
    		pNameInfo = ExAllocatePoolWithTag(PagedPool, BasicInfo.NameInformationLength, 'A1');
    		RtlZeroMemory(pNameInfo, BasicInfo.NameInformationLength);
     
    		ZwQueryObject(hDupObj, ObjectNameInformation, pNameInfo, 
    			BasicInfo.NameInformationLength, NULL);
     
    		pTypeInfo = ExAllocatePoolWithTag(PagedPool, BasicInfo.TypeInformationLength, 'A2');
    		RtlZeroMemory(pTypeInfo, BasicInfo.TypeInformationLength);
     
    		ZwQueryObject(hDupObj, ObjectTypeInformation, pTypeInfo, 
    			BasicInfo.TypeInformationLength, NULL);
     
    		KdPrint(("NAME:%wZ			TYPE:%wZ
    ", &(pNameInfo->Name), &(pTypeInfo->TypeName)));
     
    		ExFreePool(pNameInfo);
    		ExFreePool(pTypeInfo);
     
    	}
     
    	ZwClose(hDupObj);
    	ZwClose(hProcess);
    	ZwClose(hHandle);
    	ExFreePool(pSysBuffer);
     
    	if (!NT_SUCCESS(ns))
    	{
    		return STATUS_UNSUCCESSFUL;
    	}
     
    	return ns;
    }
    
    
  • 相关阅读:
    rpm -ivh 这个ivh是干什么的
    记录各种资源链接的吧
    Bootstrap中表单控件状态(验证状态)
    jquery input 实时监听输入
    socket.error: [Errno 98] Address already in use
    bad interpreter: Text file busy
    Linux下安装pip(遇到了python2.6升级为python2.7道路上的坑,原因已经找到,只差临门一脚了,以后补上)
    完全卸载mysql数据库教程
    数字签名证书的事儿(转)
    设计模式-外观模式
  • 原文地址:https://www.cnblogs.com/Lthis/p/4207669.html
Copyright © 2011-2022 走看看