用户句柄表的遍历

2023-05-16

私有句柄表
_HANDLE_TABLE_ENTRY的Object直接指向_OBJECT_HEADER不用减

#include <ntifs.h>

//一个页最大容纳的_HANDLE_TABLE_ENTRY
#define MAX_ENTRY_COUNT (0x1000/sizeof(HANDLE_TABLE_ENTRY))  

//未公开未文档化
typedef PVOID(NTAPI *OBGETOBJECTTYPE)(IN PVOID pObject);
EXTERN_C NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS Process);

OBGETOBJECTTYPE ObGetObjectType = 0;
//OBGETOBJECTTYPE ObGetObjectType = 0x840ac7bd;
//OBGETOBJECTTYPE ObGetObjectType = 0xfffff80004170eb4;

ULONG g_FlagLevel = 0;
//x64
typedef struct _HANDLE_TABLE
{
	ULONGLONG TableCode;                                                    //0x0
	PVOID QuotaProcess;														//0x8
	VOID* UniqueProcessId;                                                  //0x10
	ULONG64 HandleLock;														//0x18
	struct _LIST_ENTRY HandleTableList;                                     //0x20
	ULONG64 HandleContentionEvent;											//0x30
	PVOID DebugInfo;														//0x38
	LONG ExtraInfoPages;                                                    //0x40
	union
	{
		ULONG Flags;                                                        //0x44
		UCHAR StrictFIFO : 1;                                               //0x44
	};
	ULONG FirstFreeHandle;                                                  //0x48
	struct _HANDLE_TABLE_ENTRY* LastFreeHandleEntry;                        //0x50
	ULONG HandleCount;                                                      //0x58
	ULONG NextHandleNeedingPool;                                            //0x5c
	ULONG HandleCountHighWatermark;                                         //0x60
}HANDLE_TABLE, *PHANDLE_TABLE;

typedef struct _HANDLE_TABLE_ENTRY
{
	union
	{
		//86 64..
		ULONG_PTR Object;                                                   //0x0
		ULONG ObAttributes;                                                 //0x0
																			//86 64
		struct _HANDLE_TABLE_ENTRY_INFO* InfoTable;                         //0x0
		ULONG_PTR Value;                                                    //0x0
	};
	union
	{
		ULONG GrantedAccess;                                                //0x8
		struct
		{
			USHORT GrantedAccessIndex;                                      //0x8
			USHORT CreatorBackTraceIndex;                                   //0xa
		};
		ULONG NextFreeTableEntry;                                           //0x8
	};
}HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

typedef struct _OBJECT_TYPE_INITIALIZER {
	USHORT				wLength;
	UCHAR				ObjectTypeFlags;
	ULONG				ObjcetTypeCode;
	ULONG				InvalidAttributes;
	GENERIC_MAPPING		GenericMapping;
	ULONG				ValidAccessMask;
	ULONG				RetainAccess;
	ULONG				PoolType;
	ULONG				DefaultPagedPoolCharge;
	ULONG				DefaultNonPagedPoolCharge;
	ULONG_PTR			DumpProcedure;
	ULONG_PTR			OpenProcedure;
	ULONG_PTR			CloseProcedure;
	ULONG_PTR			DeleteProcedure;
	ULONG_PTR			ParseProcedure;
	ULONG_PTR			SecurityProcedure;
	ULONG_PTR			QueryNameProcedure;
	ULONG_PTR			OkayToCloseProcedure;
}OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;

typedef struct _OBJECT_TYPE {
	LIST_ENTRY					TypeList;
	UNICODE_STRING				Name;
	ULONG_PTR					DefaultObject;
	UCHAR						Index;
	ULONG						TotalNumberOfObjects;
	ULONG						TotalNumberOfHandles;
	ULONG						HighWaterNumberOfObjects;
	ULONG						HighWaterNumberOfHandles;
	OBJECT_TYPE_INITIALIZER		TypeInfo;
	ULONGLONG					TypeLock;
	ULONG						Key;
	LIST_ENTRY					CallbackList;
}OBJECT_TYPE, *POBJECT_TYPE;

