حزم البرامج. تطوير حزمة الملفات القابلة للتنفيذ الخاصة بنا

20.04.2019

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

منذ وقت طويل، عندما لم يكن هناك نظام التشغيل Windows XP بعد، بحثًا عن معلومات حول أدوات التعبئة، تسلقنا أنا وولف إلى غابة الكود المصدري لـ UPX الشاب آنذاك. ولكن إما أننا قمنا بتصنيع كمية أقل من الأسيتيل كولين في أدمغتنا مما نحتاجه، أو أن UPX كان مملًا جدًا في ذلك الوقت - بشكل عام، لم نستخرج شيئًا تقريبًا من تلك الأصناف. ساعد مات بيتريك أيضًا بشكل أكبر. في الوقت الحاضر أصبح الأمر أسهل بكثير مع المعلومات. كل شيء تقريبا هناك. حتى مصادر طروادة المصرفية العادية تمامًا يمكن تنزيلها (Zeus 2.0.8.9, bit.ly/v3EiYP). لماذا، ظلت مصادر Windows في المجال العام لفترة طويلة (Windows 2000، bit.ly/rBZlCy).

هناك أيضًا معلومات حول شركات التعبئة، ولكن في الغالب أبحاث مرتبطة مباشرة بالتنمية، وليس من الجانب الذي نرغب فيه. مثال ممتاز على ذلك هو المقال "حول الحزم لآخر مرة" (bit.ly/vRPCxZ، bit.ly/tSUxT7) في جزأين، كتبه المعلمان المشهوران Volodya وNEOx.

ونحن بدورنا سنحاول تقديم أكبر قدر ممكن من المعلومات المحددة والمتسقة حول تطوير أداة تعبئة PE بسيطة ولكن سهلة التعديل لتناسب أيًا من احتياجاتك.

خوارزمية

لدينا هنا، على سبيل المثال، notepad.exe. في شكله المعتاد 32 بت، يزن حوالي 60 كيلو بايت. نريد تقليله بشكل كبير مع الحفاظ على جميع وظائفه. ماذا يجب أن تكون أفعالنا؟ حسنًا، أولاً، سنقرأ ملفنا من البايت الأول إلى الأخير في مصفوفة. الآن يمكننا أن نفعل ما نريد به. ونريد ضغطها. نحن نأخذها ونعطيها لبعض الضاغط البسيط، ونتيجة لذلك نحصل على مصفوفة لم تعد 60 كيلو بايت، ولكن، على سبيل المثال، 20 كيلو بايت. هذا رائع، ولكن في شكل مضغوط، فإن صورة المفكرة الخاصة بنا هي مجرد مجموعة من البايتات ذات إنتروبيا عالية، وهي ليست ملفًا قابلاً للتنفيذ، ولا يمكن تشغيلها عن طريق كتابتها في ملف والنقر عليها. بالنسبة لمصفوفة تحتوي على صورة مضغوطة، نحتاج إلى ناقل (محمل)، وهو ملف صغير جدًا قابل للتنفيذ نرفق به مصفوفتنا والذي سيؤدي إلى فك ضغطه وتشغيله. نكتب الوسائط ونجمعها ثم نضيف المفكرة المضغوطة إلى نهايتها. وفقًا لذلك، إذا تم إطلاق الملف الذي تم الحصول عليه نتيجة لجميع الإجراءات (حجمه أكبر قليلاً من حجم المفكرة المضغوطة ببساطة)، فستجد الصورة المعبأة، وتفك ضغطها، وتحلل هيكلها وتطلقها.

كما ترون، يتعين علينا أتمتة عملية ليست معقدة للغاية. تحتاج فقط إلى كتابة برنامجين، محمل، وفي الواقع، باكر.

خوارزمية تشغيل الباكر:

  • قراءة ملف PE في الصفيف؛
  • ضغط المصفوفة باستخدام بعض خوارزميات الضغط بدون فقدان البيانات؛
  • وفقًا لتنسيق PE، قم بإضافة المصفوفة المضغوطة إلى قالب المُحمل.

خوارزمية تشغيل اللودر:

  • ابحث في النهاية عن مصفوفة تحتوي على ملف PE مضغوط؛
  • إفتحه؛
  • قم بتحليل رؤوس ملف PE، وقم بتعيين جميع الحقوق، وتخصيص الذاكرة، ثم قم بتشغيله أخيرًا.

لنبدأ التطوير باستخدام المُحمل، لأن هذا هو ما سيتعامل معه المُعبئ لاحقًا.

محمل

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

ابحث عن صورة مضغوطة في القسم الأخير // احصل على عنوان بداية رأس PE المُحمل في الذاكرة HMODULE hModule = GetModuleHandle(NULL); PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; PIMAGE_NT_HEADERS pNTHeaders = MakePtr(PIMAGE_NT_HEADERS,hModule,pDosHeader->e_lfanew); PIMAGE_SECTION_HEADER pSections = IMAGE_FIRST_SECTION(pNTHeaders); // الهيكل الذي يصف القسم الأخير من أداة التحميل لدينا PIMAGE_SECTION_HEADER pLastSection = // في الواقع، الصورة التي تم العثور عليها LPBYTE pbPackedImage = MakePtr(LPBYTE, hModule, pLastSection->VirtualAddress); // حجمه هو DWORD dwPackedImageSize = pLastSection->SizeOfRawData;

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

LPBYTE pbPackedImage = (LPBYTE) 0xDEADBEEF; DWORD dwPackedImageSize = 0xBEEFCACE;

عندما يقوم القائم بالتعبئة بزرع مصفوفة بصورة مضغوطة في المُحمل، فسوف يمر بعملية بحث عن التوقيع عبر جسم المُحمل ويستبدل 0xDEADBEEF بعنوان المصفوفة، و0xBEEFCACE بحجمه.

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

