- Как увидеть и изменить таблицу конфигурации в PE-файле: практическое руководство
- Что такое таблица конфигурации и зачем она нужна
- Как увидеть таблицу конфигурации
- 1. PE-bear (лучший для новичков)
- 2. CFF Explorer (для продвинутых)
- 3. Python + pefile (для автоматизации)
- Как изменить таблицу конфигурации
- Таблица: что означают флаги в таблице конфигурации
- Частые ошибки — и как их избежать
- Когда что делать: сценарии выбора
- Как лучше делать: практические рекомендации
- Итог: что делать прямо сейчас
Как увидеть и изменить таблицу конфигурации в PE-файле: практическое руководство
Ты работаешь с исполняемыми файлами — может, дебажишь кривой софт, пишешь патч для старой программы, или разбираешься с антивирусными ложными срабатываниями. И вдруг сталкиваешься с тем, что файл не запускается на какой-то системе, падает при старте, или антивирус ругается на «подозрительную конфигурацию». Ты открываешь файл в IDA, Ghidra или x64dbg — и видишь, что в структуре PE-файла есть таблица конфигурации. Но что с ней делать? Как её увидеть? А если нужно изменить — как это сделать без того, чтобы файл сломался?
Эта статья — не теория. Это пошаговый гайд, как реально работать с таблицей конфигурации в PE-файле. Без воды, без общих фраз. Только то, что работает на практике.
Что такое таблица конфигурации и зачем она нужна
Таблица конфигурации (Configuration Table) — это структура в PE-файле, которая хранит параметры, влияющие на поведение программы при загрузке. Она появилась в Windows XP SP2 и стала обязательной для многих современных приложений. В ней описаны:
- Флаги безопасности: DEP, ASLR, SEH, Control Flow Guard (CFG)
- Пути к библиотекам, которые нужно загрузить до основного кода
- Настройки управления памятью
- Параметры для эмуляции совместимости (например, для старых приложений)
- Пути к файлам манифестов
Это не просто метаданные — это инструкция для загрузчика Windows. Если ты изменишь значение в этой таблице, ты меняешь то, как Windows запускает твой файл. Например:
- Отключишь ASLR — программа будет загружаться в один и тот же адрес каждый раз (удобно для дебага, но опасно в продакшене)
- Отключишь DEP — программа может запуститься, если она использует исполняемый код в куче (но антивирус её сразу заблокирует)
- Добавишь путь к кастомному DLL — и программа начнёт грузить твой код при старте (это часто используют в патчинге)
Ты не видишь эту таблицу в обычном текстовом редакторе. Она спрятана в структуре PE. И если ты её не знаешь — ты не можешь её изменить. А если попытаешься — сломаешь файл.
Как увидеть таблицу конфигурации
Есть три надёжных способа. Выбирай в зависимости от того, что тебе нужно: быстро посмотреть, или глубоко разобраться.
1. PE-bear (лучший для новичков)
Это бесплатный, простой и мощный инструмент. Скачай его с GitHub — он не требует установки. Открываешь PE-файл — и сразу видишь в левом меню пункт Configuration Table. Кликни — и ты увидишь всё содержимое таблицы в виде читаемой таблицы: поля, значения, флаги.
Преимущество: не нужно ничего знать о PE-структуре. Ты видишь, что в Security Flags стоит 0x00000040 — это ASLR включён. В Load Configuration Size — 112 байт. Всё понятно.
2. CFF Explorer (для продвинутых)
Если ты уже работал с PE-файлами — CFF Explorer твой лучший друг. Открываешь файл → вкладка NT Headers → Optional Header → ищи раздел Data Directories. Найди 10-й элемент — Configuration Table. Там будет указатель (RVA) и размер.
Потом переходи в Directory Explorer → найди этот же RVA → кликни — откроется таблица конфигурации. Ты увидишь структуру в виде полей: VirtualAddress, Size, TimeDateStamp, MajorVersion, MinorVersion, GlobalFlagsClear, GlobalFlagsSet, CriticalSectionDefaultTimeout, и так далее.
Это не просто просмотр — это редактирование. Ты можешь менять значения прямо здесь.
3. Python + pefile (для автоматизации)
Если тебе нужно проверять сотни файлов — используй Python. Установи:
pip install pefile
А потом скрипт:
import pefile
pe = pefile.PE('your_file.exe')
if hasattr(pe, 'DIRECTORY_ENTRY_LOAD_CONFIG'):
config = pe.DIRECTORY_ENTRY_LOAD_CONFIG.struct
print(f"ASLR: {'Enabled' if config.Flags & 0x00000040 else 'Disabled'}")
print(f"DEP: {'Enabled' if config.Flags & 0x00000008 else 'Disabled'}")
print(f"CFG: {'Enabled' if config.Flags & 0x00000080 else 'Disabled'}")
print(f"Size: {config.Size} bytes")
Этот код не просто показывает — он позволяет автоматизировать поиск файлов с отключённой ASLR или с неправильными флагами. Полезно, если ты проверяешь пакеты ПО на соответствие требованиям безопасности.
Как изменить таблицу конфигурации
Просмотр — это одно. Изменение — другое. Тут легко всё сломать. Делай так:
- Создай резервную копию файла. Никогда не работай с оригиналом.
- Открой файл в CFF Explorer (лучший выбор для редактирования).
- Перейди в Directory Explorer → найди Load Configuration Table.
- Кликни по полю, которое хочешь изменить. Например,
Flags. - Введи новое значение в HEX. Например, чтобы отключить ASLR, убери бит
0x00000040. Если было0x00000048(ASLR + DEP), сделай0x00000008(только DEP). - Сохраняй файл как новый — не перезаписывай оригинальный.
Важно: не меняй размер таблицы (поле Size). Он должен оставаться тем же, что и был. Если ты его увеличишь — загрузчик может не понять структуру. Если уменьшишь — потеряешь важные данные.
Таблица: что означают флаги в таблице конфигурации
Вот ключевые флаги, которые ты будешь менять чаще всего. Все значения — в HEX.
| Флаг | Значение | Что делает | Когда использовать |
|---|---|---|---|
| DEP (Data Execution Prevention) | 0x00000008 |
Запрещает выполнение кода в областях памяти, выделенных под данные | Всегда включать. Отключать — только для отладки старого кода |
| ASLR (Address Space Layout Randomization) | 0x00000040 |
Случайно смещает адреса загрузки модулей | Включать в продакшене. Отключать — если пишешь дебаггер или анализируешь статичные адреса |
| CFG (Control Flow Guard) | 0x00000080 |
Проверяет, что вызовы функций идут только к разрешённым адресам | Включать для новых приложений. Отключать — если приложение использует динамический код (например, JIT) |
| SEH (Structured Exception Handling) | 0x00000004 |
Запрещает использование устаревших обработчиков исключений | Отключать — только если приложение написано под WinXP и использует старый SEH |
| ForceRelocate | 0x00000001 |
Принудительно пересчитывает все адреса при загрузке | Использовать, если файл не запускается на разных системах из-за конфликта адресов |
| HighEntropyVA | 0x00000020 |
Использует 64-битную случайность для адресов (только на 64-битных системах) | Включать для 64-битных приложений — повышает безопасность |
Пример: у тебя есть старое приложение, которое падает с ошибкой Access Violation на Windows 10. Ты смотришь в CFF Explorer — видишь, что Flags = 0x00000048 (ASLR + DEP). Отключаешь ASLR → ставишь 0x00000008. Файл запускается. Не потому что ты «исправил баг» — а потому что приложение использует жёстко закодированные адреса, которые теперь не смещаются.
Частые ошибки — и как их избежать
Люди ломают файлы не потому, что не знают, как работать с таблицей. Они ломают, потому что не понимают, что делают. Вот самые частые ошибки:
- Меняют размер таблицы. Увеличивают
Sizeна 16 байт, чтобы «добавить поле». Результат: файл не запускается. Таблица имеет строгую структуру. Нельзя просто «вставить» данные. Если нужно добавить — нужно перестроить всю структуру, а это уже не редактирование, а переписывание. - Отключают все флаги безопасности. «Чтобы заработало» — выключают DEP, ASLR, CFG. Результат: антивирус блокирует файл, система выдаёт предупреждение, пользователь не доверяет приложению. Это не решение — это временная подмена.
- Редактируют в Hex-редакторе без понимания структуры. Ты видишь в Hex-редакторе 4 байта
40 00 00 00— думаешь, это флаг ASLR. Но это может быть просто адрес. Без правильной интерпретации через PE-структуру ты рискуешь повредить не только флаг, но и указатели на другие данные. - Изменяют таблицу без тестирования на целевой системе. Ты отключил ASLR на Windows 11 — и думаешь, что это сработает на Windows 7. Но там другая версия загрузчика. Тестировать нужно на той же версии ОС, на которой файл будет работать.
- Пытается добавить DLL через таблицу, не проверив, что она существует. Если ты добавишь путь
C:\MyPatch\hack.dllвLoadConfig->DelayImportDescriptor, но этой DLL нет — приложение не запустится вообще. Никаких ошибок в логах — просто молчаливый краш.
Когда что делать: сценарии выбора
Ты не можешь просто «включить всё». Ты должен выбирать в зависимости от цели. Вот как принимать решения:
- Если ты дебажишь старую программу, которая падает на Windows 10 — отключи ASLR и SEH. Оставь DEP включённым. Это снизит риск, но даст тебе стабильные адреса для отладки.
- Если ты пишешь патч для игры, которая использует скрипты с JIT — отключи CFG. Но не трогай ASLR и DEP. CFG мешает динамическому коду, а ASLR и DEP — безопасны.
- Если ты анализируешь вредоносное ПО — смотри, какие флаги отключены. Если DEP и ASLR отключены — это красный флаг. Если есть путь к DLL в таблице — проверь, откуда она загружается. Это может быть подмена библиотеки.
- Если ты собираешь пакет ПО для корпоративного развертывания — включи все флаги: ASLR, DEP, CFG, HighEntropyVA. Не трогай таблицу вообще. Это стандарт безопасности.
- Если файл не запускается, и ты не знаешь почему — открой его в PE-bear и сравни с рабочей версией. Часто проблема в том, что флаг
ForceRelocateне установлен, а файл был скомпилирован с предположением, что он будет загружен по фиксированному адресу.
Как лучше делать: практические рекомендации
Вот что работает на практике:
- Всегда используй CFF Explorer или PE-bear для редактирования. Не редактируй в Hex-редакторе, если не понимаешь структуру на уровне байт.
- После изменения — проверяй файл через
sigcheck -v your_file.exeиз Sysinternals. Он покажет, какие флаги активны. - Тестируй на реальной системе. Не на виртуалке с упрощённой конфигурацией. Используй VirtualBox с чистым Windows 7/10/11, как у целевого пользователя.
- Если ты меняешь таблицу конфигурации, чтобы обойти антивирус — это не решение. Это временная хитрость. Антивирусы легко обнаруживают такие изменения. Лучше исправить саму программу.
- Если ты работаешь с .NET-приложением — таблица конфигурации не имеет значения. Она используется только для нативных PE-файлов. .NET-приложения читают свои настройки из манифестов и метаданных CLR.
- После изменения — проверь контрольную сумму файла. Если она изменилась — это нормально. Но если ты должен подписать файл (например, для Windows Store или корпоративного развертывания) — тебе нужно переподписать его. Без подписи он может не запуститься на системах с включённым Secure Boot.
Итог: что делать прямо сейчас
Если ты хочешь увидеть таблицу конфигурации — скачай PE-bear. Открой файл. Найди «Configuration Table». Прочитай флаги. Пойми, что включено, а что выключено.
Если хочешь изменить — открой тот же файл в CFF Explorer. Измени только нужный флаг. Не трогай размер. Сохрани под другим именем. Потестируй на той же ОС, где будет работать файл.
Если ты не знаешь, что делать с конкретным значением — не трогай. Лучше оставить как есть, чем сломать. Таблица конфигурации — не инструмент для «всё включить» или «всё выключить». Это точный инструмент для точной задачи.
Ты не должен менять таблицу конфигурации, чтобы «сделать программу быстрее» или «уменьшить размер файла». Ты меняешь её, чтобы решить конкретную проблему: запуск, совместимость, отладка, анализ. И только тогда.
Если ты сделал всё правильно — файл работает. Если нет — ты знаешь, где искать проблему. И это уже прогресс.
Информация в этой статье предназначена для образовательных и исследовательских целей. Изменение таблицы конфигурации PE-файла может нарушать лицензионные соглашения, снижать безопасность системы или нарушать законы. Применяйте описанные методы только на файлах, которыми вы владеете или имеете право изменять. При работе с промышленными или корпоративными системами всегда консультируйтесь с ответственными специалистами.
