基本上,我想做的是找到PE文件的最后一部分。我已经非常认真地阅读了PE规范,但是我找不到我的代码失败的地方。

PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pidh + pidh->e_lfanew);
PIMAGE_FILE_HEADER pifh = (PIMAGE_FILE_HEADER)&pinh->FileHeader;
PIMAGE_OPTIONAL_HEADER pioh = (PIMAGE_OPTIONAL_HEADER)&pinh->OptionalHeader;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(pinh + sizeof(IMAGE_NT_HEADERS) + (pifh->NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER));
buffer是一个字节数组,其中包含已加载的可执行文件,而pish是指向最后一节的指针。由于某些原因,该部分的数量似乎超过了20000。

有任何想法吗 ?
提前致谢

最佳答案

我暂时无法解决一个问题:e_lfanew是IMAGE_NT_HEADERS结构的偏移量(以字节为单位)。您正在将这个字节数添加到IMAGE_DOS_HEADER指针中,因此您将向前移动sizeof(IMAGE_DOS_HEADER)*pidh->e_lfanew字节。

固定版本:

PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)((BYTE*)pidh + pidh->e_lfanew);
PIMAGE_FILE_HEADER pifh = (PIMAGE_FILE_HEADER)&pinh->FileHeader;
PIMAGE_OPTIONAL_HEADER pioh = (PIMAGE_OPTIONAL_HEADER)&pinh->OptionalHeader;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)((BYTE*)pinh + sizeof(IMAGE_NT_HEADERS) + (pifh->NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER));

调试此类问题的最佳方法是使用调试器放入代码中,并亲自在内存中查看PE数据。例如,您可以打开Visual Studio十六进制编辑器,查看所有字节数据以及您实际读取的值。

以下是有关在VS 2010中查看程序内存的一些信息:
http://msdn.microsoft.com/en-us/library/s3aw423e.aspx

关于c - 加载PE header ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8782771/

10-13 07:31