首页
社区
课程
招聘
[求助]ObQueryNameString获取进程路径的问题
发表于: 2010-5-10 22:34 14413

[求助]ObQueryNameString获取进程路径的问题

2010-5-10 22:34
14413
代码如下:
NTSTATUS status;
ULONG pid=2000,relg;
PEPROCESS pro;
OBJECT_NAME_INFORMATION processfullpath;
processfullpath.Name.Buffer=ExAllocatePool(PagedPool,512);
processfullpath.Name.MaximumLength=512;
PsLookupProcessByProcessId((HANDLE)pid,&pro);
DbgPrint("process is %x",pro);
status=ObQueryNameString((PVOID)pro,&processfullpath,512,&relg);
DbgPrint("process full path is %S",processfullpath.Name.Buffer);
ExFreePool(processfullpath.Name.Buffer);

status=ObQueryNameString((PVOID)pro,&processfullpath,512,&relg);这句执行后返回的status为0,但下一句dbgprint输出为空,该怎么修改,谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
又是一个对ObQueryNameString的参数的理解错误。
ObQueryNameString相应的缓冲区,是一个OBJECT_NAME_INFORMATION结构,当函数调用成功,这里填入的就是一个UNICODE_STRING结构及其Buffer中的所有内容(最前面是一个UNICODE_STRING,后面是相应的WCHAR字符串,UNICODE_STRING中的Buffer就是指向WCHAR字符的开头),而并不是你自己初始化一个UNICODE_STRING然后传给它。
这种方式很常见,如ZwQueryVirtualMemory(MomerySectionName)及ZwQueryInformationProcess(ProcessImageFileName)填入缓冲区的都是这样的结构。
2010-5-11 00:15
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我把代码改成:
NTSTATUS status;
ULONG pid=2000,relg;
PEPROCESS pro;
OBJECT_NAME_INFORMATION processfullpath;
PsLookupProcessByProcessId((HANDLE)pid,&pro);
DbgPrint("process is %x",pro);
status=ObQueryNameString((PVOID)pro,&processfullpath,512,&relg);
DbgPrint("process full path is %S",processfullpath.Name.Buffer);
输出还是为空呀
2010-5-11 10:49
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
PID2000一定存在???,%ws
2010-5-11 12:29
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
就是方便,测试的时候会修改的
2010-5-11 12:41
0
雪    币: 75
活跃值: (818)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
2楼已经说的很明白了

OBJECT_NAME_INFORMATION processfullpath;
status=ObQueryNameString((PVOID)pro,&processfullpath,512,&relg);


可以试试这个
POBJECT_NAME_INFORMATION processfullpath
processfullpath = ( POBJECT_NAME_INFORMATION)exallocatepool (nonpagedpool, 1024);
status=ObQueryNameString((PVOID)pro,processfullpath,1024,&relg);

你这样做,实际上已经让这个函数访问了它不该访问的内存,楼主你试着跟踪一下,你看看processfullpath参数下面的内存内容在ObQueryNameString执行后是不是被改了。没实际测试过,若说错了请帮忙指正,thanks
2010-5-11 13:16
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
试了,结果一样,
process full path is (null)
2010-5-11 13:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
ProcessObject没有名字吧~~
2010-5-11 13:53
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那就先获取到EPROCESS下的Sectionobject再ObQueryNameString吗
2010-5-11 14:20
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
哪些Object是有名字的
2010-5-11 14:23
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是不是只有FILE_OBJECT才能用这个函数呀
2010-5-11 17:14
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
12
http://hi.baidu.com/%BD%D0%CE%D2v%D0%A3/blog/item/c1982f024053d07b3912bb91.html

用完之后,记得释放~~不然资源会被消耗完~~
2010-5-11 20:37
0
雪    币: 195
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
二楼说的是这个意思:
typedef struct _OBJECT_NAME_INFORMATION {

  UNICODE_STRING          Name;
  WCHAR                   NameBuffer[0];

} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
2011-3-29 15:15
0
雪    币: 382
活跃值: (402)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
14
额.教主说的对.进程对象没有名字.
ObQueryNameString是通过object_header中的NameInfoOffset找到OBJECT_HEADER_NAME_INFO结构.然后根据OBJECT_HEADER_NAME_INFO的Directory..循环到ObpRootDirectoryObject.然后把Name拼起来以得到全路径的...然而Process的object_header中的NameInfoOffset为0.所以ObQueryNameString不会得到名字呀
2011-3-29 15:56
0
雪    币: 382
活跃值: (402)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
15
winobj能枚举出来的都是有名字的
2011-3-29 16:11
0
雪    币: 382
活跃值: (402)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
16
例如那个\Device\Harddisk0\DR0 QueryName的过程
上传的附件:
  • 1.jpg (195.26kb,55次下载)
2011-3-29 16:32
0
游客
登录 | 注册 方可回帖
返回
//