Как распаковать upx файл
Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.
What can I do to prevent this in the future?
If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.
If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.
Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.
Cloudflare Ray ID: 71af265b58e39170 • Your IP : 82.102.23.104 • Performance & security by Cloudflare
PE Explorer
English
Deutsch
Русский
- Обзорный тур
- Ссылки:
главная
программы
pe explorer
обзорный тур
Распаковщик UPX
Автоматическая распаковка файлов, сжатых UPX
В состав PE Explorer входит плагин для распаковки UPX. Этот плагин вызывается при каждом открытии файла и анализирует, не является ли открываемый файл сжатым при помощи UPX. Поддерживаются все версии UPX, начиная с самых ранних версий (до 0.80) и заканчивая самыми новыми 3.9x версиями.
Кроме того, PE Explorer поддерживает распаковку файлов, которые после сжатия UPX подверглись модификации с использованием так называемых UPX-скрэмблеров: Advanced UPX Scrambler, UPoLyX, UPX Lock. Так же PE Explorer поддерживает распаковку Upack и NSPack.
Теперь вы можете открывать файлы, сжатые UPX, и даже не заметить, что они были сжаты!
В случае, если открываемый исполняемый файл оказывается запакован UPX, плагин для распаковки UPX автоматически распаковывает файл и воссоздаёт его в его оригинальной несжатой форме, что позволяет вам проводить дальнейший анализ файла в PE Explorer.
При сохранении на диск файл записывается так же в распакованном виде. PE Explorer не запаковывает файл обратно. По этой причине размер файла до и после открытия может существенно отличатся, даже если вы не вносили в него никаких изменений.
Плагин для распаковки UPX отображает всю информацию о ходе процесса декомпрессии файла в нижней панели лога:
Распаковка вредоносных программ
Плагин для распаковки UPX содержит механизм распаковки файлов, которые подверглись модификации после сжатия. Такие файлы не могут быть распакованы стандартными средствами самого UPX, поскольку была изменена внутренняя структура файла. Например, имя секции UPX переименовано в XYZ, или версия формата UPX исправлено с 1.20 на 3.21. Эта техника часто используется вирусмейкерами для маскировки и защиты от распаковки.
Чтобы распаковать такой EXE файл самостоятельно, вам бы пришлось запустить его и снять дамп запакованных участков памяти с последующей записью на жёсткий диск после того, как файл полностью распакуется в памяти компьютера.
PE Explorer полностью избавляет вас от необходимости этим заниматься. Всё, что нужно, чтобы распаковать подобный обфусцированный файл — это просто открыть его в PE Explorer. Все операции по распаковке происходят автоматически.
Более того, плагин для распаковки UPX предпринимает попытку восстановить исходный файл, даже если в сжатом файле отсутствует оригинальный PE заголовок. Обычно отсутствие заголовка у PE файла делает его полностью неработоспособным и не подлежащим восстановлению. Однако, используя PE Explorer, вы получаете неплохой шанс на восстановление и анализ таких файлов.
Менеджер плагинов
При выборе команды Plug-in Manager из меню Tools открыается окно Менеджера плагинов .
Менеджер плагинов отображает список плагинов, подключенных к PE Explorer, и позволяет устанавливать очередность их выполнения. Чем больше значение Priority, тем выше приоритет выполнения. Установив значение Priority равным нулю, вы отключаете плагин. Отключенные плагины помечены красным значком, включенные — зелёным.

Пожалуйста, обратите внимание, что текущая версия PE Explorer пока не поддерживает выполнение цепочки плагинов. Это значит, что сейчас вызов следующего по списку плагина произойдёт только в том случае, если предыдущий плагин вернул FALSE после исполнения. После первого же успешного срабатывания любого плагина процесс обработки прекращается и файл передаётся в PE Explorer.
Написание собственных плагинов
Плагин для распаковки UPX предназначен для только работы с файлами, сжатыми UPX. Если вы хотите расширить функциональность PE Explorer и создать свой собственный плагин для обработки файла во время его открытия, воспользуйтесь предоставленным API для плагинов. Документацию по API можно найти в файле помощи, в разделе Plug-Ins.
Обзорный тур
назад | след. 
Крепость эльфов. Как распаковать исполняемый файл Linux, накрытый UPX

