Я заметил в IDA, что файл PE, который я анализирую, имеет не только раздел .rdata
но также .idata
. Какая разница?
Какая разница между сегментами.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 файлах, необходимых программе.