函数_积累_01
1、通过 对象实例 获取到 对象名称
http://www.osronline.com/showthread.cfm?link=114685
NTSTATUS ObQueryNameString(
_In_ PVOID Object,
_Out_opt_ POBJECT_NAME_INFORMATION ObjectNameInfo,
_In_ ULONG Length,
_Out_ PULONG ReturnLength
);
https://msdn.microsoft.com/en-us/library/windows/hardware/ff550990(v=vs.85).aspx
typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
1.1、使用的例子:
NTSTATUS status01 = 0; ULONG ulRtnLen = 0; KdPrint(("pTargetDeviceObject->DeviceType : 0x%08X, pTargetDeviceObject->Characteristics : 0x%08X\n", pTargetDeviceObject->DeviceType, pTargetDeviceObject->Characteristics)); KdPrint(( "STATUS_INFO_LENGTH_MISMATCH : 0x%08X\n", STATUS_INFO_LENGTH_MISMATCH )); status01 = ObQueryNameString(pTargetDeviceObject, NULL, 0, &ulRtnLen); if (status01 == STATUS_INFO_LENGTH_MISMATCH) { POBJECT_NAME_INFORMATION pObjNameInfo = NULL; KdPrint(( "ObQueryNameString - ulRtnLen(1) : 0x%08X\n", ulRtnLen )); pObjNameInfo = (POBJECT_NAME_INFORMATION)ExAllocatePool(NonPagedPool, ulRtnLen); status01 = ObQueryNameString(pTargetDeviceObject, pObjNameInfo, ulRtnLen, &ulRtnLen); if (status01 == STATUS_SUCCESS) { KdPrint(( "ObQueryNameString - ulRtnLen(2) : 0x%08X\n", ulRtnLen )); KdPrint(( "ObQueryNameString - objNameInfo : %wZ\n", &(pObjNameInfo->Name) )); } else { KdPrint(( "ObQueryNameString failed : 0x%08X\n", status01 )); } ExFreePool(pObjNameInfo); }
ZC: 使用的误区:应该是分配POBJECT_NAME_INFORMATION形式的一块内存,而非 先申请OBJECT_NAME_INFORMATION 再为OBJECT_NAME_INFORMATION.Name.Buffer申请空间。一整块的OBJECT_NAME_INFORMATION(含字符串空间)内存应该都是在堆上,而非 一部分在栈上 一部分在堆上... 参考了网页“【求助】ObQueryNameString获取进程路径的问题 - 看雪安全论坛.html(http://bbs.pediy.com/showthread.php?t=112744)”中的内容,其中2楼的回复是这样的:
又是一个对ObQueryNameString的参数的理解错误。
ObQueryNameString相应的缓冲区,是一个OBJECT_NAME_INFORMATION结构,当函数调用成功,这里填入的就是一个UNICODE_STRING结构及其Buffer中的所有内容(最前面是一个UNICODE_STRING,后面是相应的WCHAR字符串,UNICODE_STRING中的Buffer就是指向WCHAR字符的开头),而并不是你自己初始化一个UNICODE_STRING然后传给它。
这种方式很常见,如 ZwQueryVirtualMemory(MomerySectionName) 及 ZwQueryInformationProcess(ProcessImageFileName) 填入缓冲区的 都是这样的结构。
2、
3、
4、
5、