Эта статья написана по мотивам доклада с новогодней сходки, организованной сообществом SPbCTF в декабре 2020 года. Запись сходки со всеми докладами доступна на канале SPbCTF в YouTube.
Зачем это все?
На страничке одного хорошего пакера можно прочесть, что основная цель его существования — уменьшить размер исполняемого файла с вытекающей отсюда экономией дискового пространства и сетевого трафика. Например, UPX позволяет сжать исполняемый файл на 50–70%, и он останется полностью самодостаточным, потому что код, выполняющий распаковку в память, добавляется к получившемуся бинарю. Для этого же упаковка используется и в PyInstaller при сборке кода на Python в независимые исполняемые файлы PE или ELF (при этом он может работать и в тандеме с UPX).
Однако, как ты догадываешься, пакеры отлично подходят еще и для того, чтобы немного подпортить жизнь реверс‑инженеру. В этом ключе родственны им крипторы. В мире Linux, однако, это скорее проекты, больше похожие на proof-of-concept, либо же просто что‑то старое и, прямо скажем, в живой природе почти не встречающееся.
Из упаковщиков для файлов ELF в настоящее время наиболее популярен UPX (в частности, среди вирусописателей), поскольку остальные пакеры либо поддерживают полторы архитектуры, либо уже очень давно не обновлялись (оценить количество канувших в Лету проектов можно, полистав давний обзор упаковщиков для Linux/BSD от Криса Касперски).
Принцип работы среднестатистического пакера
Концептуально упаковщик работает так. Код и данные программы сжимаются без потерь каким‑либо алгоритмом (с использованием lzma, zlib или чего‑либо еще), добавляется код, выполняющий распаковку того, что получилось, затем добавляются собственные заголовки, и вуаля — у нас сжатый бинарь. Схематично процесс упаковки представлен ниже.
Упаковка исполняемого файла
При запуске такого файла начнет выполняться загрузчик, отвечающий за распаковку сжатого кода и данных в память, после чего он передает управление в оригинальную точку входа. Грубо говоря, получается самораспаковывающийся архив. Детали реализации в разных пакерах могут различаться — например, PyInstaller при создании exe-файла помещает упакованные данные в оверлей, а загрузчик находится перед упакованными данными, а не после, как на схеме. Более изощренные упаковщики (скорее больше напоминающие крипторы), могут еще больше усложнять этот процесс, но в целом это не меняет сути.
Как правило, полученный после упаковки файл может затем распаковываться двумя способами: либо при запуске — в память загрузчиком, либо же без его запуска — путем статической распаковки. Результаты распаковки при этом будут несколько различаться, потому что исполняемый файл, загруженный в память, уже не тот, что исходный файл на диске.
The Ultimate Packer for eXecutables
Этот проект празднует в нынешнем году 25-летие. Его исходники доступны на Гитхабе, он написан на плюсах с примесью ассемблера, поэтому разбираться в коде довольно‑таки весело. UPX поддерживает множество типов файлов и архитектур — не зря он такой популярный. Более того, PyInstaller имеет опцию —upx-dir , позволяющую при создании архива упаковать его при помощи UPX, тем самым уменьшая размер результирующего файла.
Как происходит упаковка программы в UPX? Вначале определяется ее формат — PE, ELF, образ ядра Linux или что‑либо еще (говорят, в UPX можно паковать даже sh-скрипты!). После этого нужно определить архитектуру, под которую скомпилирован файл. Это связано с тем, что загрузчик, который называется в коде UPX stub loader («заглушка», стаб), платформенно зависим. Его код написан на языке ассемблера, потому что при сжатии разработчики стараются экономить буквально каждый байт и добиться максимальной компрессии. В связи с этим бывает и так, что сам загрузчик тоже частично упакован. Так что UPX поддерживает те архитектуры, под которые у него есть реализация стаба. Оценить список архитектур и типов файлов можно, взглянув на содержимое директории src/stub в сорцах UPX.
Итак, если архитектура упаковываемого файла поддерживается UPX, то для него формируется загрузчик, сам файл сжимается, и в целом наш сжатый бинарь готов. Для возможности статической распаковки, которая выполняется командой upx -d , UPX добавляет в файл собственные заголовки.
Заголовки UPX
Добавляются четыре заголовка, три из которых можно увидеть в начале исполняемого файла:
- loader info ( l_info ) содержит контрольную сумму, магические сигнатуры «UPX!», размер и некоторые параметры загрузчика;
- packed program info ( p_info ). В этом заголовке находятся размеры неупакованного блока p_blocksize и неупакованной (исходной) программы p_filesize , которые, как правило, равны;
block info ( b_info ) предваряет каждый сжатый блок и содержит информацию о размерах до и после сжатия, алгоритме (методе), уровне сжатия блока и других параметрах. На рисунке ниже ты можешь видеть по смещению 0x110 сигнатуру ELF: это и есть начало упакованного файла.
packheader добавляется в конце файла, обычно занимая немного больше 0x24 байт в зависимости от выравнивания. Его выделяют две сигнатуры UPX! , вторая из которых выровнена по четырехбайтовой границе. В packheader записывается информация, необходимая самому UPX, чтобы статически распаковать бинарь, не прибегая к коду загрузчика. В нее входят, в частности, уже названные данные — размер распакованного файла и некоторые параметры сжатия. В результате этого получается некоторая избыточность. Как видим, обведенное значение совпадает с хранящимися в p_info размерами неупакованных блока и файла. Это может немного помочь нам в дальнейшем при рассмотрении способов защиты от статической распаковки.
Если тебе хочется лучше понять процесс статической распаковки UPX, то наравне с чтением сорцов ты можешь воспользоваться дебажным флагом. Тогда ты увидишь, что на основе имеющихся в бинаре заголовков упаковщик выбирает функцию, которой будет распаковывать файл. Здесь наблюдается то же ограничение, что и для stub loader: для каких форматов и аппаратных платформ они существуют, те и поддерживаются. Список весьма внушителен.
UPX перебирает все возможные функции упаковки перед тем, как сдаться
Распаковываем себя
Что же происходит, когда бинарь распаковывается не командой upx -d , а своим собственным кодом? В этом случае за происходящее отвечает загрузчик. Распаковывать он может либо сразу в память, либо с использованием временных файлов с последующим их запуском — это будет зависеть от конкретной реализации.
В первом случае, который нас интересует больше в рамках данной статьи, загрузчик при помощи хитрой магии выделения памяти и назначения выделенным областям памяти нужных прав подготавливает области для сегментов оригинального исполняемого файла — блоков кода, данных, кучи, стека и при необходимости динамических библиотек. В идеале все должно выглядеть так, чтобы запакованный файл и не понял, что был упакован, и работал целиком и полностью так же, как до распаковки.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее