Windows 什么';.rdata和.idata段之间的区别是什么?

Windows 什么';.rdata和.idata段之间的区别是什么?,windows,reverse-engineering,portable-executable,Windows,Reverse Engineering,Portable Executable,我注意到在IDA中,我分析的PE文件不仅有.rdata部分,而且还有.idata。有什么不同吗? .rdata用于常量数据。它是.data段的只读版本 .idata保存导入目录(.edata用于导出)。EXE和DLL使用它来指定导入和导出的函数。有关详细信息,请参阅PE格式规范() 总结典型段名称: .text: Code .data: Initialized data .bss: Uninitialized data .rdata: Const/read-only (and initial

我注意到在IDA中,我分析的PE文件不仅有
.rdata
部分,而且还有
.idata
。有什么不同吗?

  • .rdata
    用于常量数据。它是.data段的只读版本

  • .idata
    保存导入目录(.edata用于导出)。EXE和DLL使用它来指定导入和导出的函数。有关详细信息,请参阅PE格式规范()

总结典型段名称:

.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提到的,段名称只是典型的。真正的段类型在段头中指定,或通过使用存储在段中的数据来定义。

事实上,Windows会忽略段的名称

有些链接器使用不同的段名称,甚至可以将导入描述符、导出描述符、资源等存储在“.text”段中,而不是使用单独的段

然而,为此类元数据创建单独的节似乎更简单,因此大多数链接器将使用单独的节

这意味着:节“.idata”、“.rdata”、“.rsrc”、。。。不包含程序数据(尽管其名称以“data”结尾),但包含操作系统使用的元信息。例如,“.rsrc”部分保存有关在资源管理器中查看可执行文件时显示的图标的信息

“.idata”包含有关程序所需的所有DLL文件的信息