Как устроены секции .text, .data и .rsrc: что в них хранится и зачем это понимать

Если вы открыли исполняемый файл в дизассемблере, просмотрели структуру PE-файла или начали изучать реверс-инжиниринг, почти сразу встретите секции .text, .data и .rsrc. Для новичка это выглядит как набор непонятных областей памяти. На практике всё гораздо проще: каждая секция предназначена для хранения определённого типа данных, и именно это разделение помогает операционной системе быстрее загружать программу и правильно работать с её содержимым.

Понимание назначения этих секций полезно не только специалистам по безопасности. Оно помогает разработчикам, тем, кто анализирует ошибки приложений, изучает внутреннее устройство Windows-программ или просто хочет разобраться, что находится внутри файла формата PE.

Почему исполняемый файл разделён на секции

Представьте программу как хорошо организованный архив. Вместо того чтобы складывать код, строки, картинки и настройки в одну большую область, всё раскладывается по отдельным разделам.

  • машинный код хранится отдельно;
  • данные программы — отдельно;
  • иконки, изображения, диалоги и другие ресурсы — ещё в одном месте;
  • каждая область получает собственные права доступа.

Такой подход позволяет загружать программу эффективнее и повышает безопасность. Например, область с кодом обычно нельзя изменять во время работы, а область с данными, наоборот, должна быть доступна для записи.

Что находится в секции .text

Секция .text — это основное место хранения исполняемого машинного кода. Именно отсюда процессор начинает выполнять инструкции.

После компиляции исходный код превращается в последовательность инструкций процессора. Эти инструкции записываются именно сюда.

Обычно в .text можно встретить:

  • функции программы;
  • циклы и условия;
  • вызовы библиотечных функций;
  • обработчики исключений;
  • служебный код компилятора.

В большинстве случаев эта секция имеет права:

  • чтение;
  • выполнение;
  • без возможности записи.

Это сделано специально. Если бы любой код можно было свободно изменять во время выполнения, злоумышленникам было бы намного проще внедрять вредоносные инструкции.

Практический пример

Если открыть программу в дизассемблере и перейти к точке входа (Entry Point), почти всегда она будет находиться именно внутри секции .text. Отсюда начинается выполнение приложения.

Что хранится в секции .data

Если .text отвечает за действия программы, то .data отвечает за её изменяемые данные.

Сюда обычно попадают:

  • глобальные переменные;
  • статические переменные;
  • таблицы значений;
  • массивы;
  • уже инициализированные структуры.

Например, если написать:

int counter = 10;

то значение 10 после компиляции обычно окажется именно в секции .data.

Во время работы программы содержимое этой области может изменяться:

  • счётчики увеличиваются;
  • флаги переключаются;
  • буферы обновляются;
  • структуры заполняются новыми значениями.

Поэтому для .data обычно разрешены чтение и запись.

Не путайте с .rdata

Во многих PE-файлах рядом находится секция .rdata. Несмотря на похожее название, она предназначена для данных только для чтения: строковых литералов, таблиц импорта, констант и других объектов, которые программа не должна изменять.

Что хранится в секции .rsrc

Секция .rsrc заметно отличается от двух предыдущих. Она почти не содержит ни машинного кода, ни рабочих переменных.

Здесь располагаются ресурсы программы.

Это могут быть:

  • иконки;
  • курсоры;
  • изображения;
  • диалоговые окна;
  • меню;
  • строки локализации;
  • таблицы версий;
  • манифест приложения;
  • другие встроенные файлы.

Например, значок программы в проводнике Windows обычно хранится именно в .rsrc.

Когда приложение вызывает системные функции загрузки ресурсов, операционная система ищет нужный объект именно здесь.

Как различаются основные секции

Секция Что содержит Можно изменять во время работы Типичные права
.text Исполняемый машинный код Обычно нет Чтение + выполнение
.data Изменяемые глобальные данные Да Чтение + запись
.rsrc Ресурсы программы Практически никогда Чтение

Как это выглядит при загрузке программы

Во время запуска Windows не копирует файл в память как единый блок.

  1. Читается заголовок PE-файла.
  2. Каждая секция размещается по своему виртуальному адресу.
  3. Для секций назначаются права доступа.
  4. Настраиваются импортируемые библиотеки.
  5. После этого выполнение начинается с точки входа.