الخيار الجيد هو استخدام aplib، وهي مكتبة صغيرة تحتوي على تعليمات برمجية أنيقة ومضغوطة للغاية تنفذ الضغط استنادًا إلى خوارزمية Lempel-Ziv (LZ). ومن المؤكد أننا سنختاره في أي يوم آخر، ولكننا اليوم في مزاج يسمح بحل أبسط وأكثر إحكاما - الوظائف المضمنة في Windows!

بدءًا من نظام التشغيل XP، بدأ ملف ntdll.dll المحبوب لدينا في تصدير وظيفتين رائعتين:

NTSTATUS RtlCompressBuffer(__ في USHORT CompressionFormatAndEngine، __ في PUCHAR UncompressedBuffer، __ في ULONG UncompressedBufferSize، __ خارج PUCHAR CompressedBuffer، __ في ULONG CompressedBufferSize، __ في ULONG UncompressedChunkSize، __ خارج PULONG FinalCompressedSize، __ في PVOID WorkSpace)؛ NTSTATUS RtlDecompressBuffer(__ في تنسيق ضغط USHORT، __ خارج PUCHAR UncompressedBuffer، __ في ULONG UncompressedBufferSize، __ في PUCHAR CompressedBuffer، __ في ULONG CompressedBufferSize، __ خارج PULONG FinalUncompressedSize)؛

أسمائهم تتحدث عن نفسها - وظيفة واحدة للضغط والأخرى لتخفيف الضغط. بالطبع، إذا كنا نطور منتجًا جادًا حقًا، فلن نتطرق إلى هذه الوظائف، لأنه لا تزال هناك أجهزة كمبيوتر تعمل بنظام التشغيل Windows 2000، وحتى مع NT 4.0، 😉 لكن RtlCompressBuffer\RtlDecompressBuffer مناسبة تمامًا لأغراضنا المتواضعة.

لا تحتوي رؤوس Platform SDK على هذه الوظائف، ولا يمكننا ربطها بشكل ثابت، لذلك سيتعين علينا استخدام GetProcAddress:

تحديد عنوان وظيفة التفريغ // وصفنا المتغير RtlDecompressBuffer من نوع الدالة بستة معلمات DWORD (__stdcall *RtlDecompressBuffer)(ULONG,PVOID,ULONG,PVOID,ULONG,PULONG); // قم بتعيين عنوان RtlDecompressBuffer في ntdll.dll (FARPROC&)RtlDecompressBuffer = GetProcAddress(LoadLibrary("ntdll.dll"), "RtlDecompressBuffer");

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

DWORD dwImageSize = 0; DWORD dwImageTempSize = dwPackedImageSize * 15; // تخصيص الذاكرة للصورة غير المعبأة LPVOID pbImage = VirtualAlloc(NULL, dwImageTempSize, MEM_COMMIT, PAGE_READWRITE); // فك ضغط RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, pbImage, dwImageTempSize, pbPackedImage, dwPackedImageSize, &dwImageSize);

تعني المعلمة COMPRESSION_FORMAT_LZNT1 أننا نريد استخدام ضغط LZ الكلاسيكي. يمكن أيضًا ضغط الوظيفة باستخدام خوارزميات أخرى، لكن هذا يكفي بالنسبة لنا.

الآن لدينا صورة أولية لملف PE في الذاكرة (pbImage). لبدء تشغيله، تحتاج إلى تنفيذ عدد من عمليات التلاعب التي يتم إجراؤها عادةً بواسطة أداة تحميل التشغيل Windows PE الأصلية. سنقوم بتضييق القائمة إلى الأكثر أهمية:

  1. ضع بداية الصورة (الرؤوس) على العنوان المحدد في حقل قاعدة الصورة للرأس الاختياري (OPTIONAL_HEADER).
  2. ضع أقسام ملف PE في العناوين المحددة في جدول الأقسام.
  3. قم بتحليل جدول الاستيراد، وابحث عن جميع عناوين الوظائف وأدخلها في الخلايا المقابلة.

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

إذا كنت تريد فجأة توافقًا جادًا، فإما أن تكتب محمل PE رائعًا بنفسك، أو تجد التنفيذ الأكثر اكتمالًا له على الإنترنت - لقد كنت أنا وولف كسولين جدًا لكتابة أعمالنا الخاصة، واستخدمنا أعمال gr8 من hellknights، طرد كل ما لم نفهمه. 😉 حتى في شكلها المبسط، تبلغ وظيفة محمل PE مائة سطر، لا أقل، لذلك سنقدم هنا نموذجها الأولي فقط (الكود الكامل موجود على القرص):

HMODULE LoadExecutable (صورة LPBYTE، DWORD* AddressOfEntryPoint)

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

معلومات

بعد تنفيذ وظيفة LoadExecutable في المُحمل، سيكون من الجيد تحرير الذاكرة المخصصة للتفريغ - فلن نحتاج إليها بعد الآن.

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

على سبيل المثال، سيُرجع GetModuleHandle(NULL) قاعدة الصورة لوحدة المُحمل، وليس البرنامج الذي تم فك حزمته. سوف تقوم وظيفتا FindResource وLoadResource بالبحث في أداة التحميل الخاصة بنا، والتي لا تحتوي على أي موارد على الإطلاق. قد يكون هناك مواطن الخلل أكثر تحديدا. لمنع حدوث كل هذا، من الضروري تحديث المعلومات الموجودة في هياكل نظام العملية، إن أمكن، في كل مكان، واستبدال عناوين وحدة التحميل بعناوين الوحدة المحملة.

