UPX (the Ultimate Packer for eXecutables)
![]()
Программа для сжатия исполнимых EXE-файлов и DLL-библиотек
Яндекс.Браузер — быстрый браузер с защитой от мошенников и вредоносных сайтов.
- Windows 11
- Windows 10
- Windows 8.1
- Windows 8
- Windows 7
- Windows Vista
- Windows XP
Тип лицензии:
Freeware (бесплатное)
Языки: Английский
Снимки экрана 2
![]()
UPX (the Ultimate Packer for eXecutables) — программа для сжатия исполнимых файлов различных форматов, в т.ч. .EXE (исполнимые файлы ОС Windows), без потерь (исполнимый файл после сжатия остается работоспособным). Это бесплатная портативная утилита для операционных систем Windows XP, Vista, 7, 8, 8.1, 10 и 11 (только 64 бит). Программа не имеет графического пользовательского интерфейса, управление ею осуществляется из командной строки.
Зачем нужна программа UPX?
UPX (the Ultimate Packer for eXecutables) позиционируется разработчиками как продвинутый компрессор исполняемых файлов, способный уменьшать их размер на 50-70%, никак не сказываясь на их работоспособности. UPX поддерживает ряд различных форматов исполняемых файлов, куда, помимо Windows-программ (.EXE), также относятся приложения для macOS и исполняемые файлы для Linux. Кроме того, утилита позволяет сжимать динамические DLL-библиотеки.
Программы и библиотеки, сжатые в the Ultimate Packer for eXecutables, полностью автономны и работают точно так же, как и раньше, без потери производительности и увеличения потребления памяти для большинства поддерживаемых форматов.
К основным преимуществам компрессора UPX относятся:
- Высокая степень сжатия. UPX в большинстве случаев сжимает лучше, чем традиционные архиваторы.
- Поддержка различных алгоритмов сжатия. Существует возможность указать утилите поочередно перебирать все поддерживаемые алгоритмы до тех пор, пока не будет наиболее эффективный для конкретного случая.
- Высокая скорость распаковки. На любом достаточно современном компьютере компрессор UPX распаковывает файлы со скоростью более чем 500 МБ/с.
- Отсутствие перерасхода памяти для сжатых исполняемых файлов благодаря декомпрессии на месте.
- Возможность просмотра и тестирования исполняемых файлов до распаковки.
- UPX может упаковывать несколько исполняемых форматов, включая программы и DLL для Windows, приложения для macOS и исполняемые файлы для Linux. Кроме того, опытные пользователи могут добавлять новые исполняемые форматы или новые алгоритмы сжатия, расширяя функциональные возможности утилиты.
Важное примечание от разработчиков: UPX наследует контекст безопасности любых файлов, с которыми он работает. Это означает, что для упаковки, распаковки или даже тестирования или вывода файла от пользователя требуется соблюдение тех же мер безопасности, что и при фактическом запуске исполнимого файла.
Как пользоваться программой UPX?
Утилита the Ultimate Packer for eXecutables работает из командной строки Windows. Простейшая команда для сжатия исполнимых файлов или DLL-библиотек выглядит следующим образом:
upx program_name.exe или upx library_name.dll
Также пользователь может добавлять к команде upx ряд ключей/атрибутов. Например, для увеличения степени сжатия используются ключ —best, а для перебора алгоритмов компрессии с целью поиска наиболее эффективного — ключ —brute. Примеры:
upx —best program_name.exe
upx —brute library_name.dll
Пример сжатия DLL-библиотеки с использованием ключа —best показан на скриншотах. Первоначальный размер файла составлял 90479104 байт (~86, 2 Мб), после сжатия — 34341376 байт (~32,7 Мб). Эффективность сжатия составила 62,04% (файл был сжат до 37,96% от первоначального размера).
.UPX — Расширение файла
Файл upx — это архив, созданный Ultimate Packer для исполняемых файлов (UPX). upx-это бесплатная утилита с открытым исходным кодом, которую можно использовать для сжатия и запугивания исполняемых файлов. Файлы upx, как правило, меньше исходных исполняемых файлов, и их может быть сложнее для обратного инженера.
UPX работает, сжав исполняемый код и заменив его заглушкой, которая декомпрессирует код при запуске исполняемого файла. upx можно использовать для сжатия исполняемых файлов по разным причинам, например:
- Чтобы уменьшить размер файла и сделать его быстрее для загрузки и установки.
- Чтобы защитить интеллектуальную собственность в программном обеспечении, затрудняя реверс -инженер.
- Чтобы уклониться от обнаружения антивирусным программным обеспечением.
Файлы UPX могут быть открыты с помощью любого программного обеспечения, которое может открывать исполняемые файлы, например, проводник файлов или командная строка. Однако, если файл upx запутывается, его, возможно, потребуется декомпрессировать, прежде чем его можно будет открыть.
Существует ряд различных инструментов, которые можно использовать для декомпрессии файлов upx. Одним из популярных инструментов является upx Explorer.
Как открыть файл upx?
Чтобы открыть файл upx, вы можете использовать любое программное обеспечение, которое может открыть исполняемые файлы, такие как файловый обозреватель или командная строка. Однако, если файл upx запутывается, его, возможно, потребуется декомпрессировать, прежде чем его можно будет открыть.
Чтобы распаковать файл upx, вы можете использовать такой инструмент, как upx Explorer. upx Explorer-это бесплатный и инструмент с открытым исходным кодом, который можно использовать для сжатия и декомпрессии файлов upx.
Чтобы распаковать файл upx с upx Explorer, выполните следующие действия:
- Загрузите и установите upx Explorer.
- Откройте upx Explorer.
- Нажмите кнопку «Открыть» и выберите файл upx, который вы хотите распаковать.
- Нажмите кнопку «Декомпресс».
- UPX Explorer распаковывает файл upx и сохранит декомпрессированный файл в то же место, что и исходный файл.
После того, как файл upx будет декомпрессирован, вы можете открыть его с помощью любого программного обеспечения, которое может открывать исполняемые файлы.
Как создать файл upx?
Чтобы создать файл upx, вы можете использовать утилиту upx. upx-это бесплатная утилита с открытым исходным кодом, которую можно использовать для сжатия и запугивания исполняемых файлов.
Чтобы создать файл upx с UPX, выполните следующие действия:
- Загрузите и установите UPX.
- Откройте командную строку или окно терминала.
- Перейдите в каталог, где находится исполняемый файл upx.
- Запустите следующую команду:
- являются дополнительными аргументами, которые можно использовать для управления тем, как upx сжимает входной файл.
- Это исполняемый файл, который вы хотите сжать.
- Имя файла upx, который будет создан.
Например, для сжатия исполняемого файла my_program.exe и сохранить сжатый файл как my_program_upx.exe , вы выполните следующую команду:
upx my_program.exe my_program_upx.exe
После того, как файл upx был создан, вы можете распространять его для пользователей или развернуть его на производственных серверах.
Примечание: upx не может сжать все типы исполняемых файлов. Например, upx не может сжать исполняемые файлы, которые защищены другими методами защиты кода.
Преимущества использования UPX
Есть ряд преимуществ использования UPX, в том числе:
- Уменьшенный размер файла: upx может сжимать исполняемые файлы на 10-30%. Это может улучшить время загрузки и установки для программного обеспечения.
- Улучшенная безопасность: upx может использоваться для запугивания исполняемых файлов, что может затруднить их реверс -инженер. Это может помочь защитить интеллектуальную собственность в программном обеспечении и затруднить создание вредоносных программ, которые имитируют программное обеспечение.
- Снижение использования полосы пропускания: файлы upx можно использовать для уменьшения использования полосы пропускания, необходимого для загрузки и распространения программного обеспечения. Это особенно полезно для программного обеспечения, которое распространяется по Интернету.
Недостатки использования UPX
Есть также несколько недостатков использования UPX, в том числе:
- Снижение производительности: файлы upx иногда могут оказывать небольшое влияние на производительность программного обеспечения. Это связано с тем, что заглушка upx необходимо распаковать исполняемый код, прежде чем его можно будет запустить.
- Проблемы совместимости: файлы upx не всегда совместимы с более старым программным обеспечением или с программным обеспечением, которое использует конкретные методы защиты кода.
- Риски безопасности: файлы upx можно использовать для распространения вредоносных программ. Поэтому важно открыть только файлы upx из надежных источников.
Что обозначает расширение UPX?
Open Source разработал расширение файла UPX, также известное как Ultimate Packer For eXecutables File файл, для пакета программного обеспечения PeaZip. Анонимная статистика пользовательских данных позволяет сделать вывод о том, что файлы UPX наиболее популярны среди тех, кто проживает в China и использует устройства Windows 10. Было определено, что большинство из этих пользователей используют Google Chrome.
Связанные разработчики и программное обеспечение
![]() |
Ultimate Packer for eXecutables (UPX) от Open Source |
![]() |
PeaZip от Open Source |
![]() |
Ulead Photo Express от Ulead Systems |
Улучшение степени сжатия применяемого в UPX
Под «капотом» следует перевод небольшого, но крайне полезного текстового файла «%UPX_SOURCE%\doc\filter.txt». В приведенном пути под UPX_SOURCE подразумевается файловый путь до исходных кодов к UPX версии 3.91.
Документ описывает достаточно важный аспект работы UPX называемый «фильтрацией» и при анализе упакованных с помощью UPX файлов крайне важно понимать как это работает. Все что описано про UPX также применимо и к другим упаковщикам.
Основная цель перевода это попытка помочь тем программистам кто пишет статические распаковщики исполняемых файлов. Другими словами эта информация будет полезной практикующим reverse-engineer-ам. Под статичеческим распаковщиком понимаю программу которая поданный на вход упакованный или запротекченный исполняемый файл анализирует и создает на выходе файл, как будто бы тот создан каким-либо компилятором. Особенностью такого типа распаковщиков в том что он работает исключительно на знании структуры защиты или упаковки файла, т.е. без применения «сброса дампа», «востановления импорта» и др. типов «читерства».
Понимание процесса фильтрации помогает при изучении упакованных файлов к примеру с помощью UPX, RLPack и др. В упакованных файла можно встретить код, где делаются некоторые «магические действиями» с маш. инструкциями переходов байты 0xE8, 0xE9 и др. Этой «магией» как раз и является «фильтрация». Она направлена на улучшение степени сжатия исполняемого файла.
Также знание о том как работает фильтрация может сохранить время специалиста в весьма сложных ситуациях. Бывает так, что получить кусок кода с фильтрацией за разумный срок вовсе невозможно, к примеру при работе с полиморфиками или с файлами где применяется виртуализация кода. Тогда знание о том как работает фильтрации позволит решить задачу по написанию кода дефильтрации без имения точного оригинального куска кода.
Этот документ поясняет концепцию «фильтрация» в UPX. В основном фильтрация это предварительная обработка данных, которая может улучшить коэффициент сжатия файлов с помощью UPX.
В настоящее время фильтры UPX используют метод основаный на одном очень специфичном алгоритме. Он хорошо походит для исполняемых файлов архитектуры i386. В UPX он известен как «naive» реализация. Также существует способ «clever», который подходит только для 32-битных исполняемых файлов и впервые был реализован в UPX.
Давайте-ка возьмем примера и рассмотрим фрагмент кода(это место из 32-битного файла):
00025970: E877410600 calln FatalError 00025975: 8B414C mov eax,[ecx+4C] 00025978: 85C0 test eax,eax 0002597A: 7419 je file:00025995 0002597C: 85F6 test esi,esi 0002597E: 7504 jne file:00025984 00025980: 89C6 mov esi,eax 00025982: EB11 jmps file:00025995 00025984: 39C6 cmp esi,eax 00025986: 740D je file:00025995 00025988: 83C4F4 add (d) esp,F4 0002598B: 68A0A91608 push 0816A9A0 00025990: E857410600 calln FatalError 00025995: FF45F4 inc [ebp-0C]
В приведенном куске кода Вы могли заметить две инструкции CALL вызывающих «FatalError». Возможно Вы догадались, что степень сжатия будет лучше если «движок» компрессора найдет больше последовательностей повторяющихся строк. В нашем случае движок имеет следующие два байта последовательностей:
E877 410600 8B and E857 410600 FF.
Поэтому он может найти 3-байтовых совпадения.
Сейчас применим трюк. Для архитектуры i386, ближние вызовы(«near calls») кодируются как 0xE8, затем следует 32-битное относительное смещение адресу перехода. Теперь посмотрим что же случится, если значение позиции вызова добавить к значению смещения:
0x64177 + 0x25970 = 0x89AE7 0x64157 + 0x25990 = 0x89AE7 E8 E79A0800 8B E8 E79A0800 FF
Теперь «движок» компрессора находит 5-байтные совпадения. Это позволяет нам сэкономить 2 байта сжимаемых данных. Неплохо.
Это и есть основная идея метода «naive» реализации. Все что Вы должны сделать это использовать метод «filter» перед сжатием и «unfilter» после декомпрессии. Просто перейдите к памяти, найдя байты 0xE8 и обработайте следующие 4 байта как сказано выше.
Конечно, есть несколько возможностей где эта схема может быть улучшена. Во-первых, не только CALL-ы могут быть обработаны, но и near jmp-ы(0xE9 + 32-битное смещение) работает аналогично.
Второе улучшение может быть, если мы ограничим это фильтрование только для области занимаемой действительным кодом, нет смысла обрабатывать основные данные.
Еще одним улучшением будет, если поменять порядок байт 32-битного смещения. Почему? Вот другой CALL который следует в фрагменте выше:
000261FA: E8C9390600 calln ErrorF 0x639C9 + 0x261FA = 0x89BC3 E8 C39B 0800 сравним с E8 E79A 0800
Вы можете заметить, что эти две функции достаточно близки друг к другу, однако компрессор не в состоянии использовать эту информацию (2-байтные совпадения, как правило не используются), если подрядок байт смещений повернуть. В таком случае:
E8 0008 9AE7 E8 0008 9BC3
Таким образом, «движок» компрессора ищет и такие 3-байтные совпадения. Это хорошее улучшение, теперь в «движке» также используются совпадения близлежайших смещений.
Это хорошо, но что случится когда мы найдем ‘fake’ CALL? Другими словами такой 0xE8, который является частью другой инструкции? К примеру такой:
0002A3B1: C745 E8 00000000 mov [ebp-18],00000000
Тогда в таком случае эти замечательные 0x00 байты перезапишутся неcколько менее сжимаемыми данными. Это невыгодная «naive» реализация.
Давайте станем умнее и попытаемся обнаруживать и обрабатывать только «действительные» CALL-ы. В UPX используется простой метод для поиска этих CALL-ов. Мы просто проверяем адресацию(destination) этих CALL-ов внутри некоторой области как и сами CALL-ы(поэтому указанный код выше ложное срабатыване, но это в целом помогает). Лучшим методом будет это дизассемблирование кода, будем рады помощи 🙂
Но это только часть работы. Мы не можем просто обрабатать один CALL, затем поскипать другой, процесс дефильтрации нуждается в некоторой информации, чтобы иметь возможность откатить фильтрацию.
UPX использует следующую идею, которая работает хорошо. Сначала мы предполагаем, что размер области, который будет фильтроваться менее чем 16 МБ. Затем UPX сканирует эту область и сохраняет байты, которые следуют за 0xE8 байтами. Если нам везет, то найдутся байты, которые не следуют за следующим 0xE8. Эти байты наши кандидаты для использования в качестве маркеров.
Помните что мы предполагали размер области сканирования менее чем 16 МБ? Хорошо, это означает что мы обрабатываем реальный CALL, в результате будет смещение тоже меньше чем 0x00FFFFFF. Поэтому MSB всегда 0x00. Какое прекрассное место для хранения нашего маркера. Конечно мы реверснем порядок байт в получаемом смещении, так что этот маркер будет появляться только после 0xE8 байта и не в 4-х байтах после него.
Вот и все! Просто работайте с областью памяти, идентифицируя «реальные» CALL-ы и используйте этот метод для их пометки. После этого задача дефильтрации весьма упрощается, просто ищутся 0xE8 + последовательность маркера и дефильтрует, если нашел его. Это умно, не так ли? 🙂
Говоря по правде это не так просто в UPX. Может использоваться дополнительный параметр(«add_value»), что делает вещи немного более сложными(к примеру, может быть найден маркер непригодный к использованию, потому что некоторого переполнения во время сложения).
И алгоритм в целом оптимизирован для простоты дефильтрации(коротко и быстро ассемблируемо насколько это возможно, смотри stub/macros.ash), который делает процесс фильтрации менее сложной(fcto_ml.ch, fcto_ml2.ch, filteri.cpp).
Как это может быть видно в filteri.cpp, есть множество вариантов этих фильтрующих реализаций: — native/clever, calls/jumps/calls&jumps, с поворотом смещения/или без — в сумме где-то 18 различных фильтров(и 9 других вариантов для 16-битных программ).
Можете выбрать один из них используя параметр командной строки «—filter=» или испытать большинство из них «—all-filters». Или просто дать UPX использовать один заданных нами по умолчанию для исполнимых форматов.
От переводчика:
С удовольствием рассмотрю баг-репорты об ошибках у себя в списке личных сообщений:
* Связанные с переводом, орфографией или грамматикой;
* Технического характера допущенные при переводе, убедитесь что в оригинале все верно!
- reverse engineering
- upx
- algorithms
- алгоритмы сжатия
- алгоритмы
- Программирование
- Системное программирование
- Алгоритмы