Из-за этого разные области памяти получают разное назначение. Код нельзя случайно перезаписать, а данные можно свободно изменять во время работы приложения.

Почему это важно при анализе программ

При исследовании неизвестного исполняемого файла понимание назначения секций позволяет значительно быстрее ориентироваться.

Например:

  • если нужно найти алгоритм работы — начинают с .text;
  • если ищут глобальные настройки — изучают .data;
  • если нужно извлечь иконки или строки интерфейса — открывают .rsrc.

Такой подход экономит время и позволяет не просматривать весь файл подряд.

Когда структура может отличаться

Не все программы содержат только три классические секции.

Довольно часто встречаются:

  • .rdata — неизменяемые данные;
  • .pdata — информация для обработки исключений;
  • .reloc — таблица релокаций;
  • .idata — информация об импорте;
  • секции с нестандартными именами.

Некоторые упаковщики и системы защиты вообще создают собственные секции с произвольными названиями. Иногда код временно размещается не в .text, а распаковывается в память уже после запуска.

Поэтому название секции — хороший ориентир, но не абсолютное правило.

Что выбрать в зависимости от задачи

Если вы только начинаете изучать внутреннее устройство PE-файлов, не пытайтесь сразу анализировать десятки секций одновременно.

  • Нужно понять, как работает программа. Начинайте с .text.
  • Нужно найти значения переменных или таблицы. Изучайте .data.
  • Нужно извлечь иконки, строки или манифест. Работайте с .rsrc.
  • Нужно разобраться в импорте библиотек. Дополнительно изучите .idata и .rdata.
  • Перед вами защищённое приложение. Не удивляйтесь нестандартным секциям — сначала определите, упакован ли файл.

Частые ошибки новичков

  • Считать, что все строки программы находятся в .data. На практике многие строки лежат в .rdata или в ресурсах.
  • Полагать, что в .rsrc никогда не бывает исполняемого кода. Некоторые вредоносные программы специально прячут его среди ресурсов.
  • Пытаться анализировать только названия секций. Гораздо важнее их содержимое и права доступа.
  • Думать, что все компиляторы формируют одинаковую структуру. Разные версии компиляторов могут создавать различные наборы секций.
  • Игнорировать виртуальные адреса и работать только с физическим расположением данных в файле. При анализе памяти это приводит к путанице.

Практические рекомендации

  • Изучайте секции одновременно с картой памяти процесса — так быстрее приходит понимание, как файл превращается в работающую программу.
  • Не запоминайте названия механически. Намного полезнее понимать назначение каждой области.
  • При анализе подозрительного файла сначала проверьте список секций и их права доступа. Это часто позволяет сразу заметить необычное поведение.
  • Если исследуете программу в дизассемблере, начинайте с точки входа и постепенно переходите к данным и ресурсам.
  • Помните, что нестандартные секции сами по себе не означают наличие вредоносного кода. Они лишь повод разобраться, почему разработчик использовал такую структуру.

Какая связь между секциями и безопасностью

Разделение кода, данных и ресурсов — это не просто вопрос удобства. Оно помогает реализовать защитные механизмы операционной системы.

Когда секция .text доступна только для выполнения и чтения, становится сложнее изменить машинный код во время работы программы. Отдельное хранение ресурсов исключает случайную порчу изображений или строк интерфейса, а разделение данных позволяет системе корректно применять разные права доступа к разным областям памяти.

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

Что стоит запомнить

Если свести устройство PE-файла к простому правилу, получится следующая схема:

  • .text — программа делает работу.
  • .data — программа хранит и изменяет свои данные.
  • .rsrc — программа содержит всё, что относится к оформлению и встроенным ресурсам.

Понимая назначение этих трёх секций, намного проще ориентироваться в исполняемых файлах, читать вывод дизассемблеров, анализировать ошибки и изучать внутреннее устройство приложений. Если вы только начинаете разбираться в формате PE, сначала научитесь уверенно различать эти области, а уже потом переходите к более сложным секциям, таблицам импорта, релокациям и механизмам загрузчика.

PEFile.ru