【转】枚举系统句柄

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

作 者: 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\t\t\tTYPE:%wZ\n", &(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;
}
				
时间: 2024-10-17 17:37:26

【转】枚举系统句柄的相关文章

用Windows Native API枚举所有句柄及查找文件句柄对应文件名的方法

枚举所有句柄的方法 由于windows并没有给出枚举所有句柄所用到的API,和进程所拥有的句柄相关的只有GetProcessHandleCount这个函数,然而这个函数只能获取到和进程相关的句柄数,不能获取到实际的句柄,要获得句柄,我们必须使用未公开的Native API才可以. PS:网上有很多关于这类的方法,但几乎都是抄来抄去,很多连编译都过不了就直接放上去了(囧).我整理了一下方法,实测在win10和win7都可以用. NTSTATUS WINAPI NtQuerySystemInform

扫描系统句柄表(WIN7 x86)(附录源码)

PspCidTable存放着系统中所有的进程和线程对象,其索引也就是进程ID(PID)或线程ID(TID).先通过它来看看windbg里的HANDLE_TABLE结构: 可以看到地址 0x83f41bc4中存放的内容是 0x 8da010a8,这是系统的_HANDLE_TABLE的结构. 好了,现在windbg是得到HANDLE_TABLE结构了,还是要代码实现的.这里只简单用一下加偏移: //system进程的eprocess地址 PEPROCESS EProcess = (PEPROCESS

directX枚举系统设备类

void CSysEnumDlg::DisplayFullCategorySet(void){    USES_CONVERSION; HRESULT hr;    IEnumMoniker *pEmCat = 0;    ICreateDevEnum *pCreateDevEnum = NULL;    int nClasses=0; // Create an enumerator    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, C

枚举系统磁盘驱动器(使用GetLogicalDriveStrings API函数,system(&quot;pause&quot;); 很实用,还用到wcslen等函数)

代码如下: [cpp] view plain copy #include "stdafx.h" #include <vector> #include <string> #include <Windows.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { TCHAR  drives[128];             //存储所以驱动器名称 wchar_t* pDriv

OpenSSH利用处理畸形长度密码造成的时间差,枚举系统用户(CVE-2016-6210)

受影响版本: opensshd(< =最新版本) CVE-2016-6210 漏洞描述: 当我们使用ssh客户端去连接服务端的时候,如果向服务端发送一个大于10KB的密码,由于OpenSSH服务端会对user:password的组合,使用加密算法SHA256/SHA512进行加密.如果我们传输的是一个不存在的用户名,那么就不会进入sha256(user,password)加密流程,如果用户名存在,服务器将会针对这个10KB大的密码进行SHA256的加密,这里就会产生时间差. 测试脚本: impo

遍历PspCidTable表检测隐藏进程

一.PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程线程对象,其索引就是PID和TID. 2.PspCidTable中存放的直接是对象体(EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER). 3.PspCidTable是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来.注意访问对象时要掩

Ring3句柄表的枚举

由于windows并没有给出枚举所有句柄所用到的API,要获得句柄,我们必须使用未公开的Native API才可以,使用如下函数: NTSTATUS WINAPI NtQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, _Inout_ PVOID SystemInformation, _In_ ULONG SystemInformationLength, _Out_opt_ PULONG Re

CSP介绍、以及使用CryptoAPI枚举CSP并获取其属性

CSP,全名为"加密服务提供者(Cryptographic Service Provider)",是微软定义的一套密码服务API.目前常用的密码规范或者标准有3套:CSP,PKCS#11和国密标准.前两者主要是为RSA算法提供服务,当然PKCS#11最新的扩展也开始支持ECC算法.而国家密码管理制定的国密标准,主要提供SM2(实际上也是ECC)服务,当然国密标准同时支持RSA,不过大多数情况下RSA的应用还是使用CSP和PKCS#11来实现. 一.CSP为一个独立的密钥服务模块 CSP

Windowns API 第24篇 WTSEnumerateSessions 枚举session信息

函数原型: BOOL WTSEnumerateSessions( HANDLE hServer, DWORD Reserved, DWORD Version, PWTS_SESSION_INFO* ppSessionInfo, DWORD* pCount ); 作用:对当前系统的session信息进行枚举. 参数说明: hServer:指定要对终端断服务枚举的句柄,本机可以的话可以为WTS_CURRENT_SERVER_HANDLE, 或者NULL Reserved:系统保留位,必须为0 Ver