遍历驱动类型


#include"ntifs.h"
typedef VOID(__stdcall FUNCT_00A4_0EDA_DumpProcedure) (VOID*, struct _OBJECT_DUMP_CONTROL*);
typedef LONG32(__stdcall FUNCT_000F_0EE2_OpenProcedure) (enum _OB_OPEN_REASON, CHAR, struct _EPROCESS*, VOID*, ULONG32*, ULONG32);
typedef VOID(__stdcall FUNCT_00A4_0EF0_CloseProcedure) (struct _EPROCESS*, VOID*, ULONG32, ULONG32);
typedef VOID(__stdcall FUNCT_00A4_0665_Free_InterfaceReference_InterfaceDereference_DeleteProcedure_WorkerRoutine_Callback_ReleaseFromLazyWrite_ReleaseFromReadAhead) (VOID*);
typedef LONG32(__stdcall FUNCT_000F_0EF6_ParseProcedure) (VOID*, VOID*, struct _ACCESS_STATE*, CHAR, ULONG32, struct _UNICODE_STRING*, struct _UNICODE_STRING*, VOID*, struct _SECURITY_QUALITY_OF_SERVICE*, VOID**);
typedef LONG32(__stdcall FUNCT_000F_0F02_SecurityProcedure) (VOID*, enum _SECURITY_OPERATION_CODE, ULONG32*, VOID*, ULONG32*, VOID**, enum _POOL_TYPE, struct _GENERIC_MAPPING*, CHAR);
typedef LONG32(__stdcall FUNCT_000F_0F13_QueryNameProcedure) (VOID*, UINT8, struct _OBJECT_NAME_INFORMATION*, ULONG32, ULONG32*, CHAR);
typedef UINT8(__stdcall FUNCT_0067_0F1B_OkayToCloseProcedure) (struct _EPROCESS*, VOID*, VOID*, CHAR);

typedef struct _OBJECT_TYPE_INITIALIZER                                                                                                                             // 25 elements, 0x50 bytes (sizeof) 
{
	/*0x000*/     UINT16       Length;
	union                                                                                                                                                           // 2 elements, 0x1 bytes (sizeof)   
	{
		/*0x002*/         UINT8        ObjectTypeFlags;
		struct                                                                                                                                                      // 7 elements, 0x1 bytes (sizeof)   
		{
			/*0x002*/             UINT8        CaseInsensitive : 1;                                                                                                                       // 0 BitPosition                    
			/*0x002*/             UINT8        UnnamedObjectsOnly : 1;                                                                                                                    // 1 BitPosition                    
			/*0x002*/             UINT8        UseDefaultObject : 1;                                                                                                                      // 2 BitPosition                    
			/*0x002*/             UINT8        SecurityRequired : 1;                                                                                                                      // 3 BitPosition                    
			/*0x002*/             UINT8        MaintainHandleCount : 1;                                                                                                                   // 4 BitPosition                    
			/*0x002*/             UINT8        MaintainTypeList : 1;                                                                                                                      // 5 BitPosition                    
			/*0x002*/             UINT8        SupportsObjectCallbacks : 1;                                                                                                               // 6 BitPosition                    
		};
	};
	/*0x004*/     ULONG32      ObjectTypeCode;
	/*0x008*/     ULONG32      InvalidAttributes;
	/*0x00C*/     struct _GENERIC_MAPPING GenericMapping;                                                                                                                         // 4 elements, 0x10 bytes (sizeof)  
	/*0x01C*/     ULONG32      ValidAccessMask;
	/*0x020*/     ULONG32      RetainAccess;
	/*0x024*/     enum _POOL_TYPE PoolType;
	/*0x028*/     ULONG32      DefaultPagedPoolCharge;
	/*0x02C*/     ULONG32      DefaultNonPagedPoolCharge;
	/*0x030*/     FUNCT_00A4_0EDA_DumpProcedure* DumpProcedure;
	/*0x034*/     FUNCT_000F_0EE2_OpenProcedure* OpenProcedure;
	/*0x038*/     FUNCT_00A4_0EF0_CloseProcedure* CloseProcedure;
	/*0x03C*/     FUNCT_00A4_0665_Free_InterfaceReference_InterfaceDereference_DeleteProcedure_WorkerRoutine_Callback_ReleaseFromLazyWrite_ReleaseFromReadAhead* DeleteProcedure;
	/*0x040*/     FUNCT_000F_0EF6_ParseProcedure* ParseProcedure;
	/*0x044*/     FUNCT_000F_0F02_SecurityProcedure* SecurityProcedure;
	/*0x048*/     FUNCT_000F_0F13_QueryNameProcedure* QueryNameProcedure;
	/*0x04C*/     FUNCT_0067_0F1B_OkayToCloseProcedure* OkayToCloseProcedure;
}OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;                                                                                                                    // 2 elements, 0x1 bytes (sizeof)   


