IMAGE_SECTION_HEADER *last_section = (IMAGE_SECTION_HEADER *)((const BYTE *)first_section) + sizeof(IMAGE_SECTION_HEADER) * (section_count - 1);
使用PE文件遍历节表时,利用上述方式寻找最后一个节表,然而发现last_section->Name输出为空。

C语言PE文件遍历节表
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
22条回答 默认 最新
关注
🕖上午好,题主!目前:🟢[在线]
📢参考通义千问、由郭老师整理提供!
📣今日诗号:疏影横斜水清浅,暗香浮动月黄昏。在使用C语言遍历PE(Portable Executable)文件的节表时,确实需要正确地计算每个
IMAGE_SECTION_HEADER
结构体的地址,并访问它们。你提到的问题可能是由于指针运算或数据解析不准确导致的。以下是一个完整的示例代码,演示如何正确地遍历PE文件的节表并打印每个节表的名称:
#include <stdio.h> #include <windows.h> // 打开PE文件并读取其内容 void read_pe_file(const char* filename) { FILE* file = fopen(filename, "rb"); if (!file) { printf("无法打开文件: %s\n", filename); return; } // 读取文件头 IMAGE_DOS_HEADER dosHeader; fread(&dosHeader, sizeof(dosHeader), 1, file); if (dosHeader.e_magic != IMAGE_DOS_SIGNATURE) { printf("无效的DOS签名\n"); fclose(file); return; } // 跳转到NT头部 fseek(file, dosHeader.e_lfanew, SEEK_SET); IMAGE_NT_HEADERS ntHeaders; fread(&ntHeaders, sizeof(ntHeaders), 1, file); if (ntHeaders.Signature != IMAGE_NT_SIGNATURE) { printf("无效的NT签名\n"); fclose(file); return; } // 获取节表数量 DWORD sectionCount = ntHeaders.FileHeader.NumberOfSections; printf("节表数量: %u\n", sectionCount); // 定位到第一个节表 IMAGE_SECTION_HEADER firstSection; fseek(file, dosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * (sectionCount - 1), SEEK_SET); fread(&firstSection, sizeof(firstSection), 1, file); // 遍历所有节表 for (DWORD i = 0; i < sectionCount; ++i) { IMAGE_SECTION_HEADER sectionHeader; fseek(file, dosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i, SEEK_SET); fread(§ionHeader, sizeof(sectionHeader), 1, file); // 输出节表名称 printf("节表名称: "); for (int j = 0; j < 8; ++j) { printf("%c", sectionHeader.Name[j]); } printf("\n"); // 输出其他信息,如虚拟地址、大小等 printf("虚拟地址: 0x%08X\n", sectionHeader.VirtualAddress); printf("节大小: %u\n", sectionHeader.SizeOfRawData); printf("...\n"); } fclose(file); } int main() { const char* filename = "example.exe"; // 替换为你的PE文件路径 read_pe_file(filename); return 0; }
关键点解释:
- 文件头和NT头部:首先读取文件头和NT头部以确定文件格式和节表的数量。
- 定位到节表:通过计算偏移量来定位到每个节表的位置。
- 遍历节表:逐个读取每个节表并输出其名称和其他相关信息。
确保文件路径正确,并且你有权限读取该文件。如果仍然遇到问题,请检查文件是否为有效的PE文件,并且注意文件路径是否正确。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报