【问题标题】:What is "alignment", and how to convert from one alignment to another?什么是“对齐”,以及如何从一种对齐方式转换为另一种?
【发布时间】:2010-09-22 11:23:14
【问题描述】:
以下是从节对齐转换为文件对齐的步骤:
- 查找数据的 RVA
- 从 RVA 派生引用的数据所属的部分。这是微不足道的,因为部分不重叠。各个部分的起始地址可在文件头中找到
- 查找 RVA 和节的起始地址之间的差异以查找数据偏移量,即该数据在节内的偏移量。
- 从文件头,对于同一个节,找到同一个节在文件中的位置。
- 将数据偏移量添加到文件中section的位置,即可找到文件中数据的地址。
但我就是不明白,谁能详细说明一下?
【问题讨论】:
标签:
alignment
portable-executable
【解决方案1】:
对齐是一个向上取整的值。部分数据大小被四舍五入以提高效率,因为操作系统无论如何都会以块的形式移动内容。
文件对齐通常为 512 字节,适合大多数文件系统的块大小。
Section Alignment 通常为 4096 字节,适合内存页的大小。
因此,如果您的 PE 文件的部分(如“.text”)包含 513 个字节的数据:
-
.text 部分将在文件中向上舍入到 1024 个字节。
-
.text 部分将在内存中四舍五入到 4096 个字节。
请注意文件和内存中可能存在的松弛空间量。
我不确定您为什么要“从一种对齐方式转换为另一种对齐方式”。你得到的食谱使练习的目标成为一个谜。如果您的目标是操作 PE 文件,那么您只需要考虑文件对齐。 Windows 加载程序会在将 Section Alignment 放入内存时对其进行处理,因此您通常根本不需要考虑这一点。
您可以阅读更多关于 PE here.