Есть ли недостатки использования UPX для сжатия исполняемого файла Windows?

Раньше я использовал UPX, чтобы уменьшить размер исполняемых файлов Windows, но должен признать, что я наивен любые возможные отрицательные побочные эффекты. Каковы недостатки всей этой упаковки / распаковки?

Существуют ли сценарии, в которых кто-то порекомендовал бы НЕ UPX-загружать исполняемый файл (например, при написании DLL, службы Windows или при ориентации на Vista или Win7)? Я пишу большую часть своего кода на Delphi, но я также использовал UPX для сжатия исполняемых файлов C / C ++.

Кстати, я не запускаю UPX, пытаясь защитить свой исполняемый файл от дизассемблеров, только чтобы уменьшить размер исполняемого файла и предотвратить поверхностное вмешательство.


person Mick    schedule 09.12.2008    source источник
comment
+1 причина не использовать UPX: некоторые антивирусы идентифицируют Delphi + UPX как потенциальный вирус. Предпочтительно использовать наш LVCL, который составляет 30 КБ exe с Delphi без сжатия (вместо 300/800 КБ exe с обычным VCL). Достаточно, например, для программы установки, которая распаковывает его содержимое. См. synopse.info/forum/viewtopic.php?id=30. Вы можете взгляните также на KOL, которые сложнее в использовании, но при этом более мощные.   -  person Arnaud Bouchez    schedule 22.11.2010


Ответы (13)


Причина в том, что у использования EXE-компрессоров есть свои недостатки. В первую очередь:

При запуске сжатого EXE / DLL весь код распаковывается из образа диска в память за один проход, что может вызвать перегрузку диска, если системе не хватает памяти и она вынуждена обращаться к файлу подкачки. Напротив, с несжатыми EXE / DLL, ОС выделяет память для кодовых страниц по запросу (то есть, когда они выполняются).

Несколько экземпляров сжатого EXE / DLL создают несколько экземпляров кода в памяти. Если у вас есть сжатый EXE-файл, содержащий 1 МБ кода (до сжатия), и пользователь запускает 5 его экземпляров, примерно 4 МБ памяти теряется. Аналогичным образом, если у вас есть библиотека DLL размером 1 МБ, которая используется 5 работающими приложениями, примерно 4 МБ памяти тратятся впустую. В несжатых EXE / DLL код сохраняется в памяти только один раз и распределяется между экземплярами.

http://www.jrsoftware.org/striprlc.php#execomp

person Lars Truijens    schedule 09.12.2008
comment
Не все программное обеспечение находится в ситуации, когда совместное использование страниц виртуальной машины между несколькими экземплярами является проблемой, а некоторые компрессоры позволяют пропускать общие разделы. Например, PECompact пропускает их по умолчанию. Кроме того, что касается «загружается вся память», это правда, но эта память будет выгружена обратно, если она не используется и понадобится где-то еще. В некоторых ситуациях это создает более быструю загрузку, потому что накладные расходы носителя данных (обычно HDD) ниже, и все загружается «сразу» и «уже есть». Так что исключения бывают, и каждому свое. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я являюсь автором PECompact. - person dyasta; 26.11.2010
comment
Джереми: Общие разделы - это не столько проблема, сколько сами разделы кода. Код обычно представляет собой чтение-выполнение с отображением памяти, что означает, что если вы запустите 10 программ, все они будут использовать одинаковые, идентичные страницы физической памяти, а физические данные загружаются с диска только один раз. ОС также может отбрасывать страницы, содержащие код, который никогда не вызывался, если у него мало памяти, зная, что всегда можно легко перезагрузить их из образа. Ничего из этого не происходит с кодом, полученным от упаковщика exe, соответствующие страницы должны поддерживаться файлом подкачки. - person Damon; 02.03.2011
comment
Я согласен с вами, Деймон, поэтому возникает вопрос - имеет ли ваше приложение тенденцию к запуску нескольких экземпляров? Это одно из предостережений, о которых я давно предупреждал. Конечно, участки кода в любом случае обычно довольно маленькие - посмотрите на размеры, о которых мы говорим, по сравнению с сегодняшними системами. Я бы сказал, что НАМНОГО больше памяти динамически распределяется в БОЛЬШИНСТВЕ приложений. - person dyasta; 15.03.2012
comment
Я также ожидаю, что это немного замедлит время запуска - что может быть незаметно для одного запуска, но если у вас есть исполняемый файл, который запускается повторно (например, grep), это может иметь довольно заметную разницу, правильно? - person user541686; 25.05.2018
comment
Означает ли это, что upx original.exe -o compressed.exe сжатый, а затем распакованный upx -d compressed.exe -o original-decompressed.exe исполняемый файл будет вести себя нормально, как exe-файл, где ОС разделяет код между экземплярами и не перегружает диск? - person Phani Rithvij; 10.12.2020

