Если вы открыли исполняемый файл в дизассемблере, просмотрели структуру 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 не копирует файл в память как единый блок.
- Читается заголовок PE-файла.
- Каждая секция размещается по своему виртуальному адресу.
- Для секций назначаются права доступа.
- Настраиваются импортируемые библиотеки.
- После этого выполнение начинается с точки входа.
Из-за этого разные области памяти получают разное назначение. Код нельзя случайно перезаписать, а данные можно свободно изменять во время работы приложения.
Почему это важно при анализе программ
При исследовании неизвестного исполняемого файла понимание назначения секций позволяет значительно быстрее ориентироваться.
Например:
- если нужно найти алгоритм работы — начинают с
.text; - если ищут глобальные настройки — изучают
.data; - если нужно извлечь иконки или строки интерфейса — открывают
.rsrc.
Такой подход экономит время и позволяет не просматривать весь файл подряд.
Когда структура может отличаться
Не все программы содержат только три классические секции.
Довольно часто встречаются:
.rdata— неизменяемые данные;.pdata— информация для обработки исключений;.reloc— таблица релокаций;.idata— информация об импорте;- секции с нестандартными именами.
Некоторые упаковщики и системы защиты вообще создают собственные секции с произвольными названиями. Иногда код временно размещается не в .text, а распаковывается в память уже после запуска.
Поэтому название секции — хороший ориентир, но не абсолютное правило.
Что выбрать в зависимости от задачи
Если вы только начинаете изучать внутреннее устройство PE-файлов, не пытайтесь сразу анализировать десятки секций одновременно.
- Нужно понять, как работает программа. Начинайте с
.text. - Нужно найти значения переменных или таблицы. Изучайте
.data. - Нужно извлечь иконки, строки или манифест. Работайте с
.rsrc. - Нужно разобраться в импорте библиотек. Дополнительно изучите
.idataи.rdata. - Перед вами защищённое приложение. Не удивляйтесь нестандартным секциям — сначала определите, упакован ли файл.
Частые ошибки новичков
- Считать, что все строки программы находятся в
.data. На практике многие строки лежат в.rdataили в ресурсах. - Полагать, что в
.rsrcникогда не бывает исполняемого кода. Некоторые вредоносные программы специально прячут его среди ресурсов. - Пытаться анализировать только названия секций. Гораздо важнее их содержимое и права доступа.
- Думать, что все компиляторы формируют одинаковую структуру. Разные версии компиляторов могут создавать различные наборы секций.
- Игнорировать виртуальные адреса и работать только с физическим расположением данных в файле. При анализе памяти это приводит к путанице.
Практические рекомендации
- Изучайте секции одновременно с картой памяти процесса — так быстрее приходит понимание, как файл превращается в работающую программу.
- Не запоминайте названия механически. Намного полезнее понимать назначение каждой области.
- При анализе подозрительного файла сначала проверьте список секций и их права доступа. Это часто позволяет сразу заметить необычное поведение.
- Если исследуете программу в дизассемблере, начинайте с точки входа и постепенно переходите к данным и ресурсам.
- Помните, что нестандартные секции сами по себе не означают наличие вредоносного кода. Они лишь повод разобраться, почему разработчик использовал такую структуру.
Какая связь между секциями и безопасностью
Разделение кода, данных и ресурсов — это не просто вопрос удобства. Оно помогает реализовать защитные механизмы операционной системы.
Когда секция .text доступна только для выполнения и чтения, становится сложнее изменить машинный код во время работы программы. Отдельное хранение ресурсов исключает случайную порчу изображений или строк интерфейса, а разделение данных позволяет системе корректно применять разные права доступа к разным областям памяти.
Именно поэтому большинство современных приложений придерживаются подобной структуры даже при использовании разных компиляторов.
Что стоит запомнить
Если свести устройство PE-файла к простому правилу, получится следующая схема:
.text— программа делает работу..data— программа хранит и изменяет свои данные..rsrc— программа содержит всё, что относится к оформлению и встроенным ресурсам.
Понимая назначение этих трёх секций, намного проще ориентироваться в исполняемых файлах, читать вывод дизассемблеров, анализировать ошибки и изучать внутреннее устройство приложений. Если вы только начинаете разбираться в формате PE, сначала научитесь уверенно различать эти области, а уже потом переходите к более сложным секциям, таблицам импорта, релокациям и механизмам загрузчика.
