C语言 获取PE文件的.text节头

czq61nw1  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(126)

我正在尝试获取 .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 部分吗?

anauzrmj

anauzrmj1#

的原因

pLastSectionHeader = pSectionHeader + (pNtHeaders->FileHeader.NumberOfSections - 1);

字符串
正确的是,pSectionHeaderPIMAGE_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_XYZ32IMAGE_XYZ64版本的结构,而不仅仅是IMAGE_XYZ,这取决于您想要解析PE 32(32位)还是PE 32+(64位)。否则,您将默认使用系统上默认的架构大小。

vc6uscn9

vc6uscn92#

给你:

// Get DOS and PE Header
PIMAGE_DOS_HEADER hdos = (PIMAGE_DOS_HEADER)pe_file.data();
PIMAGE_NT_HEADERS hpe = (PIMAGE_NT_HEADERS)((DWORD)hdos + hdos->e_lfanew);

// Get header of first section
DWORD section_offset = (DWORD)hdos + hdos->e_lfanew + sizeof(IMAGE_NT_HEADERS);
PIMAGE_SECTION_HEADER text_section = (PIMAGE_SECTION_HEADER)(section_offset);

字符串

lpwwtiir

lpwwtiir3#

.text部分并不总是.text。请注意:

  1. PE文件段有一个IMAGE_SCN_CNT_CODE标志。为什么不用它?
    1.请注意,sizeof(IMAGE_NT_HEADERS)只获取分配所需的字节,请使用IMAGE_NT_HEADERS->FileHeader.SizeOfOptionalHeader + sizeof(IMAGE_FILE_HEADER) + sizeof(DWORD)
    检查代码(C代码):
PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(hMod + ((PIMAGE_DOS_HEADER)hMod)->e_lfanew);
PIMAGE_SECTION_HEADER SectionHeaders = IMAGE_FIRST_SECTION(NtHeaders);
PIMAGE_SECTION_HEADER codeSection2;
for (WORD SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections; SectionIndex++)
{
    PIMAGE_SECTION_HEADER SectionHeader = &SectionHeaders[SectionIndex];
    if (SectionHeader->Characteristics & IMAGE_SCN_CNT_CODE){
        codeSection2 = SectionHeader;
        break;
    }
}
IMAGE_SECTION_HEADER codeSection = *codeSection2;

字符串

相关问题