typedef struct _LDR_DATA_TABLE_ENTRY
{
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY InMemoryOrderLinks;
	LIST_ENTRY InInitializationOrderLinks;
	PVOID DllBase;
	PVOID EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT TlsIndex;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
//判断多少个Object

ULONG_PTR  ObjectCount = 0;

UCHAR x64CodeFlag[] = { 0x0F,0xB6,0x41,0xE8,0x48,0x8D,0x0D,0xC1,0x1C,0xF0,0xFF,0x48,0x8B,0x04,0xC1,0xC3 };
UCHAR x86CodeFlag[] = { 0x8b,0xff,0x55,0x8b,0xec,0x8b,0x45,0x08,0x0f,0xb6,0x40,0xf4,0x8b,0x04,0x85,0x00,0x79,0xf9,0x83,0x5d,0xc2,0x04,0x00,0x90,0x90,0x90,0x90,0x90,0x8b,0xff,0x55,0x8b };


NTSTATUS FindObGetObjectType(PULONG_PTR retFunAddr, PDRIVER_OBJECT pDriver)
{
	ULONG_PTR PEBase = 0;
	ULONG PESize = 0;
	PLIST_ENTRY DriverList = NULL;
	PLIST_ENTRY NextList = NULL;
	UNICODE_STRING usDriverName;
	PUNICODE_STRING pusDriverName = NULL;
	RtlInitUnicodeString(&usDriverName, L"ntoskrnl.exe");
	DriverList = (PLIST_ENTRY)pDriver->DriverSection;
	NextList = DriverList;
	do
	{
		//0x58 BaseDllName
		PLDR_DATA_TABLE_ENTRY pEntry = (PLDR_DATA_TABLE_ENTRY)((ULONG_PTR)NextList);
#ifdef _WIN64
		pusDriverName = (PUNICODE_STRING)((ULONG_PTR)NextList + 0x058);
#else
		pusDriverName = (PUNICODE_STRING)((ULONG_PTR)NextList + 0x2C);
#endif // _WIN64
		if (!RtlCompareUnicodeString(&usDriverName, pusDriverName, TRUE))
		{
			PEBase = pEntry->DllBase;
			PESize = (pEntry->SizeOfImage);
			break;
		}
		NextList = NextList->Flink;
	} while (NextList != DriverList);
	
	for (size_t i = 0; i <= PESize; i++)
	{
		PULONG_PTR pCode = (PULONG_PTR)(PEBase + i);
		//必须判断  不然直接蓝
		if (!MmIsAddressValid((PVOID)pCode))
		{
			//KdPrint(("无效页:%I64x\n", i));
			i = i + 0xfff;
			continue;
		}
#ifdef _WIN64
		if (memcmp((void*)pCode, x64CodeFlag, 16) == 0)
#else
		if (memcmp((void*)pCode, x86CodeFlag, 32) == 0)
#endif // _WIN64
		{
			*retFunAddr = pCode;
			return STATUS_SUCCESS;
		}
	}
	return -1;
}

NTSTATUS LookupProcessByName(PCHAR szTarName,PEPROCESS* pEPROCESS)
{
	ULONG_PTR pEprocess = NULL;
	pEprocess = (PEPROCESS)PsGetCurrentProcess();
#ifdef _WIN64
	PLIST_ENTRY pHeadNode = (PLIST_ENTRY)(pEprocess + 0x188);
#else
	PLIST_ENTRY pHeadNode = (PLIST_ENTRY)(pEprocess + 0xb8);
#endif // _WIN64
	PLIST_ENTRY pNextNode = pHeadNode;
	do
	{
#ifdef _WIN64
		pEprocess = (ULONG_PTR)pNextNode - 0x188;
		PCHAR ProcessName = (ULONG_PTR)(pEprocess + 0x2e0);
#else
		pEprocess = (ULONG_PTR)pNextNode - 0xb8;
		PCHAR ProcessName = (ULONG_PTR)(pEprocess + 0x16C);
#endif // _WIN64
		
		if (strcmp(ProcessName, szTarName) == 0)
		{
			*pEPROCESS = pEprocess;
			return STATUS_SUCCESS;
		}
		pNextNode = pNextNode->Blink;
	} while (pNextNode != pHeadNode);
	return -1;
}

SIZE_T FindCidTablePrivate(PCHAR szName)
{
	PEPROCESS pEprocess;
	ULONG_PTR CidTableAddr = 0;
	DbgBreakPoint();
	if (LookupProcessByName(szName, &pEprocess) == -1)
	{
		DbgPrint("未找到私有句柄表");
		return -1;
	}
#ifdef _WIN64
	CidTableAddr = (ULONG_PTR)pEprocess + 0x200;
#else
	CidTableAddr = (ULONG_PTR)pEprocess + 0x0f4;
#endif // __WIN64
	return CidTableAddr;
}

NTSTATUS Operation0(ULONG_PTR TableCode)
{
	PHANDLE_TABLE_ENTRY HandleTableEntry = NULL;
	ULONG Index = 0;
	HandleTableEntry = (PHANDLE_TABLE_ENTRY)((ULONG_PTR*)(TableCode));


	for (Index = 0; Index < (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY)); Index++)
	{
		if (MmIsAddressValid((PVOID)HandleTableEntry))
		{
			PVOID ObjectHeader = (PVOID)(*(ULONG_PTR*)HandleTableEntry & ~3);
			if (MmIsAddressValid(ObjectHeader))
			{
#ifdef _WIN64
				POBJECT_TYPE pObjectType = ObGetObjectType((ULONG_PTR)ObjectHeader + 0x30);
#elif  _WIN32
				
				POBJECT_TYPE pObjectType = ObGetObjectType((ULONG_PTR)ObjectHeader + 0x18);
#endif // _WIN64

				if (MmIsAddressValid(ObjectHeader))   //这里应当判断对象是否合法
				{
					//打印数量以及ObjectBody的地址
					ObjectCount++;
#ifdef _WIN64
					DbgPrint("句柄类型:%-16wZ   句柄:0x%-08X  句柄对象(BODY):0x%-llX  句柄类型代号:%-2d  引用计数:%-6d\r ", &(pObjectType->Name), (g_FlagLevel*MAX_ENTRY_COUNT + Index) * 4, (ULONG_PTR)ObjectHeader + 0x30, pObjectType->Index, *((PULONG_PTR)ObjectHeader));
#else 
					DbgPrint("句柄类型:%-16wZ   句柄:0x%-08X  句柄对象:0x%-08X  句柄类型代号:%-2d  引用计数:%-6d\r ",&(pObjectType->Name), (g_FlagLevel*MAX_ENTRY_COUNT +Index)*4, (ULONG_PTR)ObjectHeader + 0x18,pObjectType->Index,*((PULONG_PTR)ObjectHeader));
#endif // _WIN64
				}
			}
		}
		HandleTableEntry++;     //结构体指针++ 越过当前这个结构体
	}
	g_FlagLevel++;				//用于计算句柄编号
	return STATUS_SUCCESS;
}

