我在 IDA 中注意到,我分析的 PE 文件不仅有.rdata
部分,还有.idata
. 有什么不同?
问问题
27433 次
2 回答
56
.rdata
用于常量数据。它是 .data 段的只读版本。.idata
保存导入目录(用于导出的 .eddata)。EXE 和 DLL 使用它来指定导入和导出的函数。有关详细信息,请参阅 PE 格式规范 ( http://msdn.microsoft.com/library/windows/hardware/gg463125 )。
总结典型的段名:
.text: Code
.data: Initialized data
.bss: Uninitialized data
.rdata: Const/read-only (and initialized) data
.edata: Export descriptors
.idata: Import descriptors
.reloc: Relocation table (for code instructions with absolute addressing when
the module could not be loaded at its preferred base address)
.rsrc: Resources (icon, bitmap, dialog, ...)
.tls: __declspec(thread) data (Fails with dynamically loaded DLLs -> hard to find bugs)
正如 Martin Rosenau 所提到的,段名称只是典型的。真正的段类型在段标头中指定,或者通过使用存储在段中的数据来定义。
于 2013-09-25T22:24:19.430 回答
8
实际上,Windows 会忽略段的名称。
有些链接器使用不同的段名称,甚至可以将导入描述符、导出描述符、资源等存储在“.text”段中,而不是使用单独的段。
但是,为此类元数据创建单独的部分似乎更简单,因此大多数链接器将使用单独的部分。
这意味着:“.idata”、“.rdata”、“.rsrc”等节不包含程序数据(尽管它们的名称以“data”结尾),但它们包含操作系统使用的元信息。例如,“.rsrc”部分包含有关在资源管理器中查看可执行文件时显示的图标的信息。
“.idata”包含有关程序所需的所有 DLL 文件的信息。
于 2013-09-26T06:55:05.827 回答