- Как определить используемый упаковщик по сигнатурам в заголовке PE-файла
- Где искать сигнатуры — и почему именно там
- Сигнатуры популярных упаковщиков — таблица
- Как искать — пошагово
- Что делать, если сигнатуры нет?
- Частые ошибки — и как их избежать
- Что выбрать — в зависимости от ситуации
- Как лучше делать — рекомендации
- Итог — что делать прямо сейчас
Как определить используемый упаковщик по сигнатурам в заголовке PE-файла
Ты работаешь с исполняемыми файлами — может, анализируешь вредоносное ПО, проверяешь лицензионность софта или просто хочешь понять, кто упаковал программу, чтобы избежать ложных срабатываний антивируса. Ты открываешь файл в хекс-редакторе, смотришь на заголовок PE — и видишь странные последовательности байтов. Что они значат? Кто их оставил? Это не случайный мусор. Это следы упаковщика.
Упаковщики — это инструменты, которые сжимают и шифруют исполняемый код, чтобы уменьшить размер файла, скрыть его от анализа или защитить от обратной разработки. Но они не умеют полностью исчезать. Оставляют следы. И если ты знаешь, где искать, эти следы — как отпечатки пальцев. Ты можешь точно сказать: «Это UPX», «Это Themida», или «Это кастомный упаковщик, который не встречался раньше».
В этой статье — только то, что нужно, чтобы определить упаковщик по сигнатурам в PE-заголовке. Без теории про архитектуру Windows, без обсуждения анти-анализа. Только конкретные байты, где их искать и что они значат.
Где искать сигнатуры — и почему именно там
PE-файл начинается с заголовка DOS, за ним — PE-заголовок. Внутри PE-заголовка есть разделы — секции. Их структура описана в IMAGE_SECTION_HEADER. Именно в этих заголовках секций чаще всего прячутся сигнатуры упаковщиков.
Почему именно там? Потому что упаковщик:
- заменяет оригинальный код на свой загрузчик;
- добавляет новые секции — например,
.textстановится.upx1или.packed; - меняет имена секций, чтобы сбить с толку анализаторы;
- пишет в начало новой секции уникальный набор байтов — сигнатуру.
Ты не ищешь сигнатуры в самом начале файла — там DOS-заголовок и MZ-подпись. И не в конечных данных — там может быть ресурсы или цифровая подпись. Ищи в именах секций и в первых 16–32 байтах первых новых секций.
Сигнатуры популярных упаковщиков — таблица
Вот что реально встречается на практике. Не теоретические примеры из статей 2010 года — а то, что ты увидишь сегодня в реальных файлах. Сигнатуры даны в виде HEX-строк, как ты их увидишь в хекс-редакторе. Начинаются они сразу после начала секции — в поле PointerToRawData или в первых байтах секции.
| Упаковщик | Имя секции | Сигнатура (HEX) | Где искать |
|---|---|---|---|
| UPX | .upx1, .upx0, .text |
55 50 58 00 или 55 50 58 21 |
Первые 4 байта новой секции |
| ASPack | .aspack, .adata |
41 53 50 43 |
Первые 4 байта секции |
| Themida / WinLicense | .text, .rsrc, .data |
54 68 65 6D 69 64 61 («Themida») |
Смещение 0x10–0x40 в первой секции |
| PECompact | .pecompact |
50 45 43 6F 6D 70 61 63 74 |
Первые 9 байт секции |
| NSPack | .nspack |
4E 53 50 41 43 4B |
Первые 6 байт секции |
| Enigma Virtual Box | .enigma1, .enigma2 |
45 4E 49 47 4D 41 |
Первые 6 байт секции |
| RLPack | .rlpack |
52 4C 50 41 43 4B |
Первые 6 байт секции |
| Custom / Unknown | .text, .data, .rsrc |
47 45 4E 45 52 41 54 45 44 20 42 59 («GENERATED BY») |
Смещение 0x10–0x30 в секции |
Запомни: имя секции — это только подсказка. Сигнатура — это доказательство. Упаковщик может переименовать секцию в .data, но сигнатура останется. И наоборот — имя .upx1 может быть подделано. Поэтому всегда проверяй и то, и другое.
Как искать — пошагово
Вот как ты действуешь на практике. Не теория — шаг за шагом, как делают на реальных инцидентах.
- Открой файл в хекс-редакторе (HxD, HexFiend, 010 Editor — неважно, главное, чтобы показывал PE-структуру).
- Найди сигнатуру
50 45 00 00— это начало PE-заголовка. Сдвинься на 0x18 от неё — там будетNumberOfSections. Запомни это число. - Сдвинься на 0x18 + 0x10 + (0x28 * NumberOfSections) — ты окажешься в начале секций. Каждая секция занимает 0x28 байт.
- Посмотри на первые 8 байт каждой секции — это имя секции. Ищи нестандартные имена:
.upx,.packed,.enigma,.aspack. - Если имя стандартное (
.text,.data), не пропускай её. Перейди к первым 32 байтам этой секции — в них может быть сигнатура. - Сравни байты с таблицей выше. Если нашёл совпадение — упаковщик определён.
- Если ничего не нашёл — проверь смещение 0x100–0x300 от начала файла. Иногда сигнатуры пишут туда, особенно в кастомных упаковщиках.
Пример: ты видишь секцию с именем .text, но в первых 4 байтах — 55 50 58 00. Это UPX. Даже если имя секции стандартное — сигнатура говорит правду.
Что делать, если сигнатуры нет?
Бывает. Особенно в кастомных упаковщиках или если файл был упакован несколько раз. Тогда ты переходишь на следующий уровень анализа.
- Смотри на размеры секций. UPX часто создаёт секции размером 0x1000–0x4000 байт. Themida — 0x2000–0x8000. Если одна секция занимает 90% всего файла — это почти всегда упакованный код.
- Проверь RVA и размеры. В нормальном PE-файле размеры секций логичны. Если
VirtualSizeв 10 раз большеSizeOfRawData— это признак упаковки. - Ищи необычные импорты. UPX и ASpack часто добавляют импорт
kernel32.dllс функциями вродеVirtualAlloc,VirtualProtect— для распаковки в памяти. - Проверь начальную точку входа (OEP). Если она указывает на середину секции, а не на начало — это почти всегда упаковщик. Настоящий OEP обычно в начале
.text.
Если ты всё это проверил — и ничего не подтвердилось — вероятно, это кастомный упаковщик. Тогда тебе нужно собрать его поведение: как он распаковывается, какие API вызывает, как меняет память. Но это уже другая задача — и она требует отладчика.
Частые ошибки — и как их избежать
Люди, которые только начинают, делают одни и те же ошибки. Вот самые опасные.
- Доверяют только имени секции. Секция может называться
.text, но внутри — UPX. Проверяй байты, а не имена. - Ищут сигнатуры в начале файла. UPX-сигнатура
55 50 58не в начале. Она в начале новой секции. Если ты смотришь только на первые 100 байт — пропускаешь всё. - Считают, что если сигнатуры нет — упаковщика нет. Нет сигнатуры — значит, упаковщик не из списка. Не значит, что его нет.
- Путают сигнатуры с кодом распаковки. Внутри секции может быть код, который выглядит как сигнатура — но это просто случайные байты. Сравнивай с известными шаблонами, а не с любым подозрительным набором.
- Игнорируют размеры и RVA. Если секция 0x100000 байт, а файл — 0x120000 — это почти всегда упаковка. Не жди сигнатуры, если структура выглядит подозрительно.
Что выбрать — в зависимости от ситуации
Ты не всегда хочешь знать, что за упаковщик. Ты хочешь понять: безопасно ли это? Нужно ли его анализировать глубже?
- Если ты анализируешь подозрительный файл (вредоносное ПО):
— Если нашёлThemidaилиWinLicense— это почти всегда вредонос. Они дорогие, используются в APT и киберпреступности.
— ЕслиUPX— не всегда плохо. Многие легальные программы упаковывают UPX. Но если файл маленький, а поведение агрессивное — это подозрительно. - Если ты проверяешь софт от компании:
— Если этоEnigma Virtual Box— скорее всего, это легальный инструмент для упаковки .NET-приложений.
— Если этоASPack— старый, но безопасный. Часто используется в старых программах. - Если ты разрабатываешь программу и хочешь упаковать её:
— Используй UPX. Он открытый, легальный, не оставляет следов, которые вызывают ложные срабатывания.
— Не используй Themida или WinLicense — они вызывают флаги у антивирусов даже у легального ПО. - Если ты видишь неизвестную сигнатуру:
— Запомни байты. Сравни с базами в VirusTotal или Any.Run.
— Если файл запускается и не делает ничего подозрительного — возможно, это кастомный упаковщик для внутреннего использования.
— Если он вызывает подозрения — не запускай его. Ищи другие признаки вредоносности.
Как лучше делать — рекомендации
- Создай себе локальную базу сигнатур. Сохраняй в текстовом файле:
UPX: 55 50 58 00,Themida: 54 68 65 6D 69 64 61— и копируй её в хекс-редакторе. Это сэкономит тебе часы. - Используй
PEiDилиDetect It Easy— но не как основной инструмент. Они часто ошибаются. Используй их как подсказку, а потом проверяй вручную. - Если ты работаешь с тысячами файлов — напиши простой скрипт на Python с
pefile. Он будет искать сигнатуры автоматически. Это быстрее, чем открывать каждый файл вручную. - Не полагайся на антивирус. Он может не распознать упаковщик, но поставить флаг «подозрительно». Ты должен понимать, почему.
- Всегда сравнивай с оригинальным файлом. Если ты знаешь, как выглядел файл до упаковки — ты сразу увидишь изменения.
Итог — что делать прямо сейчас
Если ты открыл PE-файл и хочешь понять, кто его упаковал — сделай так:
- Найди начало секций (после PE-заголовка).
- Проверь имена секций — ищи
.upx,.aspack,.enigmaи т.д. - Если имена стандартные — смотри первые 32 байта каждой секции. Сравни с таблицей.
- Если нашёл совпадение — упаковщик определён. Запомни его.
- Если не нашёл — смотри на размеры, RVA, импорты и точку входа. Подозрительная структура = упаковка, даже без сигнатуры.
- Не доверяй именам. Доверяй байтам.
Сигнатуры — это не магия. Это следы. И ты — детектив, который умеет читать эти следы. С каждым файлом ты становишься лучше. Не гонись за сложными инструментами. Просто смотри на байты — и ты увидишь то, что другие пропускают.
Информация в этой статье носит ознакомительный характер. Анализ исполняемых файлов может быть связан с юридическими и этическими рисками. Всегда действуй в рамках закона и с разрешения владельца ПО.