Я удивлен, что об этом еще не упоминалось, но использование исполняемых файлов, упакованных UPX, также увеличивает риск получения ложных срабатываний от эвристического антивирусного программного обеспечения, потому что статистически многие вредоносные программы также используют UPX.

person Oliver Giesen    schedule 10.12.2008
comment
UPX не предназначен для защиты. Просто собираю вещи. - person John Smith; 07.05.2009
comment
Извините, я немного невнятно это сказал. Изменил формулировку сейчас. - person Oliver Giesen; 08.05.2009
comment
Полностью согласен. В Free Pascal мы получаем несколько таких отчетов (о том, что тот или иной двоичный файл в дистрибутиве запускает какой-то вирус) в год. После этого мы перестали регулярно обновлять апкс. - person Marco van de Voort; 30.05.2009
comment
@JohnSmith Вы правы ... но, к вашему сведению, вы можете (довольно легко) сместить точку входа файла, сжатого UPX, поэтому стандартный метод распаковки UPX не сможет распаковать его, что по сути делает его защищенным (ищите UPX Scrambler, который делает это автоматически) - person ; 21.10.2015

Есть три недостатка:

  1. Весь код будет полностью распакован в виртуальной памяти, тогда как в обычном EXE или DLL в память загружается только фактически используемый код. Это особенно актуально, если при каждом запуске используется только небольшая часть кода в вашем EXE / DLL.
  2. Если запущено несколько экземпляров вашей библиотеки DLL и EXE, их код не может быть разделен между экземплярами, поэтому вы будете использовать больше памяти.
  3. Если ваш EXE / DLL уже находится в кеше или на очень быстром носителе, или если процессор, на котором вы работаете, медленный, вы испытаете снижение скорости запуска, так как декомпрессия все равно будет выполняться, и вы не будете выгода от уменьшенного размера. Это особенно верно для EXE, который будет вызываться несколько раз повторно.

Таким образом, указанные выше недостатки представляют собой большую проблему, если ваши EXE или библиотеки DLL содержат много ресурсов, но в противном случае они могут не иметь большого значения на практике, учитывая относительный размер исполняемых файлов и доступной памяти, если вы не говорите о библиотеках DLL. используется многими исполняемыми файлами (например, системными DLL).

Чтобы рассеять некорректную информацию в других ответах:

  • UPX не повлияет на вашу способность работать на машинах, защищенных DEP.
  • UPX не повлияет на работу основных антивирусных программ, поскольку они поддерживают исполняемые файлы, сжатые UPX (а также другие форматы сжатия исполняемых файлов).
  • UPX может использовать сжатие LZMA в течение некоторого времени (алгоритм сжатия 7zip), используйте переключатель --lzma.
person user45336    schedule 11.12.2008

Единственное, что имеет значение размер - это время загрузки из Интернета. Если вы используете UPX, производительность будет ниже, чем при использовании 7-zip (на основе мой тестовый 7-Zip вдвое лучше UPX). Затем, когда он фактически остается сжатым на целевом компьютере, ваша производительность снижается (см. Ответ Ларса). Так что UPX - не лучшее решение для размера файла. Просто заархивируйте все это с помощью 7zip.

Что касается предотвращения взлома, это тоже ОТКАЗ. UPX также поддерживает распаковку. Если кто-то захочет изменить EXE, он увидит, что он сжат с помощью UPX, а затем распакует его. Процент возможных взломщиков, которые вы можете замедлить, не оправдывает потери усилий и производительности.

Лучшим решением было бы использовать двоичную подпись или хотя бы просто хеш. Простая система проверки хэша состоит в том, чтобы взять хеш вашего двоичного файла и секретное значение (обычно это guid). Только ваш EXE знает секретное значение, поэтому, когда он пересчитывает хэш для проверки, он может использовать его снова. Это не идеально (секретное значение можно получить). Идеальным вариантом было бы использование сертификата и подписи.

