C 获取PE文件的.text节头

C 获取PE文件的.text节头,c,portable-executable,C,Portable Executable,我正在尝试获取.text部分的标题。似乎有效的方法是: // Get the DOS header. pDosHeader = (PIMAGE_DOS_HEADER) hMap; // Get header of first section pSectionHeader = (PIMAGE_SECTION_HEADER) ((DWORD) hMap + pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)); // Get last secti

我正在尝试获取.text部分的标题。似乎有效的方法是:

// Get the DOS header.
pDosHeader = (PIMAGE_DOS_HEADER) hMap;

// Get header of first section
pSectionHeader = (PIMAGE_SECTION_HEADER) ((DWORD) hMap + pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS));

// Get last section's header.
pLastSectionHeader = pSectionHeader + (pNtHeaders->FileHeader.NumberOfSections - 1);
但我不明白为什么。我本以为最后一条指示必须是:

// Get last section's header.
pLastSectionHeader = pSectionHeader + (pNtHeaders->FileHeader.NumberOfSections - 1) * sizeof(IMAGE_SECTION_HEADER);
这样指针将按节头方向移动

另外,
(pNtHeaders->FileHeader.NumberOfSections-1)
真的是.text部分吗?

pLastSectionHeader = pSectionHeader + (pNtHeaders->FileHeader.NumberOfSections - 1);
是正确的,
pSectionHeader
的类型为
PIMAGE\u SECTION\u HEADER
。将整数值添加到C中的指针时,该值将首先乘以指向的对象的大小(即
IMAGE\u SECTION\u HEADER
)。指针算法就是这样工作的

您不应该假设链接器放置不同部分的顺序。最好循环浏览所有节头,例如,将节名与
.text
匹配

另外,我不建议使用
sizeof(IMAGE\u NT\u HEADERS)
跳过可选的头。这是因为结构(包含在
IMAGE\u NT\u HEADERS
中)以
IMAGE\u DATA\u DIRECTORY DataDirectory[IMAGE\u numberofu DIRECTORY\u ENTRIES]结尾,并且您实际上无法保证PE映像中存在所有数据目录。更好的方法是读取可选标题,并使用
NumberOfRvaAndSizes
字段确定要查找节标题表应跳过多少数据目录


最后,我建议您使用结构的
IMAGE\u XYZ32
IMAGE\u XYZ64
版本,而不仅仅是
IMAGE\u XYZ
,这取决于您是要解析PE32(32位)还是PE32+(64位)。否则,您将默认为系统上默认的体系结构大小。

您正在查看elf文件还是其他对象文件格式?这里是elf格式信息的链接。请注意,这是一个很长的方式,并包括一些图像,所以没有邮递等。它应该是exe格式。这是COFF格式的链接:这是指向.exe文件格式的链接:但是,请务必阅读此信息:指向pdf文件的此链接详细介绍了windows可执行文件与其他系统的区别:我已经读过Matt Pietrek的文章,但这对我的实际实现没有多大帮助。。。谢谢你提供的更多信息!我使用图像第一部分(pNTHeader);从winnt.h到第一区现在安全吗?@Benjoyo:是的,那也很好!它使用文件头的
SizeOfOptionalHeader
字段,该字段还包括所有数据目录。