函数_积累_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、

 

转载于:https://www.cnblogs.com/DriverSkill/p/6186849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值