أولا وقبل كل شيء، تحتاج إلى إصلاح PEB (كتلة بيئة العملية)، التي تحتوي على قاعدة الصور القديمة. من السهل جدًا الحصول على عنوان PEB في وضع المستخدم، فهو موجود دائمًا عند الإزاحة 0x30 في مقطع FS.

ببيب بيب؛ __asm ​​​​( Push eax mov eax, FS:; mov Peb, eax pop eax ) // hModule - عنوان ملف PE الذي قمنا بفك ضغطه وتحميله Peb->ImageBaseAddress = hModule;

لن يضر أيضًا إصلاح قوائم الوحدات النمطية في بنية LDR_DATA المشار إليها بواسطة PEB. هناك ثلاث قوائم في المجموع:

  • InLoadOrderModuleList- قائمة الوحدات في ترتيب التحميل؛
  • InMemoryOrderModuleList- قائمة الوحدات حسب موقعها في الذاكرة؛
  • InInitializationOrderModuleList- قائمة الوحدات بترتيب التهيئة.

نحتاج إلى العثور على عنوان المُحمل الخاص بنا في كل قائمة واستبداله بعنوان الوحدة المحملة. شيء من هذا القبيل:

// يتم تحميل الوحدة الخاصة بنا أولاً، لذلك // لا يتعين علينا مراجعة القائمة بأكملها PLDR_DATA_TABLE_ENTRY pLdrEntry = (PLDR_DATA_TABLE_ENTRY) (Peb->Ldr->ModuleListLoadOrder.Flink); pLdrEntry->DllBase = hModule; ...

يمكنك الآن الاتصال بأمان بنقطة دخول الوحدة المحملة. وسوف يعمل كما لو تم استدعاؤه بالطريقة الأكثر عادية.

إدخال LPVOID = (LPVOID)((DWORD)hModule + AddressOfEntryPoint); __asm ​​إدخال المكالمة؛

AddressOfEntryPoint هو العنوان الظاهري النسبي (RVA) لنقطة الإدخال، المأخوذ من الرأس الاختياري في الدالة LoadExecutable. للحصول على العنوان المطلق، أضفنا ببساطة عنوان القاعدة (أي الوحدة المحملة حديثًا) إلى RVA.

تقليل حجم محمل الإقلاع

إذا تم تجميع وتجميع المُحمل الخاص بنا في VS 2010 باستخدام العلامات الافتراضية، فلن نحصل على برنامج ناقل بسعة 2 كيلو بايت، بل سنحصل على وحش يزيد حجمه عن 10 كيلو بايت. سيقوم الاستوديو ببناء مجموعة كاملة من الأشياء غير الضرورية، وعلينا التخلص منها بالكامل.

لذلك، في خصائص التحويل البرمجي لمشروع المُحمل (علامة التبويب C/C++) نقوم بما يلي:

  • في قسم "التحسين"، حدد "الحد الأدنى للحجم (/O1)" بحيث يحاول المترجم جعل جميع الوظائف أكثر إحكاما.
  • هناك نشير أيضًا إلى أولوية الحجم على السرعة (علامة /Os).
  • في قسم "إنشاء التعليمات البرمجية"، نقوم بإيقاف تشغيل استثناءات C++، ولا نستخدمها.
  • لا نحتاج أيضًا إلى التحقق من تجاوز سعة المخزن المؤقت (/GS-). وهذا أمر جيد، ولكن ليس في حالتنا.

في خصائص الرابط (الرابط):

  • دعونا نطفئ الجحيم البيان. إنه كبير الحجم، وبسببه يتم إنشاء قسم .rsrc في أداة تحميل التشغيل، وهو ما لا نحتاج إليه على الإطلاق. بشكل عام، كل قسم إضافي في ملف PE يبلغ على الأقل 512 بايت غير ضرورية على الإطلاق، وذلك بفضل المحاذاة.
  • تعطيل إنشاء معلومات التصحيح.
  • دعنا ننتقل إلى علامة التبويب "خيارات متقدمة". قم بإيقاف تشغيل "تقديم العشوائية إلى العنوان الأساسي" (/DYNAMICBASE:NO)، وإلا فسيقوم الرابط بإنشاء قسم إعادة تحديد (.reloc).
  • حدد العنوان الأساسي. دعنا نختار رقمًا أعلى غير قياسي، على سبيل المثال 0x02000000. هذه هي القيمة التي سيرجعها GetModuleHandle(NULL) في أداة التحميل. يمكنك حتى ترميزها.
  • نشير إلى نقطة الدخول الخاصة بنا، وليس نقطة CRT: /ENTRY:WinMain. بشكل عام، اعتدنا على القيام بذلك باستخدام توجيه براغما مباشرة من الكود، ولكن بما أننا وصلنا إلى الخصائص، يمكننا القيام بذلك هنا.

نقوم بضبط الإعدادات المتبقية للرابط مباشرة من الكود:

#pragma comment(linker,"/MERGE:.rdata=.text")

لقد قمنا هنا بدمج قسم .rdata، الذي يحتوي على بيانات للقراءة فقط (الصفوف، جدول الاستيراد، وما إلى ذلك)، مع قسم كود النص. إذا كنا نستخدم المتغيرات العامة، فسنحتاج أيضًا إلى دمج قسم .data مع الكود.

#pragma comment(linker,"/MERGE:.data=.text") // البيانات من .data تتطلب الوصول للكتابة، // وليس مجرد الوصول للقراءة والتنفيذ #pragma comment(linker,"/SECTION:.text ,EWR ")

كل ما سبق يكفي للحصول على محمل بحجم 1.5 كيلو بايت.

تحويله إلى التشفير

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

يمكن أيضًا جعل المفتاح يعتمد على بعض الوظائف أو الهياكل غير المحاكية. نحن فقط بحاجة للعثور عليهم.

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

باكر

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

HANDLE hFile = CreateFile(argv, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DWORD dwImageSize = GetFileSize(hFile, 0); LPBYTE lpImage = new BYTE, lpCompressedImage = new BYTE; DWORD dwReaded؛ ReadFile(hFile, lpImage, dwImageSize, &dwReaded, 0); CloseHandle(hFile);

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

تنسيق DWORD = COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_STANDARD؛ DWORD dwCompressedSize، dwBufferWsSize، dwFragmentWsSize؛ RtlGetCompressionWorkSpaceSize(format, &dwBufferWsSize, &dwFragmentWsSize); مساحة عمل LPBYTE = BYTE جديدة؛ RtlCompressBuffer(التنسيق، // نوع الضغط والمحرك lpImage، // مصفوفة الضغط dwImageSize، // حجمها lpCompressedImage، // المخزن المؤقت للنتيجة dwImageSize، // حجمها 4096، // حجم القطع، غير مهم &dwCompressedSize ، // مؤشر لكل ياردة لحجم نتيجة مساحة العمل)؛ // المخزن المؤقت للعمل

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

غير موقعة int Loader_size=1536; محمل الحرف غير الموقع = (0x4d,0x5a,0x00,0x00,0x01,0x00,0x00, ...

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


ستكون خوارزمية الإجراءات كما يلي:

  • نجد القسم الوحيد (.text) في أداة تحميل التشغيل.
  • نقوم بتغيير حجمه الفعلي، أي الحجم الموجود على القرص (SizeOfRawData). يجب أن يكون مساويًا لمجموع الحجم القديم وحجم الصورة المضغوطة وفي نفس الوقت محاذيًا وفقًا لمحاذاة الملف (FileAlignment).
  • نقوم بتغيير حجم الذاكرة الافتراضية (Misc.VirtualSize)، ونضيف إليها حجم الصورة المضغوطة.
  • نقوم بتغيير حجم صورة أداة تحميل التشغيل بالكامل (OptionalHeader.SizeOfImage) باستخدام الصيغة القديمة [الحجم الافتراضي للقسم الأخير] + [العنوان الافتراضي للقسم الأخير]، دون أن ننسى محاذاة القيمة بواسطة FileAlignment.
  • انسخ الصورة المضغوطة إلى نهاية القسم.

هناك خدعة صغيرة هنا. الحقيقة هي أن الاستوديو الخاص بنا يجعل الحجم الافتراضي (Misc.VirtualSize) لقسم الكود (.text) مساويًا لحجم الكود الحقيقي غير المحاذاة، أي أنه يشير إلى حجم أصغر من الحجم الفعلي. وهذا يعني أن هناك فرصة لحفظ ما يصل إلى 511 بايت.

أي أن هذه هي الطريقة التي نكتب بها البيانات بعد محاذاة مجموعة من الأصفار، ومعرفة الحيلة، يمكننا الكتابة فوق هذه الأصفار.


هذا ما ستبدو عليه جميع أفكارنا في الكود:

توسيع قسم الكود // أنشئ نسخة من صورة أداة التحميل الخاصة بنا بذاكرة أكبر PBYTE pbLoaderCopy = new BYTE; memcpy(pbLoaderCopy, (LPBYTE)&simple_packer, simple_packer_size); // تحديد رؤوسها PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)pbLoaderCopy; PIMAGE_NT_HEADERS nt = MakePtr(PIMAGE_NT_HEADERS, pbLoaderCopy, dos->e_lfanew); // قسم قابل للتوسيع PIMAGE_SECTION_HEADER text = IMAGE_FIRST_SECTION(nt); // انسخ الصورة المضغوطة إلى نهاية القسم الموجود أعلى الأصفار memcpy(&pbLoaderCopy, lpCompressedImage, dwCompressedSize); // إصلاح الحجم الفعلي، مع مراعاة الشريحة ذات Misc.VirtualSize text->SizeOfRawData = ALIGN(text->Misc.VirtualSize + dwCompressedSize, nt->OptionalHeader.FileAlignment); // إصلاح الحجم الظاهري (والحقيقي في الواقع) text->Misc.VirtualSize += dwCompressedSize; // إصلاح حجم الصورة nt->OptionalHeader.SizeOfImage = ALIGN(test->Misc.VirtualSize + test->VirtualAddress, nt->OptionalHeader.FileAlignment); // احسب حجم ملف DWORD الناتج dwNewFileSize = pSections->SizeOfRawData + test->PointerToRawData;

أوه، لقد نسينا تقريبًا استبدال تسميات 0xDEADBEEF و0xBEEFCACE المتبقية في أداة تحميل التشغيل بقيم حقيقية! نقوم بتغيير 0xBEEFCACE إلى حجم الصورة المضغوطة، و0xDEADBEEF إلى عنوانها المطلق. يتم حساب عنوان الصورة بالصيغة [عنوان الصورة] + [العنوان الافتراضي للقسم] + [إزاحة الصورة بالنسبة إلى بداية القسم]. تجدر الإشارة إلى أنه يجب إجراء الاستبدال قبل تحديث قيمة Misc.VirtualSize، وإلا فلن يعمل الملف الناتج.

البحث عن العلامات واستبدالها باستخدام حلقة بسيطة جدًا:

من أجل (int i = 0؛ i< simple_packer_size; i++) if (*(DWORD*)(&pbLoaderCopy[i]) == 0xBEEFCACE) *(DWORD*)(&pbLoaderCopy[i]) = dwCompressedSize; else if (*(DWORD*)(&pbLoaderCopy[i]) == 0xDEADBEEF) *(DWORD*)(&pbLoaderCopy[i]) = nt->OptionalHeader.ImageBase + text->VirtualAddress + text->Misc.VirtualSize;

هذا كل شيء، في الواقع. الآن لدينا ملف جاهز للاستخدام في الذاكرة؛ نحتاج فقط إلى حفظه على القرص باستخدام وظائف CreateFile/WriteFile.


الاستنتاجات

إذا قارنا كفاءة ضغط أداة التعبئة لدينا مع UPX باستخدام notepad.exe كمثال، فسنحصل على حوالي 1 كيلو بايت: 46,592 بايت بالنسبة لنا مقابل 48,128 بايت لـ UPX. ومع ذلك، باكر لدينا هو أبعد ما يكون عن الكمال. وهذا ملحوظ جدا. الحقيقة هي أننا تجاهلنا عمدًا شيئًا مهمًا مثل نقل الموارد. سوف يفقد الملف الناتج رمزه! سيتعين عليك تنفيذ الوظيفة المفقودة بنفسك. بفضل المعرفة المكتسبة من هذه المادة، لن تواجه أي صعوبات في هذا الشأن.

كوب386 3.4

أداة فك ضغط القراصنة المعروفة لملفات DOS COM/EXE أو المحمية بواسطة Sage/CyberWare (UCF). يسمح لك بفك ضغط البرامج المضغوطة/المشفرة حتى مع وجود أدوات مساعدة غير معروفة أو جديدة. إنه يعمل عبر سطر الأوامر ويحتوي على العديد من المعلمات (قدرات القراءة). يحتوي البرنامج على عدة أوضاع اختراق: الوضع الحقيقي خطوة بخطوة، وV86 خطوة بخطوة، ومضاهاة الوضع الحقيقي i80386. اعتمادًا على الوضع، يستخدم CUP386 طرق تصحيح مختلفة، ويتجاوز كود مكافحة التصحيح، وما إلى ذلك. بالمناسبة، يحتوي البرنامج أيضًا على مصحح أخطاء مرئي مدمج مثل Turbo Debugger للقرصنة "اليدوية". شخصياً، وجدت خيار “مازلت على قيد الحياة” أصلياً، وهو ما يجعل مؤشرات LED الموجودة على لوحة المفاتيح تومض أثناء التفريغ، مما يشير إلى أن البرنامج لم يتجمد بعد.

ftp://ftp.elf.stuba.sk/pub/pc/pack/ucfcup34.zip (60 كيلو بايت)

الانكماش 1.6

أداة Windows الأكثر تقدمًا والمصممة "لفك ضغط" ملفات EXE/DLL المضغوطة بواسطة برنامج Shrinker الشهير لحزم EXE (حتى الإصدار 3.4). يحتوي DeShrink على واجهة رسومية تتيح لك تحديد مسار وأسماء ملفات الإدخال/الإخراج بسهولة، وعرض رأس EXE، وحتى إزالة التشفير من الأقسام الفردية باستخدام طريقة القوة الغاشمة.

يمكن تنزيل البرنامج من موقع الويب ftp://ftp.elf.stuba.sk/pub/pc/pack/dshrnk16.zip (190 كيلو بايت)

إكسي سكان 3.21

تم تصميم أداة DOS المساعدة من STILLSON لتحديد أدوات الحزم والمرفقات (كثيرًا) التي تحمي ملفات EXE أو COM. بالإضافة إلى ذلك، يتيح لك ExeScan التعرف على المترجمين الأكثر شيوعًا.

يمكن للبرنامج (أو بالأحرى وحدتيه) العمل في عدة أوضاع: في الوضع البسيط (التعريف "الغبي")، في المسح العميق (يحاول اكتشاف الحماية/الضغط متعدد الطبقات، على سبيل المثال، عند ضغط ملف EXE باستخدام PKLite و محمي بواسطة برنامج CrackStop) وفي الكشف عن الوضع العام (اعتراض Int 21h، وتنفيذ الملف قيد التحقيق ومحاولة تحديد الكود).

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

ftp://ftp.elf.stuba.sk/pub/pc/pack/es321.zip (70 كيلو بايت)

محلل الملفات 1.6.x

محلل الملفات - هذا البرنامج قادر على تحديد كيفية تجميع الملف، وكيفية تعبئته، وترميزه، وتحصينه، وما إلى ذلك. يمكن لمحلل الملفات أيضًا عرض الأجزاء الداخلية من الأرشيفات وأرشيفات SFX (RAR وARJ وZIP وLZH وLHA وICE وZOO وSWG وDWC وSQZ وHYP وACE وCAB وPAC وStirling)، وتوفير معلومات حول ملفات الرسومات المختلفة (GIF /JPG /PCX/BMP/ICO/IFF) - الدقة وعدد الألوان وما إلى ذلك. يفهم تنسيقات EXE التالية: MZ/NE/LE/LX/LE/W3/P2/P3/DL/MP.
محلل الملفات قادر على عرض البيانات من جداول الكائنات NE/LE/LX/PE. هناك دعم للمكونات الإضافية الخارجية، وهو مترجم مدمج لقاعدة البيانات الخاصة به، تم إنشاؤه لزيادة الإنتاجية. في قاعدة البيانات، يمكنك استخدام أوامر الماكرو مثل "J1J1" - وهذا يعني أمر المجمع JMP/JMPS/CALL وما إلى ذلك، أي. من الممكن تحليل الملفات ذات التحولات المختلفة...

يشغل البرنامج مساحة صغيرة على القرص ويأتي مزودًا بوثائق جيدة باللغتين الروسية والإنجليزية.

يمكن تحميل البرنامج من الموقع http://www.world.lv/vnet (135 كيلو بايت)

معلومات الملف 2.49

أداة مساعدة جديدة من M.Hering، مصممة لتحديد أدوات الحزم والحماية (بما في ذلك الأحدث) التي تم استخدامها "لمعالجة" الملفات القابلة للتنفيذ. بالإضافة إلى ذلك، يتيح لك FileInfo التعرف على "عمل" المترجمين الأكثر شيوعًا وتنسيقات أرشيف SFX-EXE.

يمكن أن يعمل البرنامج في وضع عرض معلومات مختصرة عن الملفات الموجودة في الدليل (المجلدات) أو في وضع عرض معلومات مفصلة حول ملف معين. يوجد عارض HEX/TXT مدمج (مع القدرة على التنقل بسرعة إلى العناوين والبحث والتصفية)، ومحرر لرؤوس MZ/PE والمجاميع الاختبارية، ومحلل بايت رسومي أصلي.

يدعم أسماء الملفات الطويلة تحت Win9x.

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

يمكن تنزيل البرنامج من الموقع http://www.programmerstools.org/files/utilities/fi.zip (155 كيلو بايت)

NED 2.31 (مزيل الملفات القابلة للتنفيذ الجديد)

أداة مساعدة لسطر الأوامر من Snajder تسمح لك بفك ضغط ملفات NE القابلة للتنفيذ (NE-Visual Basic 3.0) المضغوطة باستخدام إصدارات الأداة المساعدة Shrinker 3.xx.

يمكن تحميل البرنامج من الموقع http://www.programmerstools.com/files/unpackers/ned.zip (8 كيلو بايت)

صغير الحجم 2.x مكبر 1.3

أداة مساعدة بسيطة لنظام التشغيل Windows من r!sc تتيح لك فك ضغط ملفات EXE/DLL المضغوطة باستخدام إصدارات Petite packer 2.1/2.2.

في الإصدار الجديد، تمت إعادة كتابة معالج سطر الأوامر (في بعض الأحيان لم يتم فتح الملفات تحت NT).

PE-UnCompact 1.5

تسمح لك أداة مساعدة صغيرة لنظام التشغيل Windows من tNO بفك ضغط ملفات EXE وDLL وSCR وOCX (؟) المضغوطة باستخدام إصدارات PECompact packer الشهيرة 1.24-1.30. لا يتم إجراء الضغط إذا لم يكن الملف المحدد مضغوطًا بواسطة PECompact. عند التفريغ، يستعيد البرنامج امتداد الملف، ويستورد الجداول، والأقسام، ويضبط الكود.

يضيف الإصدار الجديد دعمًا لـ PECompact 1.30 ويقوم بإجراء تغييرات داخلية.

يمكن تنزيل البرنامج من الموقع http://pleiku.vietmedia.com/protools/files/unpackers/tnopeunc.zip (15 كيلو بايت)

PMWUnLite 1.30

أداة صغيرة مصممة لتفريغ الملفات القابلة للتنفيذ في الوضع المحمي (نوع DOS/4GW) المضغوطة باستخدام الأداة المساعدة PMWLite من مجموعة PMODE/W.

يمكن تنزيل البرنامج من الموقع http://www.suddendischarge.com/cgi-bin/antileech.cgi?pmwun130.zip (38 كيلو بايت)

TEU 1.8x (أداة فك حزم الملفات التنفيذية)

أداة فك الحزم الشاملة للملفات القابلة للتنفيذ المحزومة أو المحمية بواسطة JVP. يتعرف TEU على البرامج التي تنتجها المترجمات الأكثر شيوعًا ويسمح لك بفك ضغط الملفات إذا كانت محمية/مضغوطة بواسطة أدوات مساعدة غير معروفة أو جديدة. بالإضافة إلى هذه الأدوات، تمتلك TEU العديد من أوضاع القرصنة الأصلية، حتى أنها تحمل علامة TM: DirectY وPassiveX. ومع ذلك، بسبب عدم وجود وثائق، لا أستطيع أن أقول أي شيء محدد عنهم.

تعمل الأداة المساعدة من سطر الأوامر ولها عدد n من المعلمات، والتي، كالعادة، لا يلزم استخدامها. أود أيضًا أن أشير إلى أن TEU يمكنها العمل جنبًا إلى جنب مع الأداة المساعدة.

يأتي البرنامج في نسختين: باللغة الإنجليزية (الحرف "e" في نهاية الإصدار) والألمانية ("d").

يمكن تحميل البرنامج من الموقع http://members.xoom.com/jvp/ (40 كيلو بايت)

ترون 1.30

أداة فك حزم عالمية أخرى للملفات القابلة للتنفيذ المعبأة أو المحمية بواسطة شركة Smilesoft. يعرف حوالي عشرين برنامجًا (من ComPack إلى Protect EXE/COM وWWPack)، دون احتساب إصداراتها العديدة. قد تحاول الأداة المساعدة تقليديًا فك ضغط الملفات المضغوطة/المحمية بواسطة برامج غير معروفة أو جديدة. صحيح، للقيام بذلك، يجب عليك أولاً التسجيل ودفع 25 دولارًا للبرنامج... عند الاختراق، يمكن أن يعمل TRON اختياريًا في وضع خاص "لرفض" المقاطعات، وكذلك في الوضع المحمي.

يشغل البرنامج مساحة صغيرة على القرص وهو موثق جيدًا؛ هناك الكثير من المعلومات المتاحة عن شركات التعبئة والتغليف/الحماة.

يمكن تنزيل البرنامج من موقع الويب ftp://ftp.elf.stuba.sk/pub/pc/pack/tron130.zip (40 كيلو بايت)

أونسباك 1.0.9.1

تسمح لك هذه الأداة المساعدة الصغيرة لنظام التشغيل Windows من BiWeiGuo بفك ضغط ملفات EXE وDLL المضغوطة بواسطة أداة ASPack الشهيرة حتى الإصدار 2.1. لن يتم إجراء الضغط إذا لم يكن الملف المحدد ASPacked (أو أن إصدار ASPack المستخدم للضغط غير معروف للأداة المساعدة).

عند التفريغ، يتم دائمًا إنشاء نسخة احتياطية من الملف.

يمكن تنزيل البرنامج من الموقع http://pleiku.vietmedia.com/protoools/files/unpackers/2unaspack.zip (73 كيلو بايت)

UNP 4.12ج

كان أداة فك الحزم العالمية ذات شعبية كبيرة، وإن كانت قديمة بعض الشيء (1995)، للملفات القابلة للتنفيذ المعبأة أو المحمية بواسطة DOS بواسطة Ben Castricum. يعرف كيفية تحديد وإزالة العديد من وسائل الحماية و"الحزم" (يعرف حوالي 50 اسمًا للبرامج، دون احتساب عمليات التخريب العديدة الخاصة بها). بالإضافة إلى ذلك، قد يحاول UNP فك ضغط الملفات المضغوطة/المحمية بواسطة أدوات مساعدة غير معروفة أو جديدة (على الرغم من أن هذه الميزة ليست بنفس قوة البرامج المتخصصة الأخرى الموضحة في هذه الصفحة).

يتيح لك UNP تحويل بعض ملفات EXE إلى COM والعكس، وإدراج الملفات في رؤوس البرامج، وتراكبات "التمزيق" و"الإرفاق"، والبحث عن الملفات المضغوطة في الدليل، وتحسين ملفات EXE للضغط اللاحق، و"محاذاة" رؤوس EXE لمزيد من التشغيل السريع، قم بإزالة المعلومات غير الضرورية منها، على سبيل المثال، تعليقات الرابط، وما إلى ذلك.

البرنامج موثق جيدًا ويشغل مساحة صغيرة تقليديًا. كما يقولون "البرنامج الذي يجب أن يكون" ...

يمكن تنزيل البرنامج من موقع الويب ftp://ftp.elf.stuba.sk/pub/pc/pack/unp412b.zip (بدون قفص الاتهام)
يمكن تنزيل النسخة الكاملة من موقع الويب ftp://ftp.elf.stuba.sk/pub/pc/pack/unp411.zip (40 كيلو بايت)

Un-Pack (محلل الملفات وأداة فك الحزم) 2.2

أداة DOS قوية جديدة من Snow Panther، مصممة لتحديد وإزالة المرفقات المختلفة وحزم COM/EXE تلقائيًا، إن أمكن. يقوم البرنامج بفك تشفير معظم تلك الملفات التي لا "يأخذها" X-TRACT. في بعض الأحيان، بعد إجراء بعض التغييرات بواسطة الأداة المساعدة المعنية، يمكن إجراء التفريغ باستخدام، والتي ستعلمك Un-Pack بها.

هناك وظائف لتحديد تاريخ/وقت الملفات، واقتطاعها، وتحليل ملفات PE (وظائف الاستيراد/التصدير)، والتفريغ (أداة فك الحزم العامة) لملفات COM، والكشف العام عن أنواع الحماية/الضغط غير المعروفة، ومحول EXE->COM ، معالج عمليات النقل، نقطة تفكيك الدخول "أ"، محلل إرشادي ...

يدعم البرنامج أسماء الملفات الطويلة (LFN) ويمكنه العمل مع أداة فك الحزم. كما أنه يتعرف أيضًا على جميع أنواع تنسيقات الملفات "الأيسر" عن طريق الامتداد ويستخدم "محركات" أدوات IDArc المساعدة، والتي أتاحت التعرف على حوالي 170 نوعًا من ملفات الأرشيف.

أضاف الإصدار الجديد التوقيعات لملفات MZ وNE وPE وتحسين تحويل EXE->COM ومحرك IDArc المحدث ودعم تفريغ الملفات المعدلة بواسطة tElock وASProtect وASPack وGFX2EXE وPE-Nightmare وغيرها؛ تم إصلاح العديد من الأخطاء...

يمكن تنزيل البرنامج من الموقع http://mud.sz.jsinfo.net/per/aaron/files/file-analyzers/unpack22.zip (800 كيلو بايت)

UnPECompact 1.31

أداة مساعدة صغيرة وبطيئة لنظام التشغيل Windows من Yoda تسمح لك بفك ضغط ملفات EXE المضغوطة بواسطة أداة تعبئة PECompact الشهيرة لأي إصدار تقريبًا (0.9-1.43). لا يتم تنفيذ عملية التفريغ إذا لم يكن الملف المحدد مضغوطًا باستخدام PECompact. من الممكن التحكم من سطر الأوامر.

الأداة المساعدة عادة لا تعمل تحت WIN2K.

يضيف الإصدار الجديد دعمًا لإصدارات إضافية من PECompact، وقد ظهر خيار فرض الاستعادة الكاملة لجدول الاستيراد.

http://y0da.cjb.net (70 كيلو بايت)

UnPEPack 1.0

أداة مساعدة صغيرة لنظام Windows من M.o.D تسمح لك بفك ضغط الملفات القابلة للتنفيذ المضغوطة باستخدام أداة PEPack. لا يعمل تحت WIN2K.

يمكن تنزيل البرنامج مع المصادر من الموقع http://pleiku.vietmedia.com/protoools/files/unpackers/unpepack.zip (135 كيلو بايت)

أنشرينكر 1.0

هذه الأداة المساعدة لسطر الأوامر مخصصة لأولئك الأشخاص الذين يحتاجون فجأة إلى الحصول على ملف مضغوط

يُفهم التغليف (الضغط والضغط) على أنه إعادة ترميز البيانات، مما يجعل من الممكن تقليل مقدار الذاكرة المطلوبة لتخزينها مقارنة بالذاكرة الأصلية.

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

ضغط المعلوماتهي عملية تحويل المعلومات المخزنة في ملف إلى نموذج يقلل من التكرار في عرضه، وبالتالي يتطلب ذاكرة أقل للتخزين.

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

يمكن تحديث الأرشيفات التي تم إنشاؤها وإضافة الملفات إليها وحذف الملفات من الأرشيف والتحقق من سلامة الأرشيف. إذا لزم الأمر، يمكن إزالة الملفات من الأرشيف - بفك ضغطها.

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

أرشفة (تغليف)– وضع (تنزيل) الملفات المصدر في ملف أرشيفي بشكل مضغوط أو غير مضغوط.

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

تسمى البرامج التي تقوم بحزم وفك ضغط الملفات برامج الأرشفة.

يستخدم مستخدمو الكمبيوتر الشخصي على نطاق واسع العديد من برامج الأرشفة لضغط الملفات.

مزايا المحفوظات:

    تسمح لك بضغط ما بين 22% إلى 90% من المعلومات؛

    السماح لك بتحديث البرنامج، ويقوم برنامج الأرشفة نفسه بمراقبة عملية التحديث؛

    تسمح لك بإنشاء أرشيفات ذاتية الاستخراج؛

    تتيح لك احتواء مجموعة من الملفات المتشابهة في ملف واحد.

    دعم الأرشفة المستمرة، حيث يمكن أن تكون نسبة الضغط أكبر بنسبة 10 - 50% من طرق الضغط التقليدية، خاصة عند تعبئة عدد كبير من الملفات الصغيرة المشابهة؛

    دعم المحفوظات متعددة المجلدات؛

    إنشاء أرشيفات عادية ومتعددة المجلدات ذاتية الاستخراج (SFX) باستخدام وحدات SFX القياسية أو الإضافية؛

    استعادة المحفوظات المتضررة جسديا؛

    وظائف إضافية أخرى، مثل التشفير، وإضافة تعليقات الأرشيف (مع دعم تسلسلات ANSI ESC)، وتسجيل الأخطاء، وما إلى ذلك.

أيحتوي الأرشيف على جدول محتويات يحتوي على المعلومات التالية:

    اسم الملف،

    تاريخ ووقت الإنشاء أو التعديل،

    حجم الملف قبل وبعد الأرشفة،

    نسبة الضغط،

    رمز التحكم الدوري لكل ملف (المجموع الاختباري)

هناك الكثير من أدوات الأرشيف: ARJ، RAR، ZIP، CAB، LZH، GIF، TIF، PCX...

يمكن أن تكون ملفات الأرشيف مستمرة، ومتعددة المجلدات، وذاتية الاستخراج.

مستمر الأرشيف هو أرشيف معبأ بطريقة خاصة حيث يتم التعامل مع كافة الملفات المضغوطة كتدفق بيانات متسلسل واحد.

توم - هذه أجزاء من الأرشيف تتكون من عدة أجزاء. وحدات التخزين مدعومة فقط بتنسيق RAR، ولا يمكنك إنشاء وحدات تخزين ZIP. عادةً ما يتم استخدام وحدات التخزين لتخزين أرشيف كبير على عدة أقراص مرنة أو وسائط أخرى قابلة للإزالة.

استخراج ذاتي أرشيف (SFX، من اللغة الإنجليزية SelF-eXtracting) هو أرشيف مرفق به وحدة قابلة للتنفيذ. تسمح لك هذه الوحدة باستخراج الملفات ببساطة عن طريق تشغيل الأرشيف كبرنامج عادي. وبالتالي، ليست هناك حاجة إلى برامج خارجية إضافية لاستخراج محتويات أرشيف SFX. عادةً ما تحتوي أرشيفات SFX، مثل أي ملفات أخرى قابلة للتنفيذ، على الامتداد .EXE.

ملف أرشيف ذاتي الاستخراجهي وحدة قابلة للتمهيد والتنفيذ وقادرة على فك ضغط الملفات الموجودة فيها بشكل مستقل دون استخدام برنامج أرشيفي

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

تعتمد درجة ضغط المعلومات على نوع الملف، بالإضافة إلى طريقة التغليف المختارة. تتميز درجة (جودة) ضغط الملف بنسبة الضغط Kc، والتي يتم تعريفها على أنها نسبة حجم الملف المضغوط Vc إلى حجم الملف الأصلي Vo، ويتم التعبير عنها كنسبة مئوية: Kc=.

كلما كانت قيمة CS أصغر، زادت درجة ضغط المعلومات.

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

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

إذا كان ضغط البيانات يغير بنيتها فقط، فإن طريقة الضغط تفريغمن التعليمات البرمجية الناتجة، يمكنك استعادة المصفوفة الأصلية عن طريق تطبيق الطريقة العكسية. يتم استخدام الطرق العكسية لضغط أي نوع من البيانات.

هناك الكثير من طرق ضغط البيانات القابلة للعكس، ولكنها تعتمد على عدد صغير نسبيًا من الخوارزميات النظرية.

يقوم جهازنا المضغوط بضغط ملف notepad.exe بشكل أكثر إحكامًا من UPX!

تحويله إلى التشفير

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