| UPX(1) | UPX(1) |
نام (NAME)
upx - فشردهسازی یا باز کردن فایلهای اجرایی
خلاصه دستور (SYNOPSIS)
upx [ command ] [ options ] filename...
چکیده (ABSTRACT)
The Ultimate Packer for eXecutables
Copyright (c) 1996-2026 Markus Oberhumer, Laszlo Molnar & John Reiser
https://upx.github.io
UPX یک فشردهساز فایلهای اجرایی پرسرعت، قابلحمل و توسعهپذیر برای چندین قالب اجرایی مختلف است. این ابزار به نسبت فشردهسازی فوقالعادهای دست مییابد و بازگشایی (decompression) *بسیار* سریعی را ارائه میدهد. به دلیل بازگشایی درجا، برای اکثر قالبهای پشتیبانیشده فایلهای اجرایی شما دچار سربار حافظه یا معایب دیگر نخواهند شد..SH "سلب مسئولیت (DISCLAIMER)" UPX مطلقاً بدون هیچگونه ضمانتی ارائه میشود؛ برای جزئیات فایل COPYING را ببینید.
لطفاً تمام مشکلات یا پیشنهادات را به نویسندگان گزارش دهید. با تشکر.
زمینه امنیتی (SECURITY CONTEXT)
نکته مهم: UPX زمینه امنیتی هر فایلی را که پردازش میکند به ارث میبرد.
این بدان معناست که فشردهسازی، بازگشایی، یا حتی آزمایش و فهرست کردن یک فایل نیازمند همان ملاحظات امنیتی است که در هنگام اجرای واقعی فایل وجود دارد.
از UPX فقط روی فایلهای قابل اعتماد استفاده کنید!
توضیحات (DESCRIPTION)
UPX یک فشردهساز چندمنظوره برای فایلهای اجرایی با ویژگیهای زیر است:
- امن: از آنجا که UPX سالهاست متنباز و با مستندات کامل است، هر نرمافزار
امنیتی/ضدویروس مرتبطی قادر است درون برنامههای فشردهشده با UPX را بررسی
و آنها را اعتبارسنجی کند
- نسبت فشردهسازی عالی: معمولاً بهتر از Zip فشرده میکند،
از UPX برای کاهش اندازه توزیع خود استفاده کنید!
- بازگشایی بسیار سریع: بیش از ۵۰۰ مگابایت بر ثانیه روی هر سامانه
نسبتاً مدرن
- بدون بار اضافه روی حافظه برای فایلهای اجرایی فشرده در اکثر قالبهای
پشتیبانیشده بهدلیل بازگشایی درجا (in-place decompression)
- ایمن: میتوانید فایلهای اجرایی خود را فهرست، آزمایش و باز کنید.
همچنین، چِکسام هر دو فایل فشرده و فشردهنشده بهصورت داخلی
نگهداری میشود.
- همهمنظوره: UPX میتواند تعداد زیادی از قالبهای اجرایی، از جمله
برنامهها و DLLهای Windows، برنامههای macOS و فایلهای اجرایی Linux را فشرده کند
- قابلحمل: UPX به زبان C++ قابلحمل و مستقل از ترتیب بایتها (endian-neutral) نوشته شده است
- توسعهپذیر: بهدلیل ساختار کلاسها، پشتیبانی از قالبهای اجرایی جدید
یا افزودن الگوریتمهای فشردهسازی تازه بسیار آسان است
- آزاد: UPX همراه با سورسکد کامل تحت مجوز عمومی همگانی گنو
(GNU General Public License v2+) منتشر میشود، با استثنائات ویژهای که
اجازه استفاده رایگان برای برنامههای تجاری را میدهد
احتمالاً اکنون متوجه شدهاید که چرا ما UPX را فشردهساز اجرایی «نهایی» مینامیم.
دستورها (COMMANDS)
فشردهسازی (Compress)
این عملیات پیشفرض است؛ برای مثال، upx yourfile.exe فایلی را که در خط فرمان مشخص شده است فشرده خواهد کرد.
بازگشایی (Decompress)
تمام قالبهای فایل پشتیبانیشده در UPX را میتوان با استفاده از سوییچ -d از حالت فشرده خارج کرد؛ برای مثال، upx -d yourfile.exe فایلی را که بهتازگی فشرده کردهاید بازگشایی میکند.
آزمایش (Test)
دستور -t یکپارچگی دادههای فشرده و بازشده را آزمایش میکند؛ برای مثال، upx -t yourfile.exe بررسی میکند که آیا فایل شما میتواند بهصورت ایمن بازگشایی شود یا خیر. توجه داشته باشید که این دستور کل فایل را بررسی نمیکند، بلکه تنها بخشی را بررسی میکند که در طول اجرای برنامه بازگشایی خواهد شد. این بدان معناست که نباید از این دستور بهجای یک ضدویروس استفاده کنید.
فهرست کردن (List)
دستور -l اطلاعاتی درباره فایلهای فشردهشده مشخصشده در خط فرمان بهعنوان پارامتر چاپ میکند؛ برای مثال upx -l yourfile.exe اندازه فشرده / بازشده و نسبت فشردهسازی yourfile.exe را نمایش میدهد.
گزینهها (OPTIONS)
-q: حالت بیصدا، فرونشاندن هشدارها
-q -q (یا -qq): حالت بسیار بیصدا، فرونشاندن خطاها
-q -q -q (یا -qqq): هیچ خروجی تولید نکند
--help: راهنما را چاپ میکند
--version: نسخه UPX را چاپ میکند
--exact: هنگام فشردهسازی، الزام میکند که پس از بازگشایی با گزینه -d فایلی دقیقاً همسان از نظر بایت حاصل شود. [نکته: این ویژگی در حال توسعه است و هنوز برای همه قالبها پشتیبانی نمیشود. اگر این موضوع برای شما اهمیت دارد، بهعنوان یک راهکار موقت میتوانید یک بار برنامه خود را فشرده و سپس بازگشایی کنید - از آن پس هر مرحله فشردهسازی-بازگشایی بعدی در مقایسه با نخستین نسخه بازگشاییشده، باید نتایجی دقیقاً یکسان از نظر بایت به بار آورد.]
-k: نگهداری فایلهای پشتیبان
-o file: نوشتن خروجی در file
[ ...مستندات بیشتری باید نوشته شود... - فعلاً `upx --help' را اجرا کنید ].SH "سطوح فشردهسازی و تنظیم دقیق (COMPRESSION LEVELS & TUNING)" UPX ده سطح فشردهسازی مختلف از -1 تا -9 و همچنین --best را ارائه میدهد. سطح فشردهسازی پیشفرض برای فایلهای کوچکتر از 512 KiB برابر -8 و در غیر این صورت -7 است.
- سطوح فشردهسازی ۱، ۲ و ۳ بسیار سریع هستند.
- سطوح فشردهسازی ۴، ۵ و ۶ کارایی زمانی/نسبتی مناسبی ارائه میدهند.
- سطوح فشردهسازی ۷، ۸ و ۹ نسبت فشردهسازی را به سرعت ترجیح میدهند.
- سطح فشردهسازی --best ممکن است زمان زیادی ببرد.
توجه داشته باشید که سطح فشردهسازی --best میتواند برای فایلهای بزرگ تا حدی کُند باشد، اما هنگام انتشار نسخه نهایی برنامه خود حتماً باید از آن استفاده کنید.
راهنمای سریع برای دستیابی به بهترین نسبت فشردهسازی:
- دستور upx --brute --no-lzma myfile.exe یا حتی upx --ultra-brute --no-lzma myfile.exe را امتحان کنید.
- گزینه --lzma
فشردهسازی
LZMA را فعال
میکند که
بهتر فشرده
میکند اما
بازگشایی
آن *بهطور
چشمگیری
کُندتر*
است.
احتمالاً
مایل
نیستید از
آن برای
فایلهای
بزرگ
استفاده
کنید.
(توجه داشته باشید که --lzma بهطور خودکار توسط --all-methods و --brute فعال میشود؛ برای لغو آن از --no-lzma استفاده کنید.)
- امتحان کنید که آیا --overlay=strip کار میکند یا خیر.
- برای برنامههای win32/pe گزینه --strip-relocs=0 وجود دارد. یادداشتهای زیر را ببینید.
گزینههای مدیریت اورلی (OVERLAY HANDLING OPTIONS)
اطلاعات: منظور از «اورلی» (overlay) دادههای کمکی متصلشده پس از انتهای منطقی یک فایل اجرایی است و اغلب شامل دادههای اختصاصی برنامه میشود (این یک روال معمول برای جلوگیری از ایجاد یک فایل داده اضافی است، اگرچه استفاده از بخشهای منبع بهتر خواهد بود).
UPX با اورلیها مانند بسیاری دیگر از فشردهسازهای فایلهای اجرایی رفتار میکند: صرفاً اورلی را پس از تصویر فشردهشده کپی میکند. این کار روی برخی فایلها پاسخگو است، اما روی برخی دیگر عمل نمیکند، که بستگی به این دارد که برنامه در عمل چگونه به این دادههای الحاقی دسترسی پیدا میکند.
--overlay=copy کپی کردن هرگونه داده اضافی پیوستشده به فایل. [پیشفرض]
--overlay=strip حذف هرگونه اورلی از برنامه به جای کپی کردن آن.
هشدار: این کار ممکن است موجب از کار افتادن برنامه
فشردهشده یا بلااستفاده شدن آن گردد.
--overlay=skip عدم فشردهسازی هر برنامهای که دارای اورلی است.
متغیر محیطی (ENVIRONMENT VARIABLE)
متغیر محیطی UPX میتواند شامل مجموعهای از گزینههای پیشفرض برای UPX باشد. این گزینهها ابتدا بررسی میشوند و میتوان با آرگومانهای صریح خط فرمان آنها را بازنویسی کرد. برای مثال:
برای DOS/Windows: set UPX=-9 --compress-icons#0 برای sh/ksh/zsh: UPX="-9 --compress-icons=0"; export UPX برای csh/tcsh: setenv UPX "-9 --compress-icons=0"
در DOS/Windows به دلیل محدودیتهای COMMAND.COM، هنگام مقداردهی متغیر محیطی باید به جای '=' از '#' استفاده کنید.
همه گزینهها در متغیر محیطی مجاز نیستند - در این صورت UPX به شما اطلاع خواهد داد.
میتوانید صراحتاً از گزینه --no-env برای نادیده گرفتن متغیر محیطی استفاده کنید.
نکاتی برای قالبهای اجرایی پشتیبانیشده (NOTES FOR THE SUPPORTED EXECUTABLE FORMATS)
نکاتی درباره ATARI/TOS (NOTES FOR ATARI/TOS)
این قالب اجرایی مورد استفاده در Atari ST/TT است؛ یک رایانه شخصی بر پایه Motorola 68000 که در اواخر دهه ۱۹۸۰ محبوب بود. پشتیبانی از این قالب صرفاً به خاطر حس نوستالژی یکی از نویسندگان است و هیچ هدف کاربردی ندارد :-). برای اطلاعات بیشتر https://freemint.github.io را ببینید.
برنامههای بستهبندیشده پس از خارج شدن از حالت فشرده، بایت به بایت با نسخه اصلی یکسان خواهند بود. با این حال تمام اطلاعات اشکالزدایی (debug) حذف خواهند شد.
گزینههای اضافی موجود برای این قالب اجرایی:
--all-methods فشردهسازی چندباره برنامه با استفاده از تمام
روشهای فشردهسازی موجود. این کار ممکن است در برخی
موارد نسبت فشردهسازی را بهبود بخشد، اما معمولاً
روش پیشفرض در هر صورت بهترین نتایج را ارائه میدهد.
همانند vmlinuz/i386.
نکات مربوط به DOS/COM (NOTES FOR DOS/COM)
بدیهی است که UPX با فایلهای اجرایی که میخواهند دادهها را از خودشان بخوانند (مانند برخی ابزارهای خط فرمان که به همراه Win95/98/ME ارائه میشوند) کار نخواهد کرد.
برنامههای فشردهشده فقط روی +286 کار میکنند.
برنامههای بستهبندیشده پس از خارج شدن از حالت فشرده، بایتبهبایت با نسخه اصلی یکسان خواهند بود.
حداکثر اندازه فشردهنشده: ~65100 بایت.
گزینههای اضافی موجود برای این قالب اجرایی:
--8086 ساخت یک فایل اجرایی که روی هر پردازنده 8086 کار میکند.
--all-methods فشردهسازی چندباره برنامه با استفاده از همه روشهای
فشردهسازی موجود. این گزینه ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً روش پیشفرض در هر صورت
بهترین نتایج را میدهد.
--all-filters فشردهسازی چندباره برنامه با استفاده از همه فیلترهای
پیشپردازش موجود. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً فیلتر پیشفرض در هر
صورت بهترین نتایج را میدهد.
نکات مربوط به DOS/EXE (NOTES FOR DOS/EXE)
عبارت dos/exe نشاندهنده تمام فایلهای اجرایی «عادی» ۱۶-بیتی DOS است.
بدیهی است که UPX با فایلهای اجرایی که میخواهند دادهها را از خودشان بخوانند (مانند برخی ابزارهای خط فرمان که به همراه Win95/98/ME ارائه میشوند) کار نخواهد کرد.
برنامههای فشردهشده فقط روی +286 کار میکنند.
گزینههای اضافی موجود برای این قالب اجرایی:
--8086 ساخت یک فایل اجرایی که روی هر پردازنده 8086 کار میکند.
--no-reloc عدم استفاده از رکوردهای بازنشانی (relocation) در سرایند exe.
--all-methods فشردهسازی چندباره برنامه با استفاده از همه روشهای
فشردهسازی موجود. این گزینه ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً روش پیشفرض در هر صورت
بهترین نتایج را میدهد.
نکات مربوط به DOS/SYS (NOTES FOR DOS/SYS)
برنامههای فشردهشده فقط روی +286 کار میکنند.
برنامههای بستهبندیشده پس از خارج شدن از حالت فشرده، بایتبهبایت با نسخه اصلی یکسان خواهند بود.
حداکثر اندازه فشردهنشده: ~65350 بایت.
گزینههای اضافی موجود برای این قالب اجرایی:
--8086 ساخت یک فایل اجرایی که روی هر پردازنده 8086 کار میکند.
--all-methods فشردهسازی چندباره برنامه با استفاده از همه روشهای
فشردهسازی موجود. این گزینه ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً روش پیشفرض در هر صورت
بهترین نتایج را میدهد.
--all-filters فشردهسازی چندباره برنامه با استفاده از همه فیلترهای
پیشپردازش موجود. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً فیلتر پیشفرض در هر
صورت بهترین نتایج را میدهد.
نکات مربوط به DJGPP2/COFF (NOTES FOR DJGPP2/COFF)
پیش از هر چیز، توصیه میشود که *بهجای* strip از UPX استفاده کنید. دستور strip عادت بسیار بدی در جایگزین کردن استاب (stub) شما با نسخه خود (منسوخ) دارد. علاوه بر این، UPX یک باگ/ویژگی در strip v2.8.x را تصحیح میکند: این ابزار همترازی 4 KiB استاب را اصلاح خواهد کرد.
UPX شامل تمام قابلیتهای stubify است. این بدان معناست که بهطور خودکار فایلهای COFF شما را stubify خواهد کرد. برای غیرفعال کردن این قابلیت از گزینهٔ --coff استفاده کنید (به زیر مراجعه کنید).
UPX بهطور خودکار packfileهای Allegro را مدیریت میکند.
قالب DLM (یک پسوند نسبتاً نامتعارف برای کتابخانههای اشتراکی) پشتیبانی نمیشود.
برنامههای بستهبندیشده پس از خارج شدن از حالت فشرده، بایتبهبایت با نسخه اصلی یکسان خواهند بود. با این حال، تمامی اطلاعات اشکالزدایی و دادههای زائد انتهایی حذف خواهند شد.
گزینههای اضافی موجود برای این قالب اجرایی:
--coff تولید خروجی COFF بهجای EXE. بهطور پیشفرض
UPX استاب (stub) فعلی شما را حفظ میکند.
--all-methods فشردهسازی چندباره برنامه با استفاده از همه روشهای
فشردهسازی موجود. این گزینه ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً روش پیشفرض در هر صورت
بهترین نتایج را میدهد.
--all-filters فشردهسازی چندباره برنامه با استفاده از همه فیلترهای
پیشپردازش موجود. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود دهد، اما معمولاً فیلتر پیشفرض در هر
صورت بهترین نتایج را میدهد.
مقدمه
پشتیبانی از Linux/386 در UPX شامل ۳ قالب اجرایی مختلف است:
یکی بهینهسازیشده برای فایلهای اجرایی ELF ("linux/elf386")،
یکی بهینهسازیشده برای اسکریپتهای پوسته ("linux/sh386")،
و یک قالب عمومی ("linux/386").
ما ابتدا با یک بحث کلی شروع خواهیم کرد، اما لطفاً مستندات مربوط به
هر یک از قالبهای مجزا را نیز مطالعه کنید.
همچنین پشتیبانی ویژهای برای هستههای قابل بوت وجود دارد -
توضیحات مربوط به قالب vmlinuz/386 را ببینید.
نگاهی کلی برای کاربران
اجرای یک برنامه اجرایی فشردهشده، فضای کمتری را در یک رسانه ذخیرهسازی ``همیشگی'' (مانند دیسک سخت، فلاپی دیسک، CD-ROM، حافظه فلش، EPROM و غیره) در ازای فضای بیشتر در یک یا چند رسانه ذخیرهسازی ``موقت'' (مانند RAM، فضای swap، /tmp و غیره) مبادله میکند. اجرای یک فایل اجرایی فشردهشده همچنین به چرخههای پردازشی (CPU) اضافی برای تولید فایل در وهله اول و بازگشایی آن در هر فراخوانی نیاز دارد. چه مقدار فضا مبادله میشود؟ این به فایل اجرایی بستگی دارد، اما بسیاری از برنامهها ۳۰٪ تا ۵۰٪ از فضای دیسک دائمی را صرفهجویی میکنند. چقدر سربار پردازنده (CPU overhead) وجود دارد؟ باز هم به برنامه بستگی دارد، اما سرعت بازگشایی معمولاً حداقل چندین مگابایت بر ثانیه است و اغلب توسط سرعت I/O دیسک یا شبکه محدود میشود. بسته به آمار استفاده و دسترسی، و سرعتهای نسبی پردازنده، RAM، فضای swap، /tmp و ذخیرهسازی سیستم فایل، فراخوانی و اجرای یک فایل اجرایی فشردهشده میتواند سریعتر از اجرای مستقیم برنامه غیرفشرده متناظر باشد. سیستمعامل ممکن است برای فراخوانی برنامه فشرده عملیات I/O پرهزینه کمتری انجام دهد. پیجینگ (Paging) به یا از فضای swap یا /tmp ممکن است سریعتر از پیجینگ از سیستم فایل عمومی باشد. برنامههای ``متوسط'' که به حدود ۱/۳ تا ۱/۲ از بایتهای ذخیرهشده برنامه خود دسترسی دارند، میتوانند به ویژه عملکرد خوبی با فشردهسازی داشته باشند. برنامههای کوچک سود چندانی نمیبرند زیرا صرفهجویی مطلق کمتر است. برنامههای بزرگ ممکن است به تناسب سود نبرند زیرا هر فراخوانی ممکن است تنها از بخش کوچکی از برنامه استفاده کند، در حالی که UPX پیش از فراخوانی، کل برنامه را بازگشایی میکند. اما در محیطهایی که فضای دیسک یا حافظه فلش محدود است، فشردهسازی به هر حال برنده است. در حال حاضر، برنامههای فشردهشده توسط UPX در زمان اجرا برخلاف برنامههای نگاشتشده از یک سیستم فایل، حافظه RAM را به اشتراک نمیگذارند. در نتیجه، اگر همان برنامه به طور همزمان توسط بیش از یک فرآیند اجرا شود، استفاده از نسخه فشرده به RAM و/یا فضای swap بیشتری نیاز خواهد داشت. بنابراین، برنامههای پوسته (bash، csh و غیره) و `make' ممکن است گزینههای مناسبی برای فشردهسازی نباشند. ابزار UPX سه قالب اجرایی را برای Linux تشخیص میدهد: Linux/elf386، Linux/sh386 و Linux/386. قالب Linux/386 عمومیترین قالب است؛ و هر فایلی را که قابل اجرا باشد میپذیرد. در زمان اجرا، خردبرنامه (stub) بازگشایی UPX یک رونوشت از فایل اصلی را در /tmp بازسازی میکند، و سپس آن رونوشت با همان آرگومانها (مجدداً) اجرا میشود. برنامههای اجرایی باینری ELF بهطور پیشفرض قالب Linux/elf386 را ترجیح میدهند، چرا که UPX آنها را مستقیماً در RAM بازگشایی میکند، تنها از یک exec استفاده میکند، و فضایی در /tmp یا /proc مصرف نمیکند. اسکریپتهای پوسته که در آنها پوسته اصلی آرگومان ``-c'' را میپذیرد میتوانند از قالب Linux/sh386 استفاده کنند. UPX اسکریپت پوسته را در حافظه پایین بازگشایی میکند، سپس پوسته را نگاشت کرده و کل متن اسکریپت را به عنوان یک آرگومان با پیشوند ``-c'' منتقل میکند.
مزایای عمومی:
- ابزار UPX میتواند تمام فایلهای اجرایی را فشرده کند، چه AOUT، ELF،
libc4، libc5، libc6، اسکریپتهای Shell/Perl/Python/...، باینریهای
مستقل .class جاوا، یا هر چیز دیگر...
تمام اسکریپتها و برنامهها درست مانند قبل کار خواهند کرد.
- برنامههای فشردهشده کاملاً مستقل و خودکفا (self-contained) هستند.
نیازی به هیچ برنامه خارجی نیست.
- ابزار UPX برنامه اصلی شما را دستنخورده باقی میگذارد. این بدان
معناست که پس از بازگشایی، نسخهای دقیقاً یکسان از نظر بایت خواهید
داشت، و میتوانید مانند gzip از UPX به عنوان یک فشردهساز فایل
استفاده کنید.
[ توجه داشته باشید که UPX یک مجموع کنترلی (checksum) از فایل را
بهطور داخلی نگهداری میکند، بنابراین در واقع یک جایگزین قابل اعتماد است. ]
- از آنجا که خردبرنامه (stub) فقط از syscallها استفاده میکند و با libc
پیوند نخورده است، باید تحت هر پیکربندی لینوکسی که قادر به اجرای
باینریهای ELF است اجرا شود.
- به همین دلیل، برنامههای اجرایی فشرده باید تحت FreeBSD و سایر
سیستمهایی که میتوانند باینریهای Linux را اجرا کنند نیز کار کنند.
[ لطفاً بازخورد خود را درباره این موضوع ارسال کنید ]
معایب عمومی:
- فشردهسازی برنامههایی که معمولاً نمونههای در حال اجرای زیادی دارند (مانند `sh' یا `make') توصیه نمیشود، زیرا بخشهای مشترک برنامههای فشردهشده دیگر بین فرآیندهای مختلف به اشتراک گذاشته نمیشوند. - دستورهای `ldd' و `size' چیز مفیدی را نمایش نخواهند داد، چرا که تمام چیزی که میبینند خردبرنامه (stub) با پیوند ایستا است. از نسخه 0.82 سرآیندهای بخشها از خردبرنامه UPX حذف شدهاند و `size' حتی قالب فایل را تشخیص نمیدهد. فایل patches/patch-elfcode.h وصلهای برای رفع این باگ در `size' و سایر برنامههای استفادهکننده از GNU BFD دارد.
نکات عمومی:
- از آنجا که UPX برنامه اصلی شما را دستنخورده باقی میگذارد، بهتر است
پیش از فشردهسازی آن را strip کنید.
- اگر یک اسکریپت را فشرده کنید، استقلال از بستره (platform independence)
را از دست خواهید داد - این موضوع در صورت استفاده از دیسکهای
سوارشده با NFS میتواند مشکلساز باشد.
- فشردهسازی برنامههای دارای بیتهای suid، guid و sticky-bit به دلیل
پیامدهای امنیتی احتمالی رد میشود.
- به همین دلیل، suid کردن هیچ برنامه فشردهشدهای منطقی نیست.
- بدیهی است که UPX با برنامههای اجرایی که میخواهند دادهها را از
خود بخوانند کار نخواهد کرد. برای مثال، این موضوع ممکن است برای
اسکریپتهای Perl که به خطوط __DATA__ خود دسترسی دارند ایجاد مشکل کند.
- در صورت بروز خطاهای داخلی، خردبرنامه با exitcode 127 متوقف خواهد شد.
دلایل متداول برای این اتفاق این است که برنامه پس از فشردهسازی به نوعی
دستکاری شده است. اجرای `strace -o strace.log compressed_file'
اطلاعات بیشتری به شما خواهد داد.
لطفاً ابتدا توضیحات عمومی لینوکس را مطالعه کنید.
قالب linux/elf386 مستقیماً درون RAM بازگشایی میشود، تنها از یک exec استفاده میکند، فضایی در /tmp اشغال نمیکند، و از /proc بهره نمیگیرد.
قالب linux/elf386 بهطور خودکار برای فایلهای اجرایی Linux ELF انتخاب میشود.
برنامههای فشردهشده پس از بازگشایی، بایتبهبایت با نسخه اصلی یکسان خواهند بود.
نحوه کارکرد:
برای فایلهای اجرایی ELF، ابزار UPX دادهها را مستقیماً در حافظه بازگشایی میکند و نگاشتی را که هسته سیستمعامل هنگام exec() به کار میبرد، از جمله مفسر برنامه PT_INTERP (در صورت وجود) را شبیهسازی مینماید. مقدار brk() توسط یک بخش خاص PT_LOAD در خود فایل اجرایی فشرده تنظیم میشود. سپس UPX پشته را به جز آرگومانها، متغیرهای محیط و مدخلهای Elf_auxv کاملاً پاک میکند (این کار به خاطر اشکالات موجود در کد آغازین /lib/ld-linux.so تا مه ۲۰۰۰ الزامی است) و کنترل را به مفسر برنامه یا آدرس e_entry فایل اجرایی اصلی منتقل میکند. استاب (stub) برنامه UPX حدود ۱۷۰۰ بایت طول دارد، تا حدی به زبان اسمبلی نوشته شده و تنها از syscallهای هسته استفاده میکند. این قطعه به هیچ libc پیوند ندارد.
معایب خاص:
- در قالبهای linux/elf386 و linux/sh386، شما در تمام طول عمر فرایند برای نگهداری کل برنامه بازگشاییشده به RAM و فضای swap وابسته خواهید بود. اگر پیشتر بخش عمدهای از فضای swap خود را استفاده کرده باشید، ممکن است با کمبود فضا مواجه شوید. سیستمی که با «کمبود حافظه» (out of memory) روبرو شود ممکن است ناپایدار گردد. بسیاری از برنامهها هنگامی که malloc() مقدار 0 را برمیگرداند واکنش مناسبی نشان نمیدهند. با هستههای جدیدتر لینوکس، ممکن است هسته تصمیم بگیرد برخی فرایندها را برای بازپسگیری حافظه متوقف کند (kill) و شاید انتخاب هسته مطابق میل شما نباشد. اجرای /usr/bin/top روشی برای بررسی وضعیت swap است.
گزینههای اضافی موجود برای این قالب اجرایی:
(هیچکدام)
نکات مربوط به LINUX/SH386 (NOTES FOR LINUX/SH386)
لطفاً ابتدا توضیحات عمومی لینوکس را مطالعه کنید.
اسکریپتهای پوسته که در آنها پوستهٔ زیرین یک آرگومان “-c” را میپذیرد میتوانند از قالب Linux/sh386 استفاده کنند. UPX اسکریپت پوسته را در بخش پایینی حافظه بازگشایی میکند، سپس پوسته را نگاشت کرده و تمام متن اسکریپت را بهعنوان یک آرگومان همراه با پیشوند “-c” ارسال مینماید. این قالب از فضا در /tmp استفاده نمیکند و از /proc بهره نمیگیرد.
قالب Linux/sh386 بهطور خودکار برای اسکریپتهای پوستهای که از یک پوسته شناختهشده استفاده میکنند، انتخاب میشود.
برنامههای فشردهشده پس از بازگشایی، بایتبهبایت با نسخه اصلی یکسان خواهند بود.
نحوه کارکرد:
برای فایلهای اجرایی اسکریپت پوسته (فایلهایی که با "#!/" یا "#! /" آغاز میشوند) که پوستهٔ آنها قابلیت پذیرش "-c <command>" را دارد، UPX فایل را در بخش پایینی حافظه بازگشایی میکند، سپس پوسته (و PT_INTERP آن) را نگاشت کرده و کنترل را به پوسته واگذار مینماید، در حالی که کل فایل بازگشاییشده را بهعنوان آرگومان پس از "-c" ارسال میکند. پوستههای شناختهشده عبارتند از: sh، ash، bash، bsh، csh، ksh، tcsh و pdksh. محدودیت: UPX نمیتواند از این روش برای اسکریپتهای پوستهای که از یک آرگومان رشتهای اختیاری پس از نام پوسته در اسکریپت استفاده میکنند بهره بگیرد (مثال: "#! /bin/sh option3\n".) استاب (stub) برنامه UPX حدود ۱۷۰۰ بایت طول دارد، تا حدی به زبان اسمبلی نوشته شده و تنها از syscallهای هسته استفاده میکند. این قطعه به هیچ libc پیوند ندارد.
معایب خاص:
- در قالبهای linux/elf386 و linux/sh386، شما در تمام طول عمر فرایند برای نگهداری کل برنامه بازگشاییشده به RAM و فضای swap وابسته خواهید بود. اگر پیشتر بخش عمدهای از فضای swap خود را استفاده کرده باشید، ممکن است با کمبود فضا مواجه شوید. سیستمی که با «کمبود حافظه» (out of memory) روبرو شود ممکن است ناپایدار گردد. بسیاری از برنامهها هنگامی که malloc() مقدار 0 را برمیگرداند واکنش مناسبی نشان نمیدهند. با هستههای جدیدتر لینوکس، ممکن است هسته تصمیم بگیرد برخی فرایندها را برای بازپسگیری حافظه متوقف کند (kill) و شاید انتخاب هسته مطابق میل شما نباشد. اجرای /usr/bin/top روشی برای بررسی وضعیت swap است.
گزینههای اضافی موجود برای این قالب اجرایی:
(هیچکدام) لطفاً ابتدا توضیحات عمومی لینوکس را مطالعه کنید.
قالب عمومی linux/386 در /tmp از حالت فشرده خارج میشود و به پشتیبانی از سیستمفایل /proc نیاز دارد. این قالب برنامهٔ خارجشده از فشردگی را از طریق فراخوان سیستمی execve() اجرا میکند.
قالب linux/386 تنها زمانی انتخاب میشود که قالبهای تخصصی linux/elf386 و linux/sh386 نتوانند فایل را شناسایی کنند.
برنامههای بستهبندیشده پس از خروج از فشردگی، بایتبهبایت با نسخهٔ اصلی یکسان خواهند بود.
نحوهٔ کارکرد:
برای فایلهایی که ELF نبوده و اسکریپتی برای یک شل شناختهشدهٔ «-c» نیستند،
ابزار UPX از execve() کرنل استفاده میکند، که ابتدا نیازمند باز کردن
فشردگی در یک فایل موقت در سیستمفایل است. جالب اینجاست که - به دلیل
مدیریت حافظهٔ مناسب هستهٔ لینوکس - این کار معمولاً تاخیر محسوسی
ایجاد نمیکند و در واقع اگر حافظهٔ آزاد کافی داشته باشید، اصلاً دسترسی
به دیسک وجود نخواهد داشت، زیرا تمام فرایند در بافرهای سیستمفایل انجام میشود.
یک فایل اجرایی فشردهشده شامل UPX stub و یک overlay است که
شامل برنامهٔ اصلی به صورت فشرده است.
بخش UPX stub یک فایل اجرایی ELF با پیوند ایستا (statically linked) است
و هنگام شروع برنامه کارهای زیر را انجام میدهد:
۱) باز کردن فشردگی overlay در یک مسیر موقت در /tmp
۲) باز کردن فایل موقت برای خواندن
۳) تلاش برای حذف فایل موقت و شروع (execve) برنامهٔ خارجشده از
فشردگی در /tmp با استفاده از /proc/<pid>/fd/X بهدستآمده در مرحلهٔ ۲
۴) در صورت شکست، فورک (fork) یک زیرفرایند برای پاکسازی و
همزمان شروع برنامه در /tmp
طول UPX stub حدود ۱۷۰۰ بایت است، بخشی از آن به زبان اسمبلی نوشته شده
و تنها از فراخوانهای سیستمی هسته استفاده میکند. این بخش به هیچ libc پیوند ندارد.
معایب خاص:
- شما در دایرکتوری /tmp خود به فضای خالی دیسک اضافی برای برنامهٔ خارجشده از فشردگی نیاز دارید. این برنامه بلافاصله پس از خروج از فشردگی حذف میشود، اما در تمام طول مدت اجرای برنامه همچنان به آن نیاز خواهید داشت. - باید پشتیبانی از سیستمفایل /proc وجود داشته باشد زیرا stub میخواهد /proc/<pid>/exe را باز کند و به /proc/<pid>/fd/X نیاز دارد. این یعنی شما نمیتوانید برنامههایی را که پیش از سوار شدن (mount) دایرکتوری /proc در فرایند بوت استفاده میشوند فشردهسازی کنید. - ابزارهایی مانند `top' مقادیر عددی را در فیلد نام فرایند نمایش خواهند داد. دلیل این امر این است که لینوکس نام فرایند را از نخستین آرگومان آخرین فراخوان سیستمی execve (که معمولاً چیزی شبیه به /proc/<pid>/fd/3 است) محاسبه میکند. - به دلیل باز شدن موقت فشردگی روی دیسک، سرعت خروج از فشردگی به اندازهٔ سایر قالبهای اجرایی سریع نیست. با این حال، هنگام راهاندازی برنامههایی مانند emacs حدوداً ۳ مبیبایتی (که پس از فشردهسازی کمتر از ۱ مبیبایت است :-)) تاخیر محسوسی دیده نمیشود.
گزینههای اضافی موجود برای این قالب اجرایی:
--force-execve اجبار به استفاده از قالب عمومی "execve" برای linux/386،
یعنی قالبهای linux/elf386 و linux/sh386 امتحان نشوند.
نکات مربوط به PS1/EXE (NOTES FOR PS1/EXE)
این قالب اجرایی مورد استفاده در Sony PlayStation (PSone) است؛ یک کنسول بازی مبتنی بر MIPS R3000 که از اواخر دههٔ ۹۰ میلادی محبوبیت داشته است. پشتیبانی از این قالب به دلیل حس نوستالژیک یکی از نویسندگان، بسیار شبیه به قالب Atari است.
برنامههای بستهبندیشده تا اطلاع ثانوی، پس از خروج از فشردگی بایتبهبایت با نسخهٔ اصلی یکسان خواهند بود.
حداکثر اندازهٔ خارج از فشردگی: حدود ۱٫۸۹ / حدود ۷٫۶۰ مبیبایت (MiB).
نکات:
- ابزار UPX بهطور پیشفرض یک فایل اجرایی مناسب برای CD-Mastering و انتقال به کنسول ایجاد میکند. برای یک فایل اجرایی اصلی در CD-Master میتوانید گزینهٔ ویژهٔ "--boot-only" را نیز همانطور که در زیر شرح داده شده امتحان کنید. گزارش شده است که فایلهای اجرایی بستهبندیشده با upx در حالت شبیهسازی Sony PlayStation (PSone)، با Sony PlayStation 2 (PS2, PStwo) و Sony PlayStation Portable (PSP) کاملاً سازگار هستند. - در حالت عادی، فایلهای بستهبندیشده از همان نواحی حافظهای استفاده میکنند که نسخههای فشردهنشده استفاده میکردند، بنابراین هنگام خروج از فشردگی روی سایر نواحی حافظه بازنویسی نمیکنند. اگر این کار ممکن نباشد، UPX متوقف شده و خطای 'packed data overlap' را نشان میدهد. با گزینهٔ "--force"، ابزار UPX آدرس بارگذاری را برای فایل بستهبندیشده جابهجا (relocate) میکند، اما اگر فایل اجرایی یکتا یا اصلی باشد، این موضوع مشکلی ایجاد نخواهد کرد.
گزینههای اضافی موجود برای این قالب اجرایی:
--all-methods فشردهسازی برنامه برای چند بار، با استفاده از تمام روشهای
فشردهسازی موجود. این کار در برخی موارد نسبت فشردهسازی را
بهبود میبخشد، اما معمولاً روش پیشفرض در هر صورت بهترین
نتیجه را میدهد.
--8-bit استفاده از فشردهسازی با اندازهٔ ۸ بیتی [پیشفرض: ۳۲ بیتی]
--8mib-ram کنسول PSone دارای ۸ مبیبایت حافظهٔ RAM در دسترس است [پیشفرض: ۲ مبیبایت]
--boot-only این قالب تنها برای فایلهای اجرایی اصلی و CD-Mastering است!
ممکن است نسبت فشردهسازی را کمی بهبود دهد و روتینهای
خروج از فشردگی سریعتر از روتینهای پیشفرض هستند؛
اما نمیتوان از آن برای انتقال به کنسول استفاده کرد!
--no-align این گزینه ترازسازی قالب بخش دادهٔ CD mode 2 را غیرفعال
میکند. ممکن است نسبت فشردهسازی را کمی بهبود بخشد، اما
فایل اجرایی فشردهشده از روی CD بوت نخواهد شد.
تنها برای انتقال به کنسول استفاده شود!
مشابه win32/pe.
نکاتی برای TMT/ADAM (NOTES FOR TMT/ADAM)
این قالب توسط کامپایلر TMT Pascal استفاده میشود - نشانی http://www.tmt.com را ببینید.
گزینههای اضافی موجود برای این قالب اجرایی:
--all-methods برنامه را چندین بار با استفاده از تمام روشهای فشردهسازی
موجود فشرده میکند. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود بخشد، اما معمولاً روش پیشفرض در هر
صورت بهترین نتایج را ارائه میدهد.
--all-filters برنامه را چندین بار با استفاده از تمام فیلترهای پیشپردازش
موجود فشرده میکند. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود بخشد، اما معمولاً فیلتر پیشفرض در هر
صورت بهترین نتایج را ارائه میدهد.
نکاتی برای VMLINUZ/386 (NOTES FOR VMLINUZ/386)
قالبهای vmlinuz/386 و bvmlinuz/386 یک تصویر کرنل لینوکس قابل بوت فشردهشده با gzip (“vmlinuz”، “zImage”، “bzImage”) را دریافت کرده، آن را از حالت فشرده خارج میکنند و مجدداً با روش فشردهسازی UPX فشرده میسازند.
قالب vmlinuz/386 کاملاً بیارتباط با سایر قالبهای اجرایی لینوکس است و هیچیک از معایب آنها را ندارد.
نکات:
- مطمئن شوید که در حین فشردهسازی "vmlinuz/386" یا "bvmlinuz/386" نمایش داده میشود - در غیر این صورت ممکن است یک قالب اجرایی نادرست استفاده شده باشد و کرنل بوت نشود.
مزایا:
- فشردهسازی بهتر (البته توجه داشته باشید که کرنل از قبل فشرده شده بود،
بنابراین بهبود حاصلشده به بزرگی سایر قالبها نیست). با این حال، بایتهای
صرفهجوییشده ممکن است برای نیازهای خاص مانند دیسکهای بوت حیاتی باشند.
برای مثال، این نتیجهای است که برای کرنل 2.2.16 به دست آمده است:
1589708 vmlinux
641073 bzImage [اصلی]
560755 bzImage.upx [فشردهشده با "upx -9"]
- بازگشایی بسیار سریعتر در زمان بوت کرنل (اگرچه سرعت بازگشایی
کرنل این روزها واقعاً مسئله مهمی به شمار نمیرود).
معایب:
(هیچ)
گزینههای اضافی موجود برای این قالب اجرایی:
--all-methods برنامه را چندین بار با استفاده از تمام روشهای فشردهسازی
موجود فشرده میکند. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود بخشد، اما معمولاً روش پیشفرض در هر
صورت بهترین نتایج را ارائه میدهد.
--all-filters برنامه را چندین بار با استفاده از تمام فیلترهای پیشپردازش
موجود فشرده میکند. این کار ممکن است در برخی موارد نسبت
فشردهسازی را بهبود بخشد، اما معمولاً فیلتر پیشفرض در هر
صورت بهترین نتایج را ارائه میدهد.
نکاتی برای WATCOM/LE (NOTES FOR WATCOM/LE)
UPX با
اکستندرهای
(extenders) زیر با
موفقیت
آزمایش شده
است:
DOS4G, DOS4GW, PMODE/W, DOS32a, CauseWay.
اکستندر WDOS/X
تا حدی
پشتیبانی
میشود
(برای
جزئیات
بیشتر
فایل
اشکالات BUGS
را ببینید).
فایلهای DLL و قالب LX پشتیبانی نمیشوند.
گزینههای اضافی موجود برای این قالب اجرایی:
--le تولید یک خروجی LE پیوندنیافته (unbound) به جای
حفظ استاب (stub) فعلی.
پشتیبانی از PE در UPX در حال حاضر کاملاً پایدار است، اما احتمالاً هنوز
ناسازگاریهایی با برخی فایلها وجود دارد.
به دلیل شیوهٔ کارکرد UPX (و سایر فشردهسازهای این قالب)، ممکن است شاهد افزایش مصرف حافظهٔ فایلهای فشردهشدهٔ خود باشید؛ چرا که کل برنامه در زمان راهاندازی در حافظه بارگذاری میشود. اگر چندین نمونه از برنامههای فشردهشدهٔ حجیم را اجرا کنید، حافظه را هدر میدهید، زیرا بخشهای مشترک برنامه میان نمونهها به اشتراک گذاشته نخواهد شد. از سوی دیگر، اگر فقط برنامههای کوچکتر را فشرده میکنید، یا فقط یک نمونه از برنامههای بزرگتر را اجرا مینمایید، این افت کارایی کمتر خواهد بود، اما همچنان وجود دارد.
اگر فایلهای اجرایی را از طریق شبکه اجرا میکنید، برنامههای فشردهشده سریعتر بارگذاری میشوند و در طول اجرا به پهنای باند کمتری نیاز دارند.
از DLLها پشتیبانی میشود؛ اما DLLهای فشردهشده با UPX نمیتوانند هنگام استفاده توسط چندین برنامه، دادهها و کدهای مشترک را به اشتراک بگذارند. بنابراین فشردهسازی msvcrt.dll اتلاف حافظه است، اما فشردهسازی پلاگینهای dll یک برنامهٔ خاص میتواند ایدهٔ بهتری باشد.
از محافظهای صفحهنمایش پشتیبانی میشود، با این محدودیت که نام فایل باید به ".scr" ختم شود (زیرا با محافظهای صفحهنمایش کمی متفاوت از فایلهای exe معمولی برخورد میشود).
فایلهای PE فشردهشده توسط UPX مقداری سربار حافظهٔ جزئی دارند (معمولاً در محدودهٔ 10 - 30 KiB) که با مشخص کردن سوییچ خط فرمان "-i" در هنگام فشردهسازی قابل مشاهده است.
گزینههای اضافی موجود برای این قالب اجرایی:
--compress-exports=0 بخش export فشردهسازی نشود.
اگر قصد دارید برنامهٔ فشردهشده را تحت Wine
اجرا کنید، از این گزینه استفاده نمایید.
--compress-exports=1 بخش export فشردهسازی شود. [پیشفرض]
فشردهسازی بخش export میتواند نسبت فشردهسازی را
تا حد زیادی بهبود بخشد، اما ممکن است با همهٔ برنامهها
(مانند winword.exe) کار نکند.
UPX صرفنظر از این گزینه، هرگز بخش export یک DLL را
فشردهسازی نمیکند.
--compress-icons=0 هیچ آیکونی فشرده نشود.
--compress-icons=1 همهٔ آیکونها بهجز آیکون اول فشرده شوند.
--compress-icons=2 همهٔ آیکونهایی که در اولین دایرکتوری آیکون نیستند
فشرده شوند. [پیشفرض]
--compress-icons=3 همهٔ آیکونها فشرده شوند.
--compress-resources=0 بههیچوجه هیچ منبعی (resource) فشرده نشود.
--keep-resource=list منابع مشخصشده توسط فهرست فشرده نشوند.
اعضای فهرست با کاما از یکدیگر جدا میشوند.
عضو فهرست قالبی به این شکل دارد: I<type[/name]>.
مقدار I<Type> نوع منبع است. انواع استاندارد باید
به صورت اعداد دهدهی مشخص شوند، انواع کاربری میتوانند
با شناسههای دهدهی یا رشتهها مشخص گردند. I<Name>
شناسهٔ منبع است که میتواند یک عدد دهدهی یا رشته
باشد. برای مثال:
--keep-resource=2/MYBITMAP,5,6/12345
ابزار UPX منبع تصویر بیتی با نام "MYBITMAP" را فشرده
نمیکند، تمام منابع اعلان (5) را فشردهنشده باقی میگذارد،
و به منبع جدول رشتهها با شناسهٔ 12345 دست نمیزند.
--force تحمیل فشردهسازی حتی زمانی که مقدار غیرمنتظرهای
در یکی از فیلدهای هدر وجود دارد.
با احتیاط استفاده شود.
--strip-relocs=0 رکوردهای relocation حذف نشوند.
--strip-relocs=1 رکوردهای relocation حذف شوند. [پیشفرض]
این گزینه فقط روی فایلهای اجرایی با نشانی پایهٔ
بزرگتر یا مساوی 0x400000 کار میکند. معمولاً فایلهای
فشردهشده کوچکتر میشوند، اما برخی فایلها ممکن است
بزرگتر شوند. توجه داشته باشید که فایل حاصل تحت
Windows 3.x (Win32s) کار نخواهد کرد.
ابزار UPX صرفنظر از این گزینه، هرگز رکوردهای relocation
را از یک DLL حذف نمیکند.
--all-methods برنامه چندین بار با استفاده از تمام روشهای فشردهسازی
موجود فشرده شود. این گزینه ممکن است در برخی موارد
نسبت فشردهسازی را بهبود بخشد، اما معمولاً روش پیشفرض
در هر صورت بهترین نتایج را ارائه میدهد.
--all-filters برنامه چندین بار با استفاده از تمام فیلترهای پیشپردازش
موجود فشرده شود. این گزینه ممکن است در برخی موارد
نسبت فشردهسازی را بهبود بخشد، اما معمولاً فیلتر پیشفرض
در هر صورت بهترین نتایج را ارائه میدهد.
وضعیت خروج در حالت عادی 0 است؛ در صورت بروز خطا، وضعیت خروج
1 و در صورت بروز هشدار، وضعیت خروج 2 خواهد بود.
پیامهای خطای UPX بهگونهای طراحی شدهاند که خودتوضیح باشند.
گزارش باگها (BUGS)
لطفاً تمام باگها را فوراً به نویسندگان گزارش دهید.
نویسندگان (AUTHORS)
Markus F.X.J. Oberhumer <markus@oberhumer.com> http://www.oberhumer.com Laszlo Molnar <ezerotven+github@gmail.com> John F. Reiser <jreiser@BitWagon.com>
کپیرایت و تکثیر (COPYRIGHT)
Copyright (C) 1996-2026 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2026 Laszlo Molnar
Copyright (C) 2000-2026 John F. Reiser
UPX به همراه کد منبع کامل تحت شرایط GNU General Public License v2+ توزیع میشود؛ یا تحت GPLv2+ خالص (فایل COPYING را ببینید)، یا (به انتخاب شما) تحت GPLv+2 همراه با استثناها و محدودیتهای ویژهای که امکان استفادهٔ رایگان را برای همهٔ باینریها از جمله برنامههای تجاری فراهم میکند (فایل LICENSE را ببینید).
این برنامه با این امید توزیع شده است که مفید باشد، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف خاص.
شما باید به همراه این برنامه نسخهای از توافقنامههای مجوز UPX را دریافت کرده باشید؛ فایلهای COPYING و LICENSE را بررسی کنید. در غیر این صورت، به وبگاه اصلی UPX مراجعه نمایید.
| 2026-06-08 | upx 5.2.0 |