Что хранится в секции .rsrc и как извлечь ресурсы из исполняемого файла

Что хранится в секции .rsrc и как извлечь ресурсы из исполняемого файла

Вы когда-нибудь открывали .exe-файл в HEX-редакторе и видели там куски иконок, строк с сообщениями, диалоговые окна — всё это, как будто случайно застряло в бинарнике? Это не мусор. Это ресурсы. И они хранятся в секции .rsrc — части исполняемого файла, которая специально отведена под всё, что не код, но без чего программа не работает как задумано.

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

Что именно лежит в .rsrc?

Секция .rsrc — это структурированное хранилище, где Windows (и некоторые другие ОС) хранят всё, что не является машинным кодом, но нужно для отображения интерфейса, локализации и работы с внешними данными. Вот основные типы ресурсов, которые вы там найдёте:

  • Иконки (RT_ICON) — все значки приложения: иконка в панели задач, в проводнике, в окне «Свойства».
  • Курсоры (RT_CURSOR) — кастомные курсоры мыши (например, часы, рука, кисть).
  • Битмапы (RT_BITMAP) — изображения, используемые в интерфейсе: фоновые картинки, кнопки, рамки.
  • Строки (RT_STRING) — все текстовые сообщения: «Ошибка подключения», «Сохранить как…», «Удалить файл?» — всё это вынесено в отдельные строки, чтобы можно было легко локализовать.
  • Диалоговые окна (RT_DIALOG) — структуры окон: кнопки, поля ввода, метки. Это не код, а описание расположения элементов.
  • Меню (RT_MENU) — структура верхнего меню: «Файл», «Правка», «Справка» — всё, что не прописано в коде, а описано в ресурсах.
  • Версия (RT_VERSION) — метаданные: имя программы, версия, компания, авторские права — то, что видно в свойствах файла в проводнике.
  • Шрифты (RT_FONT) — редко, но бывает: кастомные шрифты, встроенные в приложение.
  • Таблицы ресурсов — внутренние структуры, которые указывают, где и какие ресурсы находятся.

Всё это упаковано в иерархическую структуру: тип → имя/идентификатор → язык → данные. Например: RT_ICON → 1 → ru-RU → 256 байт бинарных данных. Это позволяет одной программе содержать иконки и строки на нескольких языках — и выбирать нужную версию в зависимости от настроек системы.

Как извлечь ресурсы? Три рабочих способа

Теория понятна. А как на практике вытащить иконку или строку? Есть три надёжных способа — от простого до мощного.

1. Resource Hacker — для быстрого просмотра и экспорта

Это бесплатная утилита, которая работает как «проводник» для ресурсов. Скачайте её с официального сайта (без установки, просто .exe).

Что делаете:

  1. Открываете .exe-файл в Resource Hacker.
  2. Слева — дерево ресурсов: раскрываете Icon, String, Dialog и т.д.
  3. Кликаете на нужный ресурс — справа появляется его содержимое.
  4. Правой кнопкой → Save Resource — и вы сохраняете иконку как .ico, строку как .txt, диалог как .rc.

Это самый простой способ. Подходит, если вам нужно вытащить 1–5 ресурсов за 5 минут. Никаких команд, никакой настройки. Работает на Windows, без установки.

2. Python + pefile + win32api — для автоматизации

Если вы работаете с десятками файлов, нужно извлекать ресурсы массово — например, для анализа библиотеки приложений или сбора иконок из всех .exe в папке — используйте Python.

Установите зависимости:

pip install pefile pywin32

Пример кода для извлечения всех иконок:

import pefile
import os

def extract_icons(exe_path):
    pe = pefile.PE(exe_path)
    for resource_type in pe.DIRECTORY_ENTRY_RESOURCE.entries:
        if resource_type.name is not None and str(resource_type.name) == "RT_ICON":
            for resource_id in resource_type.directory.entries:
                for resource_lang in resource_id.directory.entries:
                    data_rva = resource_lang.data.struct.OffsetToData
                    size = resource_lang.data.struct.Size
                    data = pe.get_data(data_rva, size)
                    # Сохраняем как .ico
                    with open(f"{os.path.basename(exe_path)}_icon_{resource_id.id}.ico", "wb") as f:
                        f.write(data)

# Используем
extract_icons("notepad.exe")

Этот скрипт найдёт все иконки в notepad.exe и сохранит их как отдельные файлы. Можно адаптировать под RT_BITMAP, RT_STRING — просто замените RT_ICON на нужный тип.

Плюсы: автоматизация, работа с сотнями файлов, интеграция в другие скрипты. Минус: требует базового понимания Python.

3. Visual Studio — для редактирования и пересборки

Если вы не просто хотите извлечь ресурсы, но и изменить их — например, заменить текст «Save» на «Сохранить» — используйте Visual Studio.

Как:

  1. Откройте Visual Studio (Community бесплатно).
  2. Создайте новый проект типа Win32 Project — не важно, что внутри.
  3. В меню: Project → Add Resource → Import.
  4. Выберите ваш .exe-файл. VS покажет все ресурсы.
  5. Вы можете редактировать строки, менять иконки, сохранять изменения — и пересобрать .exe с новыми ресурсами.

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

