首页
社区
课程
招聘
[求助]是否可以通过SectionHandle来获得模块名称呢?[已解决]
发表于: 2009-5-1 14:52 5973

[求助]是否可以通过SectionHandle来获得模块名称呢?[已解决]

2009-5-1 14:52
5973
NtMapViewSection函数里是否可以通过第一个参数SectionHandle来获得被映射到进程中的模块名呢?

请大大指点。不想用BasicAdd来判断!

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

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
可以啊。SectionObject->Segment->ControlArea->FileObject,就可以拿到全路径了
2009-5-1 15:46
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上..

我google了一下,找到一个函数,看了下大概就是你这思路吧.

NTSTATUS GetProcessImageName(HANDLE SectionHandle, PCHAR ProcessImageName)
{
    PVOID SectionObject;
    PFILE_OBJECT FileObject;
    UNICODE_STRING FilePath;
    NTSTATUS Status;
    UNICODE_STRING DosName;
    STRING AnsiString;

    SectionObject = NULL;
    FileObject = NULL;
    FilePath.Buffer = 0;
    FilePath.Length = 0;
    *ProcessImageName = 0;
    Status = ObReferenceObjectByHandle(SectionHandle, 0, NULL, KernelMode, &SectionObject, NULL);
    if ( NT_SUCCESS(Status) )
    {
        FilePath.Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, 0x200u, ' kdD');
        FilePath.MaximumLength = 512;
        FileObject = (PFILE_OBJECT)*((DWORD *)SectionObject + 5);
        FileObject = (PFILE_OBJECT)*(DWORD *)FileObject;
        FileObject = (PFILE_OBJECT)*(DWORD *)(FileObject + 36);
        ObReferenceObjectByPointer((PVOID)FileObject, 0, NULL, KernelMode);
        RtlVolumeDeviceToDosName(FileObject->DeviceObject, &DosName);
        RtlCopyUnicodeString(&FilePath, &DosName);
        RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
        ObfDereferenceObject(FileObject);
        ObfDereferenceObject(SectionObject);
        RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
        if ( AnsiString.Length >= 256 )
        {
            memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
            *(ProcessImageName + 255) = 0;
        }
        else
        {
            memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
            ProcessImageName[AnsiString.Length] = 0;
        }
        RtlFreeAnsiString(&AnsiString);
        ExFreePoolWithTag(DosName.Buffer, 0);
        ExFreePoolWithTag(FilePath.Buffer, 0);
        Status = STATUS_SUCCESS;
    }

    return Status;
}

这个函数会蓝....
不过他的SectionObject定义成PVOID了,偏移不清楚,楼上的是否能给出SectionObject的定义,或者直接给出偏移吗,谢谢了
2009-5-1 16:01
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
定义直接参考WRK~~
2009-5-1 16:43
0
游客
登录 | 注册 方可回帖
返回
//