C ++在不打开文件的情况下访问IMAGE_OPTIONAL_HEADER64?

时间:2018-02-01 10:28:12

标签: c++ windows winapi

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

使用ZwQuerySystemInformation获取系统模块,然后转换RTL_PROCESS_MODULE_INFORMATION我可以访问以下内容:

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_OPTIONAL_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,而是只能访问包含 ImageBase 的RTL_PROCESS_MODULE_INFORMATION,但它与 OptionalHeader.ImageBase不同

我认为你应该能够理解我想要达到的目标。

1 个答案:

答案 0 :(得分:1)

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