c - 加载PE header

标签 c winapi portable-executable

基本上,我想做的是找到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/59639348/

相关文章:

c - C中链表的结构

c - c99 语义中的存储类说明符 'register'

c++ - 如何将许多格式字符串打印到窗口中?

linker - 什么是二进制格式的 "Alignment"字段?为什么需要它?

c - 如何使用C内核运行PE(可移植可执行文件)

c++ - OpenCV undefined reference 库中我自己的方法

c++ - 在源文件中指定包含前缀与在编译器的搜索路径参数中指定包含前缀有何优缺点?

c++ - 重定向子进程的输入和输出不起作用

winapi - 如何获取 Win32 中可用串行端口的列表?

windows - PE/COFF 文件扩展