person Jim McKeeth    schedule 09.12.2008
comment
Размер имеет значение на USB-накопителе. Портативные приложения - это тот случай, когда это имело бы смысл. - person niXar; 11.12.2008
comment
Учитывая текущие цены на многогигабайтные флешки, я не уверен, что и здесь размер имеет значение. Если, конечно, вы не храните HD-видео. - person RBerteig; 26.04.2009
comment
Алгоритм сжатия UPX как минимум равен LZMA для сжатия отдельного исполняемого файла. Только 7-zip лучше, если у вас есть несколько exe / dll, которые нужно сжать одновременно: в этом случае 7-zip сжимает все эти файлы за один раз, поэтому имеет некоторое соотношение. - person Arnaud Bouchez; 22.11.2010
comment
Размер также имеет значение при использовании файлов НЕ на локальном жестком диске. Как на сетевом ресурсе, так и на внешнем жестком диске. - person Pieter B; 19.01.2016
comment
Размер имеет значение и в контейнерах Docker. - person MikeSchinkel; 05.01.2018

Окончательный размер исполняемого файла на диске в наши дни практически не имеет значения. Ваша программа может загружаться на несколько миллисекунд быстрее, но как только она начнет работать, разница будет неразличима.

Некоторые люди могут с большим подозрением относиться к вашему исполняемому файлу только потому, что он сжат с помощью UPX. В зависимости от ваших конечных пользователей это может быть или не быть важным соображением.

person Greg Hewgill    schedule 09.12.2008
comment
+1 Я всегда с подозрением отношусь к упакованным исполняемым файлам / DLL, особенно если я не могу их распаковать. - person Hugh Allen; 12.04.2010
comment
Размер имеет значение в контейнерах Docker. - person MikeSchinkel; 05.01.2018
comment
Размер имеет значение, если вы читаете из медленной флэш-памяти, что может иметь место во встроенной системе. - person Aaron Wright; 17.02.2021

В последний раз, когда я пытался использовать его в управляемой сборке, он настолько сильно изменил его, что среда выполнения отказалась загружать его. Это единственный раз, когда я могу подумать, что вы не захотите его использовать (и на самом деле, я так давно не пробовал, что теперь ситуация может быть даже лучше). В прошлом я широко использовал его для всех типов неуправляемых двоичных файлов, и у меня никогда не было проблем.

person TheSmurf    schedule 09.12.2008

Если вас интересует только уменьшение размера исполняемых файлов, то пробовали ли вы сравнить размер исполняемого файла с пакетами времени выполнения и без них? Конечно, вам нужно будет также указать размеры пакетов в целом вместе с вашим исполняемым файлом, но если у вас есть несколько исполняемых файлов, которые используют одни и те же базовые пакеты, тогда ваша экономия будет довольно высокой.

Еще одна вещь, на которую стоит обратить внимание, - это графика / глифы, которые вы используете в своей программе. Вы можете сэкономить довольно много места, объединив их в один Timagelist, включенный в модуль глобальных данных, вместо того, чтобы повторять их в каждой форме. Я считаю, что каждое изображение хранится в ресурсе формы как шестнадцатеричное, так что это будет означать, что каждый байт занимает два байта ... вы можете немного уменьшить его, загрузив изображение из ресурса RCData с помощью TResourceStream.

person skamradt    schedule 09.12.2008

Недостатков нет.

Но, к вашему сведению, существует очень распространенное заблуждение относительно UPX как ...

ресурсы НЕ просто сжимаются

По сути, вы создаете новый исполняемый файл, который выполняет функцию загрузчика, а реальный исполняемый файл, ну, разделяется и сжимается, помещается как ресурс двоичных данных исполняемого файла загрузчика (независимо от того, какие типы ресурсов были в исходном исполняемом файле) .

Использование методов обратного проектирования и инструментов в образовательных целях или других позволит показать вам информацию об исполняемом файле загрузчика, а не переменную информацию об исходном исполняемом файле.

исполняемый файл, распакованный UPX

исполняемый файл, сжатый UPX

person Community    schedule 21.10.2015
comment
Минусов нет. - это просто неверное утверждение. - person kobik; 22.10.2015
comment
@kobik хотя никаких недостатков *, вероятно, не следует заменить на отсутствие практических недостатков *, что по сути (для практического разработчика в современной архитектуре) означает то же самое, я решил, что он не требует редактирования, в пользу более четкого и реалистичного ответа. Смирись с этим :) - person ; 25.10.2015
comment
Как автор одного из классических конкурентов UPX, PECompact, я могу сказать, что здесь определенно есть практические недостатки. Два называют три: ложные срабатывания, потенциальные проблемы совместимости в будущем и неспособность ОС загружать определенные страницы с диска по запросу (применимо только к действительно большим модулям). - person dyasta; 22.06.2016
comment
Ваше объяснение того, как работает сжатие, тоже немного неверно ... Собственное сжатие PE фактически выполняет декомпрессию «на месте». Итак, это не похоже на то, что вы описали, где он просто распаковывает весь исходный EXE из сжатого ресурса, а затем запускает его. Вместо этого ОС фактически запускает сжатый модуль. Загрузчик распаковывает виртуальные страницы на месте. Теперь есть плохие / хромые компрессоры, которые действуют так, как вы описали, и компрессоры сборки .NET будут такими, но обычно это не так. Прошу прощения за критику, я просто хочу обеспечить точность. - person dyasta; 22.06.2016

