هل هناك أي جوانب سلبية لاستخدام UPX لضغط ملف Windows القابل للتنفيذ؟

StackOverflow https://stackoverflow.com/questions/353634

سؤال

لقد استخدمت UPX قبل أن أقوم بتقليل حجم الملفات التنفيذية لنظام التشغيل Windows، ولكن يجب أن أعترف بأنني ساذج تجاه أي آثار جانبية سلبية قد تحدث بسبب ذلك.ما هو الجانب السلبي لكل هذا التعبئة/التفريغ؟

هل هناك سيناريوهات قد يوصي فيها أي شخص بعدم استخدام UPX في ملف قابل للتنفيذ (على سبيل المثال؟عند كتابة DLL أو خدمة Windows أو عند استهداف نظام التشغيل Vista أو Win7)؟أكتب معظم التعليمات البرمجية الخاصة بي في دلفي، ولكنني استخدمت UPX لضغط الملفات التنفيذية لـ C/C++ أيضًا.

في ملاحظة جانبية، أنا لا تشغيل UPX في بعض المحاولات لحماية ملف exe الخاص بي من أدوات التفكيك، فقط لتقليل حجم الملف القابل للتنفيذ ومنع التلاعب السريع.

هل كانت مفيدة؟

المحلول

والسبب هو وجود سلبيات لاستخدام ضواغط exe.الجدير بالذكر:

عند بدء تشغيل exe/dll مضغوط ، يتم إلغاء ضغط كل الكود من صورة القرص إلى ذاكرة في ممر واحد ، مما قد يتسبب في سحق القرص إذا كان النظام منخفضًا على الذاكرة ويُجبر على الوصول إلى ملف المبادلة.في المقابل ، مع exe/dlls غير المضغوطة ، يخصص نظام التشغيل الذاكرة لصفحات التعليمات البرمجية عند الطلب (أيعند إعدامهم).

حالات متعددة من EXE/DLL مضغوطة إنشاء مثيلات متعددة من الكود في الذاكرة.إذا كان لديك EXE مضغوط يحتوي على 1 ميغابايت من الكود (قبل الضغط) ويبدأ المستخدم 5 مثيلات منه ، يتم إهدار حوالي 4 ميغابايت من الذاكرة.وبالمثل ، إذا كان لديك DLL 1 ميغابايت ويتم استخدامه بواسطة 5 تطبيقات تشغيل ، فإن حوالي 4 ميغابايت من الذاكرة تضيع.مع EXE/DLLs غير المضغوطة ، يتم تخزين الكود فقط في الذاكرة مرة واحدة ويتم مشاركتها بين الحالات.

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

نصائح أخرى

أنا مندهش من أنه لم يتم ذكر ذلك بعد ولكن استخدام الملفات التنفيذية المعبأة بـ UPX يزيد أيضًا من خطر إنتاج نتائج إيجابية كاذبة من برامج مكافحة الفيروسات الإرشادية لأن الكثير من البرامج الضارة تستخدم UPX إحصائيًا.

هناك ثلاثة عيوب:

  1. سيتم فك ضغط الكود بالكامل في الذاكرة الظاهرية، بينما في EXE أو DLL العادي، يتم تحميل الكود المستخدم فعليًا فقط في الذاكرة.يعد هذا مناسبًا بشكل خاص إذا تم استخدام جزء صغير فقط من التعليمات البرمجية الموجودة في ملف EXE/DLL الخاص بك في كل عملية تشغيل.
  2. إذا كانت هناك مثيلات متعددة لـ DLL وEXE قيد التشغيل، فلا يمكن مشاركة التعليمات البرمجية الخاصة بها عبر المثيلات، لذلك ستستخدم المزيد من الذاكرة.
  3. إذا كان ملف EXE/DLL الخاص بك موجودًا بالفعل في ذاكرة التخزين المؤقت، أو على وسيط تخزين سريع جدًا، أو إذا كانت وحدة المعالجة المركزية التي تعمل عليها بطيئة، فسوف تواجه انخفاضًا في سرعة بدء التشغيل حيث سيظل من الضروري إجراء عملية إلغاء الضغط، ولن تتمكن من ذلك الاستفادة من الحجم المصغر.ينطبق هذا بشكل خاص على ملف EXE الذي سيتم استدعاؤه عدة مرات بشكل متكرر.

وبالتالي فإن العيوب المذكورة أعلاه تمثل مشكلة أكبر إذا كانت ملفات EXE أو DLL الخاصة بك تحتوي على الكثير من الموارد، ولكن بخلاف ذلك، فقد لا تكون عاملاً كبيرًا في الممارسة العملية، نظرًا للحجم النسبي للملفات التنفيذية والذاكرة المتوفرة، إلا إذا كنت تتحدث عن DLLs يتم استخدامه بواسطة الكثير من الملفات التنفيذية (مثل ملفات DLL الخاصة بالنظام).

لتبديد بعض المعلومات غير الصحيحة في الإجابات الأخرى:

  • لن يؤثر UPX على قدرتك على التشغيل على الأجهزة المحمية بواسطة DEP.
  • لن يؤثر UPX على قدرة برامج مكافحة الفيروسات الرئيسية، حيث أنها تدعم الملفات التنفيذية المضغوطة بواسطة UPX (بالإضافة إلى تنسيقات الضغط القابلة للتنفيذ الأخرى).
  • لقد كان UPX قادرًا على استخدام ضغط LZMA لبعض الوقت الآن (خوارزمية الضغط الخاصة بـ 7zip)، استخدم مفتاح --lzma.

الحجم الزمني الوحيد المهم هو أثناء التنزيل من الإنترنت.إذا كنت تستخدم UPX فإنك تحصل في الواقع على أداء أسوأ مما لو كنت تستخدمه 7-الرمز البريدي (بناءً على اختباري، فإن 7-Zip أفضل مرتين من UPX).ثم عندما يتم تركه مضغوطًا فعليًا على الكمبيوتر المستهدف، ينخفض ​​أدائك (انظر إجابة لارس).لذا فإن UPX ليس حلاً جيدًا لحجم الملف.فقط 7zip كل شيء.

بقدر ما يمنع العبث، فهو أ يفشل أيضًا.يدعم UPX فك الضغط أيضًا.إذا أراد شخص ما تعديل ملف EXE، فسوف يرى أنه مضغوط باستخدام UPX ثم يقوم بفك ضغطه.إن النسبة المئوية للمفرقعات المحتملة التي قد تبطئها لا تبرر الجهد المبذول وخسارة الأداء.

الحل الأفضل هو استخدام التوقيع الثنائي أو على الأقل مجرد تجزئة.نظام التحقق من التجزئة البسيط هو أخذ تجزئة للقيمة الثنائية والسرية (عادةً ما تكون دليلاً).ملف EXE الخاص بك هو الوحيد الذي يعرف القيمة السرية، لذلك عندما يعيد حساب التجزئة للتحقق يمكنه استخدامها مرة أخرى.هذا ليس مثاليًا (يمكن استرداد القيمة السرية).سيكون الوضع المثالي هو استخدام الشهادة والتوقيع.

الحجم النهائي للملف القابل للتنفيذ على القرص غير ذي صلة إلى حد كبير هذه الأيام.قد يتم تحميل برنامجك بشكل أسرع ببضعة مللي ثانية، ولكن بمجرد بدء تشغيله، لا يمكن تمييز الفرق.

قد يكون بعض الأشخاص أكثر تشككًا في ملفك القابل للتنفيذ لمجرد أنه مضغوط باستخدام UPX.اعتمادًا على المستخدمين النهائيين لديك، قد يكون هذا أحد الاعتبارات المهمة وقد لا يكون كذلك.

