Какая разница между сегментами.rdata и.idata?

Я заметил в IDA, что файл PE, который я анализирую, имеет не только раздел .rdata но также .idata. Какая разница?

Ответ 1

  • .rdata - для данных const. Это версия только для чтения сегмента.data.

  • .idata содержит .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)

Как упоминает Мартин Розенау, названия сегментов являются типичными. Истинный тип сегмента указывается в заголовке сегмента или определяется использованием данных, хранящихся в сегменте.

Ответ 2

Фактически имена сегментов игнорируются Windows.

Существуют компоновщики, которые используют разные имена сегментов, и даже можно хранить дескрипторы импорта, дескрипторы экспорта, ресурсы и т.д. В сегменте ".text" вместо использования отдельных сегментов.

Однако, кажется, проще создавать отдельные разделы для таких метаданных, поэтому большинство линкеров будут использовать отдельные разделы.

Это означает: разделы ".idata", ".rdata", ".rsrc",... не содержат данных программы (хотя их имя заканчивается "данными"), но они содержат метаинформацию, используемую операционной системой. Например, в разделе ".rsrc" содержится информация о значке, который отображается при просмотре исполняемого файла в проводнике.

".idata" содержит информацию обо всех DLL файлах, необходимых программе.