正如问题所说,是否有可能在没有实际打开和读取整个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不同因某种原因(是因为一个是PVOID和一个ULONGLONG?)
我认为你应该能够理解我想要达到的目标。
答案 0 :(得分:1)
PVOID ImageBase;
将显示可执行文件的虚拟地址。当您尝试使用ReadProcessMemory(hProcess, ImageBase, ...)
从该地址读取标头时,可能会出现问题:由于从虚拟内存地址读取,Windows实际上可能从磁盘读取信息(交换文件)。