首页
社区
课程
招聘
[求助]Win7上如何通过EPROCESS获取全路径
发表于: 2010-11-23 16:20 6686

[求助]Win7上如何通过EPROCESS获取全路径

2010-11-23 16:20
6686
在WinXP上,取全路径可大致通过以下流程来取
SECTION_OBJECT->SEGMENT_OBJECT->CONTROL_AREA->FILE_POINTER

但是在Win7上,最后在CONTROL_AREA中的FilePointer已经不再指向FILE_OBJECT了
而是EX_FAST_REF,拿出其中的值,也不再是一个有效对象

kd> dt _CONTROL_AREA 863eeee8
nt!_CONTROL_AREA
   +0x000 Segment          : 0x8a58ac80 _SEGMENT
   +0x004 DereferenceList  : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x00c NumberOfSectionReferences : 1
   +0x010 NumberOfPfnReferences : 0x12
   +0x014 NumberOfMappedViews : 1
   +0x018 NumberOfUserReferences : 2
   +0x01c u                : <unnamed-tag>
   +0x020 FlushInProgressCount : 0
   +0x024 FilePointer      : _EX_FAST_REF
   +0x028 ControlAreaLock  : 0n0
   +0x02c ModifiedWriteCount : 0
   +0x02c StartingFrame    : 0
   +0x030 WaitingForDeletion : (null)
   +0x034 u2               : <unnamed-tag>
   +0x040 LockedPages      : 0n1
   +0x048 ViewList         : _LIST_ENTRY [ 0x863931c8 - 0x863931c8 ]

kd> !object 863ed10e
863ed10e: Not a valid object (ObjectType invalid)


请教各位高手,有什么其它办法取得全路径
谢了

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 364
活跃值: (1716)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
NTSTATUS GetProcessImageName(IN HANDLE ProcessHandle,OUT 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) {
            DbgPrint("Cannot resolve ZwQueryInformationProcess\n");
        }
    }
    //
    // Step one - get the size we need
    //
    status = ZwQueryInformationProcess( ProcessHandle,
                                        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;

        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(PagedPool, returnedLength, 'ipgD');

    if (NULL == buffer) {

        return STATUS_INSUFFICIENT_RESOURCES;
        
    }

    //
    // Now lets go get the data
    //
    status = ZwQueryInformationProcess( ProcessHandle,
                                        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;
   
}
2010-11-23 18:59
0
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已解决
FilePointer & 0xfffffff8
2010-11-24 10:54
0
游客
登录 | 注册 方可回帖
返回
//