我在IDA注意到,我分析的PE文件不仅有.rdata
部分,还有.idata
。 有什么不同?
.rdata是用于const数据的。 它是.data段的只读版本。
.idata保存导入目录(导出的.edata)。 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)所提到的那样,细分市场名称只是典型的 真正的段类型是在段头中指定的,或者是通过使用存储在段中的数据来定义的。
编辑:扩大答案
实际上,这些段的名称被Windows忽略。
有一些链接器使用不同的段名称,甚至可以在“.text”段中存储导入描述符,导出描述符,资源等,而不是使用单独的段。
然而,为这样的元数据创建单独的部分似乎更简单,所以大多数链接器将使用单独的部分。
这意味着:“.idata”,“.rdata”,“.rsrc”等部分不包含程序数据(尽管其名称以“data”结尾),但包含操作系统使用的元信息。 例如,“.rsrc”部分保存有关在资源管理器中查看可执行文件时显示的图标的信息。
“.idata”包含程序所需的所有DLL文件的信息。