NtQueryObject 获得内核对象的信息

news/2024/11/9 16:09:17 标签: winapi, system, 数据结构, manager, struct, object

导读

玩过电脑的都知道,Widnows任务管理器,我们经常用它查看机器的CPU内存等信息,也用它杀死一些卡主的进程。

而作为开发人员,我们为了更了解进行的运行状况,就不得不说另外两个工具:

  • procexp.exe,某大佬写的Sysinternals系列工具中的其中一个工具,可查看操作系统中的各种信息,丰富无比,绝对的Windows瑞士军刀。
  • ProcessHacker.exe,功能和procexp.exe很像,不过是开源项目,学习Windows的可以看看它的实现。

今天我们就获取自己进程主线程的内核对象信息。

API介绍

一个内核对象有两个计数器:一个是句柄计数,句柄是给用户态用的;另一个是指针计数,也叫引用计数,因为核心态也常常用到内核对象,为了方便,在核心态的代码用指针直接访问对象,所以Object   Manager维护了这个指针引用计数。只有在句柄计数和引用计数都为0时,对象才被释放。一般而言,指针引用计数值比句柄计数值大。

再进一步,实际上,在用户态其实是可以查询一个内核对象的句柄计数和引用计数的。Ntdll.dll里导出的NtQueryObject函数可以查询内核对象的当前状态,只不过它没有被文档化。

参考微软官网 NtQueryObject function https://docs.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryobject

函数声明如下:
DWORD   WINAPI   NtQueryObject(   HANDLE   handle,   DWORD   nQueryIndex,   VOID*   pOutBuffer,   DWORD   cbInBufferSize,   VOID*   cbOutBufferSize);

handle   --   待查询的句柄
nQueryIndex   --   0为查询对象的当前状态,包括句柄计数,引用计数等等。
pOutBuffer   --   存放查询结果
cbInBufferSize   --   pOutBuffer的大小,注意,如果nQueryIndex为0,这里一定得是0x38
cbOutBufferSize   --   实际大小。

返回值:如果成功则返回0

pOutBuffer里返回的数据结构如下:
typedef   struct   _SYSTEM_HANDLE_STATE   {
DWORD   r1;
DWORD   GrantedAccess;
DWORD   HandleCount;   //   减1为句柄计数
DWORD   ReferenceCount;   //   减1为指针引用计数
DWORD   r5;
DWORD   r6;
DWORD   r7;
DWORD   r8;
DWORD   r9;
DWORD   r10;  
DWORD   r11;  
DWORD   r12;  
DWORD   r13;  
DWORD   r14;  
}SYSTEM_HANDLE_STATE,   *PSYSTEM_HANDLE_STATE;

功能实现

#include <string>
#include <ntdll/ntdll.h>
#pragma comment(lib,"ntdll.lib")

int test()
{
	HANDLE Handle = GetCurrentThread();
	OBJECT_BASIC_INFORMATION o_BASIC_INFORMATION;
	OBJECT_TYPE_INFORMATION o_TYPE_INFORMATION[10];
	OBJECT_NAME_INFORMATION o_NAME_INFORMATION;
	ULONG ReturnLength = 0;
	NtQueryObject(Handle, ObjectBasicInformation, &o_BASIC_INFORMATION, sizeof(o_BASIC_INFORMATION), &ReturnLength);
	NtQueryObject(Handle, ObjectNameInformation, &o_NAME_INFORMATION, sizeof(o_NAME_INFORMATION), &ReturnLength);
	NtQueryObject(Handle, ObjectTypeInformation, &o_TYPE_INFORMATION, o_BASIC_INFORMATION.TypeInfoSize, &ReturnLength);

	std::wstring TypeName(o_TYPE_INFORMATION[0].TypeName.Buffer, o_TYPE_INFORMATION[0].TypeName.Length / 2);
	std::wstring ObjName(L"[NULL]");
	if (o_NAME_INFORMATION.Name.Length)
	{
		ObjName.assign(o_NAME_INFORMATION.Name.Buffer, o_NAME_INFORMATION.Name.Length / 2);
	}
	printf("Name: %ws \nType: %ws \n \nGranted access:%8X \nReferences: %d \nHandles: %d \n", 
		ObjName.data(), TypeName.data(), o_BASIC_INFORMATION.GrantedAccess,
		o_BASIC_INFORMATION.PointerCount, o_BASIC_INFORMATION.HandleCount);
	return 0;
}