typedef struct _OBJECT_TYPE                   // 12 elements, 0x88 bytes (sizeof) 
{
	/*0x000*/     struct _LIST_ENTRY TypeList;              // 2 elements, 0x8 bytes (sizeof)   
	/*0x008*/     struct _UNICODE_STRING Name;              // 3 elements, 0x8 bytes (sizeof)   
	/*0x010*/     VOID*        DefaultObject;
	/*0x014*/     UINT8        Index;
	/*0x015*/     UINT8        _PADDING0_[0x3];
	/*0x018*/     ULONG32      TotalNumberOfObjects;
	/*0x01C*/     ULONG32      TotalNumberOfHandles;
	/*0x020*/     ULONG32      HighWaterNumberOfObjects;
	/*0x024*/     ULONG32      HighWaterNumberOfHandles;
	/*0x028*/     struct _OBJECT_TYPE_INITIALIZER TypeInfo; // 25 elements, 0x50 bytes (sizeof) 
	/*0x078*/      EX_PUSH_LOCK TypeLock;            // 7 elements, 0x4 bytes (sizeof)   
	/*0x07C*/     ULONG32      Key;
	/*0x080*/     struct _LIST_ENTRY CallbackList;          // 2 elements, 0x8 bytes (sizeof)   
}OBJECT_TYPE, *POBJECT_TYPE;
POBJECT_TYPE shuchu_OBJECT_TYPE;

VOID xiezai1(PDRIVER_OBJECT qudongduixiang)
{
	ExFreePool(shuchu_OBJECT_TYPE);
	KdPrint(("驱动卸载"));
}

NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang, PUNICODE_STRING zhucebiao)
{
	KdPrint(("驱动开始"));

	UNICODE_STRING mingzi;
	UNICODE_STRING mingzi_linshi;
	PVOID m_obgetobjecttype;
	ULONG *ObTypeIndexTable;
	ULONG i = 2;

	shuchu_OBJECT_TYPE = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
	RtlInitUnicodeString(&mingzi, L"ObGetObjectType");
	RtlInitUnicodeString(&mingzi_linshi, L"process");
	
	m_obgetobjecttype = MmGetSystemRoutineAddress(&mingzi);
	if (MmIsAddressValid(m_obgetobjecttype))
	{
		KdPrint(("m_obgetobjecttype %x", m_obgetobjecttype));
		ObTypeIndexTable = *(ULONG**)((ULONG)m_obgetobjecttype + 15);
		while (ObTypeIndexTable[i])
		{
			RtlCopyMemory(shuchu_OBJECT_TYPE, (POBJECT_TYPE)ObTypeIndexTable[i], sizeof(OBJECT_TYPE));
			KdPrint(("ObTypeIndexTable[%d %x]:%wZ  __%wZ", i, i, ObTypeIndexTable[i] + 8, &shuchu_OBJECT_TYPE->Name));
			if (RtlCompareUnicodeString(&shuchu_OBJECT_TYPE->Name, &mingzi_linshi,TRUE)==0)
			{
				KdPrint(("OpenProcedure%x", shuchu_OBJECT_TYPE->TypeInfo.OpenProcedure));
				KdPrint(("CloseProcedure%x", shuchu_OBJECT_TYPE->TypeInfo.CloseProcedure));
				KdPrint(("DeleteProcedure%x", shuchu_OBJECT_TYPE->TypeInfo.DeleteProcedure));
			}
			i++;
		}
	}
	//实体对象 根据 对象头 能查找标号 进而得到名字
	qudongduixiang->DriverUnload = xiezai1;
	return STATUS_SUCCESS;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值