首页
社区
课程
招聘
[求助]驱动获得进程完整路径名称的问题
发表于: 2013-1-15 18:16 12982

[求助]驱动获得进程完整路径名称的问题

2013-1-15 18:16
12982
在eprocess结构中由于imageFileName仅能保存16个字符的缘故,所以很多进程的长进程名无法保存完整。这里就涉及到了一个获取完整进程名称的问题,在XP中我是通过PEB结构中获得进程的完整名称。但是在windows7中无法通过PEB获得进程完整路径名称,所以请各位看雪大牛提供windows7上获得进程完整名称的办法。在此感谢。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大牛难道今天都没有上线么??还是我要去求助区发
2013-1-15 19:33
0
雪    币: 6556
活跃值: (4356)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
3
_EPROCESS->_SE_AUDIT_PROCESS_CREATION_INF
2013-1-15 19:57
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个我知道,但是这个还要额外获得盘符,有没有别的方式,像XP中就有很多种方式,比如PEB,SECTION_OBJECT之类的。特别是PEB,可以获得完整路径和单独名称,在Windows7下有没有类似的?
2013-1-15 20:02
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
楼主不会运用论坛资源啊。。

http://bbs.pediy.com/showthread.php?t=161126 就有取进程全路径的方法~自己下载吧
2013-1-15 20:12
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在附件里面找了下,也没有找到相关的文件?
2013-1-15 20:55
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果在用户层 可由进程句柄获得其全路径
2013-1-15 21:51
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
你要用PEB的话你就蛋疼了
2013-1-15 22:28
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
9
你没仔细找~~~
2013-1-15 22:29
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢,不是在应用层
2013-1-16 08:57
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那在windows7里面用的啥
2013-1-16 08:57
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我在仔细找找。。。。
2013-1-16 08:58
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
GetProcessFullImagePath,看到一个这个函数,另外还有一个GetProcessImagePath函数被注释掉了。都不是硬编码,好像是利用函数获取的全路径,在3600上也看到了文章,我还是先看看如何不用硬编码获得全路径把
2013-1-16 11:24
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
14
GetProcessImagePath就不没有硬编码~~再配合SafeQueryFileDosDeviceName就可以获取DOS下的路径了。

其实GetProcessFullImagePath算是一点硬编码,因为去exebase是从eprocess取得,这个木办法了。~~~
2013-1-16 12:02
0
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
贴个之前自己用的代码。win7、xp通用。

NTSTATUS GetProcessImageName(PUNICODE_STRING ProcessImageName)
{
	NTSTATUS status;
	ULONG returnedLength;
	ULONG bufferLength;
	PVOID buffer;
	PUNICODE_STRING imageName;

	PAGED_CODE(); // this eliminates the possibility of the IDLE Thread/Process
	if (NULL == ZwQueryInformationProcess) {
		UNICODE_STRING routineName;
		RtlInitUnicodeString(&routineName, L"ZwQueryInformationProcess");
		ZwQueryInformationProcess = 
			(QUERY_INFO_PROCESS) MmGetSystemRoutineAddress(&routineName);
		if (NULL == ZwQueryInformationProcess) {
			KdPrint(("Cannot resolve ZwQueryInformationProcess\r\n"));
		}
	}
	//
	// Step one - get the size we need
	//
	status = ZwQueryInformationProcess( NtCurrentProcess(), 
		ProcessImageFileName,
		NULL, // buffer
		0, // buffer size
		&returnedLength);
	if (STATUS_INFO_LENGTH_MISMATCH != status) {
		return status;
	}
	//
	// Is the passed-in buffer going to be big enough for us?  
	// This function returns a single contguous buffer model...
	//
	bufferLength = returnedLength - sizeof(UNICODE_STRING);

	if (ProcessImageName->MaximumLength < bufferLength) {
		ProcessImageName->Length = (USHORT) bufferLength;
		KdPrint(("ProcessImageName's Buffer Is Toooo small\r\n"));
		return STATUS_BUFFER_OVERFLOW;

	}
	//
	// If we get here, the buffer IS going to be big enough for us, so 
	// let's allocate some storage.
	//
	buffer = ExAllocatePoolWithTag(NonPagedPool, returnedLength, 'ipgD');
	if (NULL == buffer) {
		return STATUS_INSUFFICIENT_RESOURCES;

	}
	//
	// Now lets go get the data
	//
	status = ZwQueryInformationProcess( NtCurrentProcess(), 
		ProcessImageFileName,
		buffer,
		returnedLength,
		&returnedLength);
	if (NT_SUCCESS(status)) {
		//
		// Ah, we got what we needed
		//
		imageName = (PUNICODE_STRING) buffer;
		
		RtlCopyUnicodeString(ProcessImageName, imageName);

	}
	//
	// free our buffer
	//
	ExFreePool(buffer);
	//
	// And tell the caller what happened.
	//    
	return status;

}
2013-1-16 14:33
0
游客
登录 | 注册 方可回帖
返回
//