我正在使用 WinDbg 尝试枚举驱动程序及其相关设备。获取驱动程序名称非常容易。它位于_DRIVER_OBJECT结构中。不幸的是,_DEVICE_OBJECT不包含设备名称。
使用!devobj
命令我可以看到设备的名称,但我想找到包含名称的表/结构。
我正在使用 WinDbg 尝试枚举驱动程序及其相关设备。获取驱动程序名称非常容易。它位于_DRIVER_OBJECT结构中。不幸的是,_DEVICE_OBJECT不包含设备名称。
使用!devobj
命令我可以看到设备的名称,但我想找到包含名称的表/结构。
因此,假设如您所说,您拥有设备对象的线性地址,请使用 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