C++ C++;在不打开文件的情况下访问图像\u可选\u头64?

C++ C++;在不打开文件的情况下访问图像\u可选\u头64?,c++,windows,winapi,C++,Windows,Winapi,如问题所述,是否有可能在不实际打开和读取整个PE文件的情况下读取IMAGE_OPTIONAL_HEADER64 使用ZwQuerySystemInformation获取系统模块,然后转换RTL_进程_模块_信息,我可以访问以下内容: typedef struct _RTL_PROCESS_MODULE_INFORMATION { HANDLE Section; PVOID MappedBase; PVOID ImageBase; U

如问题所述,是否有可能在不实际打开和读取整个PE文件的情况下读取IMAGE_OPTIONAL_HEADER64

使用ZwQuerySystemInformation获取系统模块,然后转换RTL_进程_模块_信息,我可以访问以下内容:

typedef struct _RTL_PROCESS_MODULE_INFORMATION {
        HANDLE Section;
        PVOID MappedBase;
        PVOID ImageBase;
        ULONG ImageSize;
        ULONG Flags;
        USHORT LoadOrderIndex;
        USHORT InitOrderIndex;
        USHORT LoadCount;
        USHORT OffsetToFileName;
        UCHAR  FullPathName[256];
    } RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;
但我也希望在不打开和读取PE文件的情况下访问IMAGE\u OPTIONAL\u HEADER64

这可能吗?如果是,有人能给我举个例子吗?我会非常感激的

更新:

我对我的问题“不清楚”感到非常不安,这也阻止了我在stackoverflow上提出任何其他问题。因此,我现在将尝试更好地解释我想做什么

我想访问系统中加载的任何模块的OptionalHeader.ImageBase

当前打开并读取未加载到系统中的PE文件,我可以访问以下信息:

// definitons

union {
    IMAGE_DOS_HEADER idh;
    IMAGE_NT_HEADERS32 inth32;
    IMAGE_NT_HEADERS64 inth64;
};

LARGE_INTEGER ByteOffset = {};

// code to open file

NtReadFile(hFile, 0, 0, 0, &iosb, &inth64, sizeof(inth64), &ByteOffset, 0);

// More code
现在我可以读取&inth64.OptionalHeader.ImageBase

但是,当模块加载到系统中时,由于特权等原因,我无法执行相同的操作(打开文件、读取文件)

因此,我使用ZwQuerySystemInformation枚举加载的模块,但我无法在这里访问IMAGE_OPTIONAL_HEADER64,相反,我只能访问RTL_PROCESS_MODULE_信息,它确实包含ImageBase,但由于某些原因与OptionalHeader.ImageBase不同。(是因为一个是PVOID,一个是ULONGLONG?)


我想你应该能够完全理解我想要实现的目标。

PVOID ImageBase将显示可执行文件的虚拟地址。当您尝试使用从该地址读取头时,可能会出现问题:由于从虚拟内存地址读取,Windows可能实际从磁盘(交换文件)读取信息

如果不先打开文件,您将如何读取它?如果不想读取整个文件,请不要。只要读你需要的部分。或者你真的在问关于获取加载到进程中的模块的信息吗?是和否,也许我不够明确。我列出的是系统中的模块,而不是进程。我想访问系统中任何(或所有)模块内的IMAGE\u OPTIONAL\u HEADER64,但此时我只能打开文件,完整地读取它。。。和访问图像\u可选\u头64。所以这就是我的问题,我如何在不读取整个文件的情况下访问IMAGE_OPTIONAL_HEADER64,因为经常这样做并且取决于文件数量和大小,这可能非常糟糕……为什么要读取整个文件?寻找可选标题的开头并阅读。@DavidHeffernan听起来简单而好,但如何阅读呢?没有这样的例子,这些都是未记录的函数。。。从我的“测试”中,我只是崩溃了所有东西。此时你说你读了整个文件,然后你选择了可选的头。所以不要那样做。只读取文件中包含可选标头的部分。如果您已经知道如何将其作为字节数组从整个文件中选取,那么您已经知道如何在文件中查找到可选头的开头。非常感谢您的回答。。。但我的问题是“不读”任何东西,或打开任何东西…不,我不读,这是我首先要避免的。。。也许你不理解我的问题,也许我没有正确解释。@Norbert你似乎想让这些信息凭空出现。@NorbertBoros,我现在明白了你的问题,但没有看到“不要打开任何东西”的答案因为如果不获得对某事物的读访问权,就无法从该事物获取信息。太好了,如果你看这篇文章:我想访问for循环中的可选标题。可能吗?没有打开/读取。。。再一次。