في المرة الأخيرة التي حاولت فيها استخدامه على تجميع مُدار، أفسده بشكل سيء لدرجة أن وقت التشغيل رفض تحميله.هذه هي المرة الوحيدة التي أستطيع أن أفكر فيها أنك لن ترغب في استخدامه (وفي الواقع، لقد مر وقت طويل منذ أن حاولت أن الوضع قد يكون أفضل الآن).لقد استخدمته على نطاق واسع في الماضي على جميع أنواع الثنائيات غير المُدارة، ولم أواجه أي مشكلة على الإطلاق.

إذا كان اهتمامك الوحيد هو تقليل حجم الملفات التنفيذية، فهل حاولت مقارنة حجم الملف القابل للتنفيذ مع حزم وقت التشغيل وبدونها؟من المؤكد أنه سيتعين عليك أيضًا تضمين أحجام الحزم بشكل عام مع الملف القابل للتنفيذ، ولكن إذا كان لديك العديد من الملفات التنفيذية التي تستخدم نفس الحزم الأساسية، فستكون مدخراتك عالية إلى حد ما.

هناك شيء آخر يجب النظر إليه وهو الرسومات/الحروف الرسومية التي تستخدمها في برنامجك.يمكنك توفير قدر كبير من المساحة عن طريق دمجها في قائمة Timagelist واحدة مضمنة في وحدة بيانات عامة بدلاً من تكرارها في كل نموذج.أعتقد أن كل صورة يتم تخزينها في مورد النموذج على شكل سداسي عشري، وهذا يعني أن كل بايت تشغل بايتين... يمكنك تقليص هذا قليلاً عن طريق تحميل الصورة من مورد RCData باستخدام TResourceStream.

IMHO بشكل روتيني UPXing لا معنى له، ولكن الأسباب موضحة أعلاه، في الغالب، الذاكرة أغلى من القرص.

إريك:قد يكون كعب LZMA أكبر.حتى لو كانت الخوارزمية أفضل، فإنها لا تشكل دائمًا ميزة إضافية.

يمكن لبرامج فحص الفيروسات التي تبحث عن فيروسات "غير معروفة" وضع علامة على الملفات التنفيذية المضغوطة لـ UPX على أنها تحتوي على فيروس.لقد قيل لي أن السبب في ذلك هو أن العديد من الفيروسات تستخدم UPX لإخفاء نفسها.لقد استخدمت UPX على البرنامج وسيقوم McAfee بوضع علامة على الملف باعتباره يحتوي على فيروس.

السبب وراء وجود العديد من الإنذارات الكاذبة في UPX هو أن ترخيصه المفتوح يسمح لمؤلفي البرامج الضارة باستخدامه وتعديله مع الإفلات من العقاب.بالطبع، هذه المشكلة متأصلة في الصناعة، ولكن للأسف مشروع UPX العظيم يعاني من هذه المشكلة.

تحديث:لاحظ أنه مع اكتمال مشروع Taggant، سيتم تعزيز القدرة على استخدام UPX (أو أي شيء آخر) دون التسبب في نتائج إيجابية كاذبة، على افتراض أن UPX يدعمه.

لا توجد عيوب.

ولكن لمعلوماتك فقط، هناك فكرة خاطئة شائعة جدًا فيما يتعلق بـ UPX مثل--

لا يتم ضغط الموارد فقط

أنت تقوم بشكل أساسي ببناء ملف تنفيذي جديد يحتوي على واجب "المحمل" والملف "الحقيقي" القابل للتنفيذ، حسنًا، يتم تجريده وضغطه، ووضعه كمورد بيانات ثنائية للمحمل القابل للتنفيذ (بغض النظر عن أنواع الموارد الموجودة في الأصلي القابل للتنفيذ).

استخدام أساليب الهندسة العكسية و أدوات سواء لأغراض التعليم أو آخر سيعرض لك المعلومات المتعلقة بـ "الملف القابل للتنفيذ للمحمل"، وليس المعلومات المتغيرة المتعلقة بالملف الأصلي القابل للتنفيذ.

executable uncompressed by UPX

executable compressed by UPX

وأعتقد أن هناك احتمال أنه قد لا يعمل على أجهزة الكمبيوتر التي لديها قسم (منع تنفيذ البيانات) قيد التشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top