Сравнение способов: что выбрать?

Способ Сложность Для чего подходит Можно редактировать? Массовая обработка?
Resource Hacker Низкая Одиночные файлы, быстрый осмотр Да (ограниченно) Нет
Python + pefile Средняя Автоматизация, анализ, извлечение Нет Да
Visual Studio Высокая Редактирование и пересборка Да (полный контроль) Частично

Если вам нужно просто вытащить иконку — используйте Resource Hacker. Если вы делаете скрипт для анализа 500 .exe-файлов — Python. Если вы хотите изменить текст в установщике и пересобрать его — только Visual Studio.

Частые ошибки — и как их избежать

  1. Открываю .exe в блокноте и вижу «кракозябры» — значит, ресурсы не там. Нет, они там. Просто в бинарном формате. Блокнот не умеет их читать. Используйте специализированные инструменты.
  2. Пытаюсь заменить иконку в .exe через Resource Hacker — и программа не запускается. Часто потому, что вы сохранили иконку не в том формате. Иконки в ресурсах — это не обычные .ico. Они хранятся в специальном формате Windows. Всегда экспортируйте через Resource Hacker — он сделает это правильно.
  3. Извлекаю строки, но они не на русском, хотя в системе русская локаль. Потому что в ресурсах может быть несколько версий строк: для en-US, ru-RU, de-DE. Нужно смотреть не только на тип, но и на язык. В Resource Hacker в дереве ресурсов есть столбец «Language» — выбирайте нужный.
  4. Пишу скрипт на Python, а он не видит ресурсы. Убедитесь, что файл не подписан (подписанные файлы иногда блокируют доступ к ресурсам) и что вы используете pefile.PE() с правильными флагами. Иногда нужно указать fast_load=True, если файл большой.
  5. Думаю, что можно просто заменить .exe-файл с новыми ресурсами и всё заработает. Нет. Если вы меняете размер ресурсов (например, добавляете длинный текст), то структура файла может нарушиться. Лучше пересобирать через Visual Studio — он корректно пересчитывает смещения.

Когда это реально нужно: сценарии

  • Ситуация: У вас есть старая программа на Windows XP, и она не поддерживает русский язык.
    Решение: Извлеките строки через Resource Hacker, переведите их в текстовом файле, замените через Visual Studio, пересоберите. Получите локализованную версию без исходников.
  • Ситуация: Вы делаете утилиту для сбора иконок из всех .exe в корпоративной сети.
    Решение: Напишите скрипт на Python с pefile — запустите на сервере, соберите все иконки в папку, сгенерируйте отчёт.
  • Ситуация: Вы хотите понять, почему в вашей программе отображается английская ошибка, хотя вы всё перевели.
    Решение: Откройте .exe в Resource Hacker → найдите RT_STRING → проверьте, есть ли строка с нужным ID в языке ru-RU. Часто разработчики забывают добавить перевод для нового сообщения.
  • Ситуация: Вы скачали установщик, и он показывает «InstallShield» вместо названия вашей компании.
    Решение: Извлеките RT_VERSION — там вы увидите, что компания указана как «InstallShield». Замените её через Visual Studio — и получите чистый установщик.

Как лучше делать — практические рекомендации

  • Всегда делайте бэкап. Изменение ресурсов может сломать файл. Копируйте .exe перед любыми действиями.
  • Проверяйте цифровую подпись. Если файл подписан (например, Microsoft, Adobe), то изменение ресурсов сделает подпись невалидной. Это не критично для личного использования, но может вызвать предупреждения антивируса.
  • Для строк — используйте ID, а не текст. В ресурсах строки идентифицируются по числовому ID (например, 101, 102). Это позволяет менять язык, не ломая логику программы. Не пытайтесь найти текст по содержанию — ищите по ID.
  • Иконки — не всегда 256×256. В ресурсах могут быть иконки разных размеров: 16×16, 32×32, 48×48. Resource Hacker покажет все — выбирайте нужный размер для вашего случая.
  • Не трогайте ресурсы в системных файлах. Например, explorer.exe или notepad.exe в C:\Windows. Это может сломать систему или вызвать проблемы с обновлениями.

Что делать дальше?

Если вы хотите извлечь ресурсы — начните с Resource Hacker. Он не требует знаний, работает сразу. Скачайте, откройте любой .exe — и посмотрите, что там внутри. Увидите иконки, строки, меню — и поймёте, как это работает.

Если вам нужно автоматизировать — напишите простой скрипт на Python. 10 строк кода — и вы получите инструмент, который работает с десятками файлов за секунды.

Если вы хотите менять текст или иконки — используйте Visual Studio. Это единственный способ, который гарантирует, что файл после изменений будет работать.

Никаких магических инструментов. Никаких «одного клика, чтобы всё исправить». Только понимание структуры, аккуратность и правильный выбор инструмента под задачу.

Ресурсы — это не тайна. Это часть архитектуры Windows. И когда вы научитесь их читать — вы перестанете видеть .exe как чёрный ящик. Вы начнёте видеть его как книгу — где каждая страница — это иконка, строка, диалог. И вы сможете редактировать её, как текст.

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

Оцените статью
PEFile — Безопасность и технологии простым языком