- Как найти упаковщик в PE-файле: разбор по сигнатурам
- Зачем вообще это нужно?
- Где искать: структура PE-файла
- 1. Секция .text и заголовок IMAGE_NT_HEADERS
- 2. Символьные строки (Strings)
- 3. Магические байты (Magic Numbers)
- Таблица: Самые популярные сигнатуры
- Пошаговый алгоритм поиска
- Частые ошибки при определении
- Что делать, если сигнатуры нет?
- Сценарии выбора: когда и какой подход использовать
- Как выбрать инструмент для анализа
- Итог: ваш чек-лист
Как найти упаковщик в PE-файле: разбор по сигнатурам
Представьте, что вы открыли исполняемый файл (.exe), а внутри — каша из байтов. Вы пытаетесь анализируть его поведение, но код нечитаем. Скорее всего, вы столкнулись с упакованным файлом. Это не баг и не повреждение. Это способ защиты (или сокрытия вредоносного кода), когда оригинальная программа сильно сжата и зашифрована. Чтобы понять, что внутри, нужно найти «ключ». Этот ключ — сигнатура упаковщика в заголовке файла.
В этой статье я расскажу, как по внешним признакам в структуре PE-файла определить, какой именно инструмент использовался для его упаковки. Мы не будем уходить в дебри теории форматирования файлов, а разберем конкретные места, куда нужно смотреть, чтобы получить ответ за пару секунд.
Зачем вообще это нужно?
Когда вы держите в руках подозрительный .exe, ваша первая задача — понять, с чем вы имеете дело. Если файл «чистый», вы можете сразу браться за дизассемблер. Если он упакован, вам нужно сначала его распаковать, иначе анализировать нечего.
Определение упаковщика решает три главные задачи:
- Выбор стратегии распаковки. Для каждого упаковщика есть свой способ распаковки. UPX раскрывается одной командой, ASPack — утилитой другого разработчика, а кастомные самописные обвязки требуют ручного анализа.
- Оценка сложности. Видя, что файл упакован в UPX, вы понимаете, что это стандартный инструмент и задача тривиальна. Если вы видите сигнатуру «CustomCrypt» или набор странных секций, это сигнал о том, что автор намеренно скрыл код, и анализ будет долгим.
- Классификация угрозы. Определенные упаковщики чаще всего используют вирусы, другие — легальный софт для защиты авторских прав. Зная упаковщик, вы часто сразу понимаете контекст: это утечка данных, шифровальщик или просто пиратская версия игры.
Давайте разберемся, как найти эти «отпечатки пальцев» в структуре файла.
Где искать: структура PE-файла
Исполняемые файлы Windows имеют формат PE (Portable Executable). Он похож на коробку с четко размеченными отсеками. Вам не нужно знать всё про этот формат, достаточно уметь находить три конкретных места, где упаковщики оставляют свои следы.
Чтобы посмотреть на эти данные, вам понадобится Hex-редактор (например, HxD, WinHex или 010 Editor) и текстовый редактор. Откройте файл в Hex-редакторе и обратите внимание на начало файла.
1. Секция .text и заголовок IMAGE_NT_HEADERS
Первое, что видит упаковщик, — это заголовок файла. Стандартная структура PE начинается с MZ-заголовка, за ним идут заголовки секций. Обычно первая секция называется .text или .code. Именно там находится исполняемый код.
Но упаковщик часто меняет имена секций. Если вы видите секцию с именем вроде UPX0, UPX1, aspack, vmp — это первый и самый явный сигнал. Имя секции — это левая сторона сигнатуры. Упаковщик просто переименовал стандартные секции, чтобы показать, кто он.
Однако, если имена секций стандартные, нужно смотреть глубже — в заголовок самой секции. Справа от имени секции находятся характеристики (Characteristics) и смещения. Но самое главное — это то, что находится сразу после заголовков секций. Там часто лежит так называемый «Stub» — небольшая программа распаковки.
2. Символьные строки (Strings)
Это самый простой способ для новичка. Упаковщик — это программа, и она, как и любая программа, использует строки. В коде распаковки или в секции ресурсов часто остаются строки, которые упаковщик добавил в файл.
В Hex-редакторе переключитесь в режим просмотра строк (обычно это правая колонка). Ищите:
- Имена компаний-разработчиков упаковщиков (например, «UPX Team», «Nc Software», «Kaspersky Lab» — если это антивирусный шифратор).
- Тексты ошибок распаковки (например, «This program cannot be run in DOS mode», «Wrong unpacker version»).
- Строгие последовательности букв и цифр.
Часто упаковщик оставляет строку с названием версии: UPX 3.96 или ASPack 2.12. Это золото для аналитика. Как только вы нашли такую строку, вы уже знаете инструмент и его версию.
3. Магические байты (Magic Numbers)
Это наиболее технический и надежный метод. Каждый упаковщик оставляет свои уникальные последовательности байтов в начале файла или в секции кода. Это называется «подпись» или «сигнатура».
В отличие от строк, которые можно переименовать или удалить, эти байты — часть алгоритма распаковки. Если вы измените их, файл перестанет работать. Поэтому упаковщики «приклеивают» их к началу исполняемого кода.
Типичный пример: если вы видите в начале секции кода (после заголовков) последовательность EB 10 5E, это может быть признаком конкретного упаковщика. Но чаще всего ищут более длинные и узнаваемые строки байтов. Например, последовательность 55 8B EC 81 EC ... — это стандартный пролог функции, но если за ней следует специфичный набор инструкций, характерный для упаковщика, это и есть сигнатура.
Таблица: Самые популярные сигнатуры
Ниже я собрал таблицу с наиболее распространенными упаковщиками и их признаками, которые можно найти в файле. Это именно те данные, которые вы ищете в Hex-редакторе.
| Название упаковщика | Название секции (часто) | Строковые признаки (Strings) | Байтовые сигнатуры (Magic Bytes) | Сложность анализа |
|---|---|---|---|---|
| UPX (Ultimate Packer for eXecutables) | .upx0, .upx1 (иногда .text) |
«UPX0», «UPX1», «UPX!», имя версии (например, UPX 3.91) | В начале файла: EB ? 5? ... Или строка: «UPX!» в секции данных |
Низкая (распаковывается одной утилитой) |
| ASPack | .aspack
|
«ASPack», «ASPack 2.x», «Nc Software» | В начале кода: EB 10 5E 8B 75 0C (пример) |
Средняя (требует сплайсинга или специальных плагинов) |
| Themida / VMProtect | .vmp0, .vmp1, .themida
|
«Themida», «VMProtect», «Oreans Technologies» | Очень сложная. Часто нет единой сигнатуры, вместо этого — виртуальные инструкции. | Высокая (требует деобфускации, ручного анализа) |
| PESpin | .spin
|
«PESpin», «PESpin 1.x» | В секции ресурсов может быть строка с названием | Средняя |
| Enigma Protector | .enigma0, .enigma1
|
«Enigma Protector», «Enigma Software Group» | Специфичные вызовы API, характерные для защиты Enigma | Высокая |
| MPRESS | .mpress0, .mpress2
|
«MPRESS», «MPRESS 2.x» | «MPRESS!» в секции ресурсов | Низкая |
| Custom / Self-Write | Странные имена: .data, .rsrc, sec1 |
Отсутствуют или «пиратские» названия | Уникальная последовательность, не совпадающая с базой | Очень высокая |
Обратите внимание на колонку «Название секции». Если вы видите имя секции, содержащее название упаковщика (UPX, ASPack), вы уже на 90% определили инструмент. Но если секции названы стандартно, переходите к поиску строк и байтов.
Пошаговый алгоритм поиска
Теперь соберем это в конкретный алгоритм действий. Допустим, у вас на руках файл worm.exe. Вы не знаете, что это. Вот что нужно сделать:
- Проверьте имя секций. Откройте файл в Hex-редакторе. Прокрутите до заголовков секций (обычно это начало файла, после MZ и PE-заголовков). Ищите имена секций. Если видите
.upx0или.aspack— вы нашли ответ. Запишите имя и ищите соответствующую утилиту для распаковки. - Поиск строк. Если секции названы
.text,.rdataи т.д., используйте функцию поиска строк (Ctrl+F в HxD, вкладка «Найти» -> «Текст»). Введите: «UPX», «ASPack», «VMProtect». Если нашли — отлично. Также ищите короткие странные слова, которые могут быть именем упаковщика. - Анализ первой инструкции. Если строки не помогли, посмотрите на начало исполняемого кода. В PE-файле это смещение
0x1000(обычно, зависит от размера заголовков). Посмотрите на первые 20–30 байт. Сравните их с известными сигнатурами в таблице выше. Если видите последовательностьEB 10 5E..., это может быть ASPack. Если видите что-то совершенно странное, возможно, это кастомный упаковщик. - Проверка по базе. Если вы нашли странный набор байтов, но не знаете, что это, загуглите их в формате
"EB 10 5E" filetypeили используйте специализированные утилиты (например, PEiD в старых версиях или более современные аналоги). Они сверяют найденные байты с базой данных сигнатур.
Частые ошибки при определении
Опыт приходит с ошибками. Вот три вещи, которые чаще всего сбивают с толку начинающих:
Ошибка 1: Путаница с импортом. Вы видите в таблице импорта функции VirtualAlloc или LoadLibrary и думаете, что это признак упаковщика. Это не так. Практически все упаковщики используют эти функции для выделения памяти и загрузки библиотек. Это нормальная практика, а не сигнатура.
Ошибка 2: Игнорирование «пустых» секций. Иногда упаковщик создает секцию с именем .empty или просто .. Вы можете пропустить её, думая, что это ошибка. Но часто именно в такой секции лежит распакованный код или данные. Всегда внимательно проверяйте имена всех секций, даже самых странных.
Ошибка 3: Вера только в одну сигнатуру. Вы нашли один набор байтов и решили, что это точно ASPack. Но современные упаковщики могут менять сигнатуры, чтобы обмануть детекторы. Всегда перепроверяйте по строчкам и по именам секций. Если все три признака не сходятся, скорее всего, это что-то более сложное.
Что делать, если сигнатуры нет?
Иногда вы открываете файл, а там полный хаос. Имя секций — стандартное, строк с названиями нет, байты на первый взгляд выглядят как случайный мусор. В этом случае у вас два пути:
Вариант А: Кастомный упаковщик. Если файл создан для конкретного бизнеса (например, защита ключевого ПО банка), там часто используются самописные упаковщики. Они не имеют подписей в интернете. В таком случае вам придется анализировать код вручную. Ищите точку входа (OEP — Original Entry Point). Если точка входа находится далеко от начала файла (например, на смещении 0x15000, а файл имеет размер 0x20000), значит, код «перевернут» упаковщиком. Это признак сложной защиты.
Вариант Б: Эвристический анализ. Запустите файл в песочнице (Sandbox) и посмотрите, что он делает. Если он начинает создавать новые файлы, менять реестр или соединяться с сетью — это вредонос. Даже если вы не знаете упаковщика, вы можете понять его поведение. Но для анализа кода все равно придется распаковать его. Для этого часто используются отладчики (x64dbg, OllyDbg). Вы запускаете файл, ставите breakpoint на функции распаковки и даете программе запуститься до момента, когда она распакует себя в память.
Сценарии выбора: когда и какой подход использовать
Выбор метода зависит от вашей ситуации. Вот как это работает на практике:
Сценарий 1: «Обычный файл, который не запускается»
Человек скачал софт, он выдает ошибку. Вы проверяете сигнатуры. Если видите UPX, значит, файл просто упакован. Решение: скачайте утилиту upx -d и распакуйте. Это 100% рабочий вариант для легального софта.
Сценарий 2: «Подозрительный файл из почты»
Вам прислали файл, и вы хотите проверить, вирус ли это. Вы смотрите на сигнатуры. Если видите ASPack или Themida, это красный флаг. Легальный софт редко использует такие мощные упаковщики для простых программ. Скорее всего, это вредонос. Решение: не запускайте его на хостовой системе. Откройте в виртуальной машине и анализируйте поведение.
Сценарий 3: «Reverse Engineering для защиты»
Вы разработчик и хотите понять, как защитить свой продукт. Вы смотрите на файлы конкурентов. Если видите VMProtect или Enigma, значит, они используют коммерческие решения. Вы можете выбрать аналогичный инструмент. Если видите самописный код — значит, они вложили много денег в кастомную защиту (это дорого и сложно).
Как выбрать инструмент для анализа
Когда вы определили упаковщик, вам нужен инструмент. Вот краткий гид:
- UPX: Официальная утилита UPX. Команда
upx -d file.exe. Работает мгновенно. - ASPack: Утилита
UnASPackили плагины для IDA Pro. Внимание: современные версии ASPack могут иметь защиту от распаковки, тогда придется анализировать вручную. - VMProtect / Themida: Нет «кнопки» для распаковки. Здесь нужны плагины для отладчиков (например,
ScyllaHideилиVMProtect Unpacker), но они часто работают нестабильно. Лучший вариант — анализ кода в OllyDbg/x64dbg. - PEiD (устаревший, но полезный): Старая, но мощная утилита. Она сканирует файл по базе сигнатур и выдает название. Если файл новый, база может не знать его, но старые версии часто работают лучше, чем современные детекторы.
Итог: ваш чек-лист
Чтобы закрепить материал, давайте подытожим. Когда вы смотрите на PE-файл, делайте следующее:
- Посмотрите на секции. Есть ли в именах секций слова типа UPX, ASPack, VMP? Если да — вы нашли упаковщика.
- Проверьте строки. Ищите названия упаковщиков в тексте файла. Это самый быстрый способ.
- Сверьте байты. Если строки молчат, посмотрите на первые байты кода и сравните с известными сигнатурами.
- Оцените сложность. UPX и MPRESS — простые. VMProtect и кастомные обвязки — сложные.
- Действуйте. Используйте соответствующую утилиту для распаковки или переходите к ручному анализу.
Помните, что упаковщик — это не стена, а дверь. Он просто прячет код за оберткой. Ваша задача — найти эту дверь. И чаще всего она подписана прямо на заголовке файла. Если вы научитесь быстро считывать эти сигнатуры, вы сэкономите часы своей работы и сможете быстрее понять, что скрывается за «мусором» в исполняемом файле.
Не бойтесь экспериментировать. Откройте несколько файлов (и своих, и чужих), посмотрите на их заголовки в Hex-редакторе. Со временем вы начнете узнавать сигнатуры «на глаз», и вам не придется каждый раз гуглить их значения.
