windows - 如何从页眉和/或页脚确定 PE 可执行文件的大小

标签 windows portable-executable

假设您有一个数据流或一个字节 block 要分割,您如何确定可执行文件的大小?

PE 可执行文件格式中有许多 header ,但我使用哪些 header 部分来确定(如果可能)可执行文件的总长度?

这是文件格式的图片。

PE File Format

最佳答案

如果PE文件格式正确,计算可以简化为(伪代码):

size = IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders

foreach section_header in section_headers:
    size += section_header.SizeOfRawData

地点:

SizeOfHeaders 字段给出所有 header 的长度(注意:包括 16 位 stub )。

  • 每个部分标题都是一个 IMAGE_SECTION_HEADER结构
  • SizeOfRawData 字段给出磁盘上每个部分的长度。

记事本示例(Windows 10):

  • SizeOfHeaders : 0x400

enter image description here

  • SizeOfRawData 每个部分:
    • .文本:0x15400
    • .data: 0x800
    • .idata: 0x1A00
    • .rsrc: 0x19C00
    • .reloc: 0x1600

(注意:SizeOfRawData在下图中称为Raw Size):

enter image description here

总结一切:

>>> size_of_headers = 0x400
>>> sec_sizes = [0x15400, 0x800, 0x1a00, 0x19c00, 0x1600]
>>> size_of_headers + sum(sec_sizes)
207872
>>> 

总大小:207872 字节。

验证:

enter image description here

注意:以上计算未考虑 PE 是否形成不良或是否存在覆盖。

关于windows - 如何从页眉和/或页脚确定 PE 可执行文件的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684660/

相关文章:

linux - 如何在linux中将PE(Portable Executable)格式转换为ELF

c# - 可移植 Asp.Net 软件

windows - 通过注册表检测已安装的程序

c++ - 如何检查可执行文件或 DLL 是在发布还是 Debug模式下构建的 (C++)

asp.net - 当我的 PC 启动和停止时启动和停止我的应用程序?

node.js - 每次出现回滚操作时如何安装 Node.js?

c++ - 我们如何将一个位置的 RVA(相对虚拟地址)映射到 PE 文件偏移量?

operating-system - 创建许多可执行文件格式的用途是什么?

c# - 使用 C#,如何像 TinEye.com 在 Web 上那样在 Windows 文件系统中搜索图像?

windows - 在 Windows 中,是否有与 syslog 或 OS X 的 Console.app 等效的功能来记录特定错误?