NTSTATUS EnumProcessByHandle(PDRIVER_OBJECT pDriver)
{
	FindObGetObjectType(&ObGetObjectType, pDriver);
	PHANDLE_TABLE_ENTRY *TableLevel1, **TableLevel3;
	ULONG_PTR CidTableAddr = FindCidTablePrivate("explorer.exe");
	if (CidTableAddr == -1)
	{
		DbgPrint("获取Table失败!");
		return -1;
	}
	ULONG_PTR TableCode = *(ULONG_PTR*)(*(ULONG_PTR*)(CidTableAddr));

	ULONG_PTR TableLevel = TableCode & 3;
	TableCode = TableCode & (~3);
	switch (TableLevel)
	{
	case 0:
	{
		Operation0(TableCode);
		break;
	}
	case 1:
	{
		TableLevel1 = TableCode;
		SIZE_T i = 0;
		//计算句柄数,遍历一次 加_HANDLE_TABLE_ENTRY
		g_FlagLevel = 0;
		while (TableLevel1[i])
		{
			Operation0(TableLevel1[i]);
			i++;
		}
		break;
	}

	}

}
NTSTATUS DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("Driver Unload!\n");
	return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegpath)
{
	EnumProcessByHandle(pDriver);
	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户句柄表的遍历 的相关文章

随机推荐

  • 【故障诊断】【git】git只能下载一个分支,怎么办?

    很多朋友可能都会遇到一个问题 xff0c 就是远程的git明明有两个分支 xff0c 但是却只能下载一个 xff0c 这样该怎么处理呢 xff1f 首先要澄清 xff0c git clone确实只能下载一个分支 xff0c 我们只能先把ma
  • 23种设计模式

    目录 创建型 1 Factory Method xff08 工厂方法 xff09 2 Abstract Factory xff08 抽象工厂 xff09 3 Builder xff08 建造者 xff09 4 Prototype xff08
  • Docker的asp.net core应用部署系列目录(完结)

    第一章 实验基础环境 本系列将用VirtualBox虚拟机安装ubuntu desktop 18 版本进行演示 xff0c 安装方式自行探索 xff0c 亦可购买各种云的linux服务器 章节间多少有依赖 xff0c 请根据自身情况跳过熟悉
  • Docker的asp.net core应用部署系列—— docker运行asp.net core应用镜像

    本系列目录请看这里 https blog csdn net michel4liu article details 80819510 我们接着上篇 xff0c 已经编译好镜像 xff0c 本篇将介绍两种启动方式 xff0c 交互模式启动和后台
  • Docker的asp.net core应用部署系列——进入正在运行的docker容器里面

    本系列目录请看这里 https blog csdn net michel4liu article details 80819510 我们之前已经可以通过交互或后台方式启动一个容器 xff0c 有时我们需要进入docker里面看一些log或者
  • DATAX:MongoDB增量数据写入到mysql中

    项目场景 xff1a 简述 xff1a 使用DATAX进行Mongo的数据抽取 xff0c 然后写入到mysql中 xff0c 其中会牵涉到全量数据的写入和增量数据的写入 全量 数据的写入我们只需要正常写JSON模板即可 xff0c 使用c
  • 无人机自动驾驶软件系列 E04

    无人机自动驾驶软件系列 E04 xff1a 深度估计 xff0c 八叉树地图以及路径规划 详细配置https gaas gitbook io guide software realization build your own autonom
  • Window11安装如何跳过TPM2.0这一步

    最近想体验一把window11 xff0c 怎奈自己的电脑太老了 xff0c 显示不能安装 xff0c 网上大佬们都说是tpm2 0的问题 xff0c 顺着这个角度 xff0c 找到了一个国外大神的解决办法 1 在出现 Win11 会提示
  • 修改已运行Docker容器的端口映射

    方法一 删除容器 xff0c 重新新建容器多加一个 p端口映射即可 方法二 修改容器配置文件 重启docker服务 模拟创建运行中的容器 span class token punctuation span root 64 redmine t
  • e指数函数

    使用win自带的计算器 xff0c 进行以e为底的指数函数进行运算时 xff0c 发现计算器上的EXP键只能用做表示10的多少次方 xff0c 如5e3 xff0c 指的是5乘以10的3次方 xff0c 及5000 查了一下 xff0c 也
  • xsens惯导在ROS下输出汇总

    rostopic list 分别记录下每个对应的信息 xff1a 1 rostopic echo diagnostics header seq 454 stamp secs 1572609754 nsecs 307622909 frame
  • c 编程中extern关键字 使用跨文件全局变量

    我们知道 xff0c 程序的编译单位是源程序文件 xff0c 一个源文件可以包含一个或若干个函数 在函数内定义的变量是局部变量 xff0c 而在函数之外定义的变量则称为外部变量 xff0c 外部变量也就是我们所讲的全局变量 它的存储方式为静
  • 年度回忆录(?——2011.01)

    这是在CSDN 上的第一篇总结 xff08 或者说是回忆录 xff09 xff0c 个人认为 xff1a 总结 xff0c 尤其是年度总结是十分必要的 她可以很好的映射出自己以往的不足 xff0c 并为自己下一步的学习指明方向 以前在网易上
  • 使用JMF实现java写自己的视频播放器

    JMF这个多媒体开发框架太牛了 xff0c 简单的几句代码就能实现一个视频播放器的开发 xff0c 厉害 xff0c 就是支持的格式少了一些 xff0c 没关系 xff0c 这个视频播放器可以播放mpg xff0c avi fvl等等 xf
  • 相机标定:关键点法 vs 直接法

    相机标定中最常见的方法是关键点法 xff0c 比如 OpenCV 和 MatLab 中使用棋盘格 圆阵列等二维图案进行标定 xff0c 这上面的棋盘格角点和圆心就是所谓的关键点 虽然关键点法有很多优点 xff0c 但在某些情况下容易遇到标定
  • 8本推荐游戏开发书籍

    很多刚刚接触游戏开发的朋友经常问我 xff1a 如何开始学习游戏开发 xff1f 我从事游戏开发行业很多年了 xff0c 坦率地讲 xff0c 开发游戏充满挑战性 xff0c 需要开发人员具备大量的技能与积极的创新精神 希望这篇小文能帮助朋
  • Maxwell启动停止脚本

    Maxwell启动停止脚本 进入 maxwell bin nbsp 直接运行下面的内容 生成脚本 bin bash description maxwell File maxwell Description Starts and stops
  • Epoll 的time_out参数引发的cpu占用问题

    转自 xff1a https www cnblogs com Jimmy104 p 5258205 html 针对自己写的一个服务器网络引擎Engine 文章后面附上源码 使用epoll 刚刚开始时候发现占用CPU 特别高 xff0c 但是
  • 【周志华机器学习】集成学习

    第八章 集成学习 个体与集成BoostingBagging 与随机森林Bagging随机森林 结合策略平均法投票法学习法 多样性 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务 xff0c 也被称为多分类器系统 集成学习的一般结
  • 用户句柄表的遍历

    私有句柄表 HANDLE TABLE ENTRY的Object直接指向 OBJECT HEADER不用减 span class token macro property span class token directive hash spa