EPROCESS取进程全路径

如果文件被占坑,使用FILE_READ_ATTRIBUTES权限应该能打开

xp:

PEPROCESS->NT路径->FILE HANDLE->FILE OBJECT->DOS路径

BOOLEAN PsGetDosName(PEPROCESS ProcessObject, PUNICODE_STRING *DosName)
{
	BOOLEAN bRet = FALSE;
	KPROCESSOR_MODE PreviousMode;
	ULONG HandleExtension;
	HANDLE ProcessHandle;

	PreviousMode = PsGetCurrentThreadPreviousMode();
	HandleExtension = (PreviousMode == KernelMode ? OBJ_KERNEL_HANDLE : 0);
	if (NT_SUCCESS(ObOpenObjectByPointer(ProcessObject, HandleExtension, NULL, PROCESS_QUERY_INFORMATION, *PsProcessType, PreviousMode, &ProcessHandle)))
	{
		PVOID lpBuffer = NULL;
		ULONG cbBuffer = 0;

		if (ZwQueryInformationProcess(ProcessHandle, ProcessImageFileName, lpBuffer, cbBuffer, &cbBuffer) == STATUS_INFO_LENGTH_MISMATCH)
		{
			if (lpBuffer = ExAllocatePoolWithTag(PagedPool, cbBuffer, 0))
			{
				if (NT_SUCCESS(ZwQueryInformationProcess(ProcessHandle, ProcessImageFileName, lpBuffer, cbBuffer, &cbBuffer)))
				{
					HANDLE hFile;
					OBJECT_ATTRIBUTES oa;
					IO_STATUS_BLOCK sb;

					InitializeObjectAttributes(&oa, (PUNICODE_STRING)lpBuffer, OBJ_CASE_INSENSITIVE|HandleExtension, NULL, NULL);
					if (NT_SUCCESS(ZwOpenFile(&hFile, FILE_READ_ATTRIBUTES|SYNCHRONIZE, &oa, &sb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT)))
					{
						PFILE_OBJECT FileObject;

						if (NT_SUCCESS(ObReferenceObjectByHandle(hFile, FILE_READ_ATTRIBUTES, *IoFileObjectType, PreviousMode, (PVOID*)&FileObject, NULL)))
						{
							POBJECT_NAME_INFORMATION lpName;

							if (NT_SUCCESS(IoQueryFileDosDeviceName(FileObject, &lpName)))
							{
								*DosName = (UNICODE_STRING *)lpName;
								bRet = TRUE;
							}
							ObDereferenceObject(FileObject);
						}
						ZwClose(hFile);
					}
				}
				ExFreePool(lpBuffer);
			}
		}
		ZwClose(ProcessHandle);
	}
	return bRet;
}

使用方法:

	PUNICODE_STRING FileName;

	if (PsGetDosName(Process, &FileName))
	{
		ExFreePool(FileName);
	}


上面的方法很麻烦,但这是我总结出最靠谱的方法,无硬编码。

如果是windows7以上的系统,则非常简单,两个函数就行了。

NTSTATUS
PsReferenceProcessFilePointer (
    IN PEPROCESS Process,
    OUT PVOID *pFilePointer
    );
NTSTATUS
IoQueryFileDosDeviceName(
    IN PFILE_OBJECT FileObject,
    OUT POBJECT_NAME_INFORMATION *ObjectNameInformation
    );

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值