找到包含设备名称的内核结构

逆向工程 视窗 风袋 内核模式
2021-06-28 00:50:36

我正在使用 WinDbg 尝试枚举驱动程序及其相关设备。获取驱动程序名称非常容易。它位于_DRIVER_OBJECT结构中。不幸的是,_DEVICE_OBJECT不包含设备名称。

使用!devobj命令我可以看到设备的名称,但我想找到包含名称的表/结构。

2个回答

因此,假设如您所说,您拥有设备对象的线性地址,请使用 windbg 扩展名!object 0xlinearaddress根据您的 Windows 构建,它将显示对象标题的线性地址。内存中存在于对象正下方。

使用windbgOBJECT_HEADER为您解析结构。从 Windows 7 开始,您将有一个名为 的成员InfoMask,早期版本有NameInfoOffset.

如果您有较早的构建,NameInfoOffset则从对象标题的线性基数中减去,以获得OBJECT_HEADER_NAME_INFO该对象结构基数

如果您有 Windows 7 版本或更高版本,InfoMask则是一个位掩码,用于描述标头开头之前存在的其他创建者结构。它是使用ObInfoMaskToOffsetTable包含OBJECT_HEADER_NAME_INFO对象结构的偏移量计算的。它总是在一个固定的位置,但InfoMask应该用于确定对象是否已命名,因为并非所有对象都需要命名。

所以给你一个简单的例子,假设你有一个设备对象在fffffa8001234560. 我们还假设您使用的是 Windows 7 x64。

您的姓名信息将是:

dt nt!_object_header_name_info fffffa8001234560-0x30-0x20

-0x30 到标头 -0x20 的基数,因为在这种情况下InfoMask,表中使用的索引值为 0x20。

该结构包含与其对象目录相关的名称

还可以查看导出的内核例程ObQueryNameInfo

据我所知,XP 和 Win7 总是有这种格式:

object_directory_followed通过object_header_QUAD部分(不透明不使用该字段)指向OBJECT

如果你这样做dt nt!_Object_header_name_info <address of object> - 0x28

kd> !devobj \Device\Beep;dt nt!_OBJECT_HEADER_NAME_INFO 86884db8-28
Device object (86884db8) is for:
 Beep \Driver\Beep DriverObject 86e703b8
Current Irp 00000000 RefCount 0 Type 00000001 Flags 00000044
Dacl e1020c34 DevExt 86884e70 DevObjExt 86884ec8 
ExtensionFlags (0000000000)  
Device queue is not busy.
   +0x000 Directory        : 0xe100d670 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "Beep"
   +0x00c QueryReferences  : 1
kd> !devobj \Device\00000013
Device object (86fe7cd0) is for:
 00000013 \Driver\PnpManager DriverObject 86fe9328
Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040
Dacl e1020c34 DevExt 86fe7d88 DevObjExt 86fe7d90 DevNode 86fe7b88 
ExtensionFlags (0x00000010)  DOE_START_PENDING
Device queue is not busy.
kd> dt nt!_OBJECT_HEADER_NAME_INFO 86fe7cd0-28
   +0x000 Directory        : 0xe100d670 _OBJECT_DIRECTORY
   +0x004 Name             : _UNICODE_STRING "00000013"
   +0x00c QueryReferences  : 1