我正在尝试获取 .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 部分吗?
3条答案
按热度按时间anauzrmj1#
的原因
字符串
正确的是,
pSectionHeader
是PIMAGE_SECTION_HEADER
类型。当你在C中给指针添加一个整数值时,这个值首先会乘以所指向对象的大小(即IMAGE_SECTION_HEADER
)。这就是指针算术的工作原理!你不应该对链接器放置不同节的顺序做任何假设。最好是循环遍历所有节头,例如将节的名称与
.text
匹配。另外,我不建议使用
sizeof(IMAGE_NT_HEADERS)
来跳过可选的header。(包含在IMAGE_NT_HEADERS
中)以IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
结尾,并且您实际上不能保证所有数据目录都存在于PE映像中。更好的方法是读取可选的头部,并使用NumberOfRvaAndSizes
字段来确定您应该跳过多少个数据目录来查找节标题表。最后,我建议您使用
IMAGE_XYZ32
和IMAGE_XYZ64
版本的结构,而不仅仅是IMAGE_XYZ
,这取决于您想要解析PE 32(32位)还是PE 32+(64位)。否则,您将默认使用系统上默认的架构大小。vc6uscn92#
给你:
字符串
lpwwtiir3#
.text
部分并不总是.text
。请注意:IMAGE_SCN_CNT_CODE
标志。为什么不用它?1.请注意,
sizeof(IMAGE_NT_HEADERS)
只获取分配所需的字节,请使用IMAGE_NT_HEADERS->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_FILE_HEADER) + sizeof(DWORD)
。检查代码(C代码):
字符串