ИМХО в обычном режиме UPXing бессмысленен, но причины изложены выше, в основном, память дороже диска.

Эрик: заглушка LZMA могла бы быть больше. Даже если алгоритм лучше, это не всегда будет чистым плюсом.

person Community    schedule 25.04.2009
comment
Кажется, что память и дисковое пространство в любом случае не сильно влияют на современное оборудование, что делает UPX просто дополнительным осложнением. По моему опыту, я экономлю всего около 500 КБ из приложения с 3 МБ, особенно на Mac, где файлы dylib не поддерживаются. - person Beejor; 08.02.2016

Сканеры вирусов, которые ищут «неизвестные» вирусы, могут помечать сжатые исполняемые файлы UPX как содержащие вирус. Мне сказали, что это связано с тем, что некоторые вирусы используют UPX, чтобы скрыться. Я использовал UPX для программного обеспечения, и McAfee отметит файл как содержащий вирус.

person Community    schedule 02.05.2009
comment
Макафи? Это самое ужасное антивирусное программное обеспечение, которое я когда-либо использовал. Держись подальше! - person ya23; 02.05.2009
comment
Фактически, держитесь подальше от любого антивирусного сканера, который достаточно глуп, чтобы пометить каждый сжатый файл upx как вирус. - person Wouter van Nifterick; 02.05.2009

Причина, по которой UPX имеет так много ложных срабатываний, заключается в том, что его открытое лицензирование позволяет авторам вредоносных программ безнаказанно использовать и изменять его. Конечно, эта проблема присуща отрасли, но, к сожалению, великий проект UPX страдает от этой проблемы.

ОБНОВЛЕНИЕ: обратите внимание, что по мере завершения проекта Taggant возможность использования UPX (или чего-либо еще) без ложных срабатываний будет улучшена, если UPX поддерживает его.

person dyasta    schedule 26.09.2010

Я считаю, что есть вероятность, что он может не работать на компьютерах с DEP (предотвращение выполнения данных ) включенный.

person Slapout    schedule 09.12.2008
comment
Как автор коммерческого компрессора PE (PECompact), я могу сказать, что каждый пакер должен полностью поддерживать DEP, включая UPX. Я не могу сказать наверняка, что это так, но, безусловно, это так - это проблема, которая возникла много лет назад. - person dyasta; 26.11.2010
comment
Не могли бы вы подробно рассказать, как это достигается? (источник / литература) - person kn000x; 02.11.2016
comment
@ kn0x DEP предотвращает выполнение только памяти, которая не помечена как исполняемая, для которой VirtualProtect(Ex) используется для переключения страниц памяти между записываемыми и исполняемыми. - person Suchiman; 19.03.2019
comment
Это возврат :) Thx @Suchiman, мой вопрос изначально касался внутреннего устройства upx, а не DEP. - person kn000x; 19.03.2019

Когда Windows загружает двоичный файл, первое, что она делает, это разрешение таблицы импорта / экспорта. То есть, какие бы API и DLL не были указаны в таблице импорта, они сначала загрузят DLL в случайно сгенерированный базовый адрес. И используя базовый адрес плюс смещение в функции DLL, эта информация будет обновлена ​​в таблице импорта.

EXE не имеет таблицы экспорта.

Все это произошло еще до перехода к исходной точке входа для выполнения.

Затем после того, как он начнет выполнение с точки входа, EXE выполнит небольшой фрагмент кода перед запуском алгоритма распаковки. Этот небольшой фрагмент кода также означает, что необходимый Windows API будет очень маленьким, что приведет к небольшой таблице импорта.

Но после распаковки двоичного файла, если он начал использовать какой-либо Windows API, не разрешенный ранее, скорее всего, он выйдет из строя. Поэтому важно, чтобы процедура декомпрессии разрешала и обновляла таблицу импорта для всех упомянутых API окон внутри распакованных кодов перед выполнением распакованных кодов.

Использованная литература:

введите описание изображения здесь

https://malwaretips.com/threads/malware-analysis-2-pe-imports-static-analysis.62135/

person Peter Teoh    schedule 22.04.2020