这里我们使用了https://github.com/x64dbg/x64dbg项目中的ntdll.hntdll.lib,里面讲ntdll中的函数及数据结构整理出来了,我们直接使用就行了,通过NtQueryObject接口,我们可以查询到丰富的句柄信息。运行结果如下:

ProcessHacker.exe查看的结果如下:

 内容基本相同,句柄数和引用数有差异,暂时不深入研究了。

 

参考资料

  • Process Hacker官网 https://processhacker.sourceforge.io/
  • NtQueryObject function https://docs.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryobject
  • qq群:夜猫逐梦技术交流裙/953949723

http://www.niftyadmin.cn/n/1710827.html

相关文章

启动rocketmq_windows 验证RocketMq 是否安装成功

安装过程参考&#xff1a;windows 安装rocketMQ1. 启动nameServerbin目录 cmd 执行&#xff1a;.mqnamesrv ,显示 name server boot success 启动成功&#xff01;启动broker执行&#xff1a;.mqbroker -n localhost:9876&#xff0c;显示The broker[LAPTOP-MDOLDHDA, 192.168.…

快速滚动_Win32编程基础之滚动条

&#xff08;图片来源&#xff1a;游戏《ATRI》通过使用滚动条&#xff0c;窗口可以显示比它大的文档或图片&#xff0c;用户可以滚动用户区中的数据对象来看到对象超出窗口边界的部分。如果窗口的用户区比窗口的边框要大&#xff0c;窗口应该使用滚动条。滚动条的方向决定了用…

TortoiseGit保存用户名密码

TortoiseGit在自己的用户目录下(%USERPROFILE%)新建_netrc增加文本内容如下&#xff1a;machine git.oschina.net login ***********.com password ******

ios 系统状态栏样式修改_iOS 导航栏颜色和状态栏颜色修改

(关于修改顶部状态栏背景以及前景色)首先,在看文章之前首先要知道 View controller-based status bar appearance这么一个key,在info.plist中进行配置info.plistiPhone的状态栏分为前景和背景,前景部分指的是显示电池, 时间等部分; 背景部分指的是白色(图bg1)或者黑色(图bg2)的…

DRF知识点与公钥私钥

1.等价 User.objects.get(id1) User.objects.filter(id1).first()Token.objects.update_or_create(useruser_obj,defaults{key:random_str} 更新或生成 Token 对象并修改 key字段&#xff0c;参数 有则更新&#xff0c;没有则创建2.django的缓存与时效 应用 django的 cache 模…

《Qt5开发及实例 第二版》学习笔记(第1章Qt概述)

前言&#xff1a; 由于工作安排开始使用QT开发&#xff0c;边学边写些笔记吧&#xff0c;欢迎大家交流。 选择QT的理由&#xff0c;最重要的就是跨平台&#xff0c;在这个快速发展的IT环境下&#xff08;在学校java-web开发刚开始火&#xff0c;占了招聘半壁江山&#xff0c;…

安卓禁用硬件加速_开/关大不同 Android4.0 GPU硬件加速实测

你也许会觉得Android4.0的升级之处不够多&#xff0c;无法让你有足够动力升级&#xff0c;但很多东西是隐藏在其中等待发掘的。倘若你此前对于Android系统的流畅度(好吧&#xff0c;尤其是应用程序的流畅度)不满&#xff0c;一定不要错过这篇小测试噢&#xff0c;或许它就能够帮…

Python生成词云图片

1.数据清洗 完整的分析过程&#xff1a; –数据的获取&#xff1a;通过爬虫获得&#xff08;urllib | requests <获取页面内容> re | bs4 <分析页面内容> &#xff09; –数据清洗&#xff1a;按照一定的格式文本进行处理 这里有本地文件 26425063.txt 规则是获得…