[تمرين] حللني ان استطعت 4 - نسخة قابلة للطباعة +- الفريق العربي للهندسة العكسية (https://www.at4re.net/f) +-- قسم : منتديات البرمجة - Programming Forums (https://www.at4re.net/f/forum-5.html) +--- قسم : قسم البرمجة العام - General Programming Section (https://www.at4re.net/f/forum-15.html) +--- الموضوع : [تمرين] حللني ان استطعت 4 (/thread-2856.html) |
[تمرين] حللني ان استطعت 4 - overlap - 10-09-2021 اتباعا لفكرة قسم التحديات، اضع امامكم بنفس المبدأ تحدي برمجي... تمرين "حللني ان استطعت 4" هو عبارة عن تطبيق يقوم بانجاز مهمة بسيطة. المطلوب: - تحليله و فهم ما يقوم به. - تحديد لغة البرمجة التي كتب بها و الأدوات التي تم استعمالها. - ان امكن، بناء تطبيق مماثل و قريب جدا من حجم التطبيق الأصلي. ملاحظة: المشاركة في محاولة حل التمرين مفتوحة، يمكنكم طرح الاستسفارات و كل الأعضاء يمكنهم الاجابة بدون تقييدات...
RE: [تمرين] حللني ان استطعت 4 - siddigss - 13-09-2021 شكرا على تمارينك المستمرة، انشغلت قليلا الأيام الماضية. (10-09-2021, 03:17 PM)overlap كتب : - تحليله و فهم ما يقوم به. يبدو أن البرنامج يقوم بالتالي (10-09-2021, 03:17 PM)overlap كتب : - تحديد لغة البرمجة التي كتب بها و الأدوات التي تم استعمالها.لم أعرف بعد، يبدو أن البرنامج قد جرد من أي دليل، فلا أقسام إضافية أو نصوص (strings) تعطي تلميحات إلى ال compiler، كذلك يبدو أنه تم تغيير قيم ال Major Linker Version و ال Minor Linker Version في ال Optional Header إلى 0. تعديل: يبدو أني تعجلت في كتابة التالي... فالاصطلاح محدد مسبقا للدالة في kernelbase.dll ولا يمكننا تغييره، أليس كذلك؟ لست متأكداً إذا كان هذا يفيد ولكن بالنظر لاستدعاء الدالة CreateEventA فاستدعاؤها يتبع ال Microsoft x64 convension ولكني لست متأكدا إذا كانت جميع ال compilers تتبع نفس الاصطلاح عند بناء البرامج ل Windows x64 أو إذا كان من الممكن تغيير اصطلاح الاستدعاء كما في x86. RE: [تمرين] حللني ان استطعت 4 - siddigss - 14-09-2021 مرفق نسخة 32-bit من البرنامج بنفس حجم البرماج الأصلي.
ال compiler المستعمل هو Visual Studio. أوامر ال linker التي ساعدت على تقليص حجم الملف من 9KB إلى 656 Bytes بعضها قد يكون لا داعي له ، الموضوع مفتوح للتجربة عموما. بالطبع استعنت بموقع مايكروسوفت حيث يمكن البحث في الشريط الأيسر.من الغريب أن الأمر EMITPOGOPHASEINFO غير موجود على الموقع، وجدته هنا. لإنقاص الحجم إلى 592 Bytes قمت يدوياً بالتالي. وجدت أن ال DOS Header ينتهي عن 0x40 وال NT Headers تبدأ عند 0xB8، وما بينهما توجد الرسالة "This program cannot be run in DOS mode" وأشياء أخرى لم أهتم بها. يمكننا بدء ال NT Headers من 0x80، فنزيل الرسالة التي ذكرناها وأكثير منها قليلا. بعد فعل هذا علينا تعديل البايت رقم 0x3c لتكون قيمته 0x80. ثم نفتح هذه السنخة المعدلة في CFF Explorer ومن هنا يتوجب علينا إصلاح عناوين الأقسام والاستيرادات. كتابة العملية متعبة وكن ملخصها كالتالي: استعملت برنامج CFF Explorer 1- في ال optional header نعدل AddressOfEntryPoint BaseOfCode SizeOfHeaders 2- في ال Data Directories نعدل Import Directory RVA Exception Directory RVA (لا يبدو مهما) Import Address Table Directory RVA 3- في ال section Headers نعدل Raw Address لكل قسم Virtual Address لكل قسم ثم يتوجب علينا إصلاح عناوين الدوال المستوردة، بشكل عام في هذا البرنامج الصغير في قسم .rdata غير أي بايتين على الشكل
طريقة التعديل على جميع ما سبق ببساطة طرح حجم ما حذفناه، وهو 0x78. على سبيل المثال إذا كانت قيمة إحدى القيم 0x220 فبعد الطرح تصبح 0x1A8، وبالنسبة للبايتين كمثال
ملاحظة: أثناء عملية تعديلي حذفت 8 بايتات أخرى لأتبع محاذاة البرنامج (0x10)، يمكنك من البداية أن تبدأ ال NT Headers من 0x88 لتجنب هذا واتباع نفس الخطوات. RE: [تمرين] حللني ان استطعت 4 - overlap - 14-09-2021 رائع جدا اخي... انت على الطريق الصحيح... (14-09-2021, 08:02 AM)siddigss كتب : مرفق نسخة 32-bit من البرنامج بنفس حجم البرماج الأصلي.التطبيق الأصلي 64 بت... جرب اخي طريقنك في بناء تطبيق 64 بت و حاول الوصول الى نفس حجم التطبيق الأصلي... (14-09-2021, 08:02 AM)siddigss كتب : من الغريب أن الأمر EMITPOGOPHASEINFO غير موجود على الموقع، وجدته هنابسبب انها غير موثقة... (14-09-2021, 08:02 AM)siddigss كتب : لإنقاص الحجم إلى 592 Bytes قمت يدوياً بالتالي.لترقية الحوار اكثر لم المس التطبيق يدويا و لا برمجيا اعتمدت على Compiler/Linker فقط (14-09-2021, 08:02 AM)siddigss كتب : ال compiler المستعمل هو Visual Studioهل تقصد cl.exe او ml64.exe) Hint) RE: [تمرين] حللني ان استطعت 4 - siddigss - 14-09-2021 كتبت مختصر العملية اليدوية وحذفت بعض استنتاجاتي غير الصحيحة كما يبدو لي الآن. (14-09-2021, 12:35 PM)overlap كتب : جرب اخي طريقنك في بناء تطبيق 64 بت و حاول الوصول الى نفس حجم التطبيق الأصلي...مرفق نسخة 64 بت بنفس الحجم الأصلي. إقتباس :لترقية الحوار اكثر لم المس التطبيق يدويا و لا برمجيا اعتمدت على Compiler/Linker فقطبدون اللمس أقصى ما استطعت فعله الآن هو 640 بايت، وذلك باستعمال حيث stub.exe ما هو إلا لم أستطع إزالة ال unwind tables الخاصة بال exceptions باستعمال MSVC.(14-09-2021, 12:35 PM)overlap كتب : هل تقصد cl.exe او ml64.exe) Hint) شكرا على التلميح! قصدت ال compiler الذي استعملته أنا RE: [تمرين] حللني ان استطعت 4 - overlap - 15-09-2021 (14-09-2021, 04:19 PM)siddigss كتب : مرفق نسخة 64 بت بنفس الحجم الأصلي.عمل جيد... (14-09-2021, 04:19 PM)siddigss كتب : بدون اللمس أقصى ما استطعت فعله الآن هو 640 بايت، وذلك باستعمالالتطبيق الأصلي مبني بــ ML64 و يحتوي هو ايضا على نفس الــ Stub المعدل... عند بنائه بنفس الاعدادات السابقة التي اتبعتها سوف ينقص حجمه... اوامره: (14-09-2021, 04:19 PM)siddigss كتب : لم أستطع إزالة ال unwind tables الخاصة بال exceptions باستعمال MSVC.ML64 لا يهتم باضافتها و منه يزيد صغر حجم التطبيق النهائي... بالمناسبة، الظاهر انك تستعمل اصدار Visual Studio 2017 ؟ RE: [تمرين] حللني ان استطعت 4 - siddigss - 15-09-2021 (15-09-2021, 04:10 PM)overlap كتب : التطبيق الأصلي مبني بــ ML64 و يحتوي هو ايضا على نفس الــ Stub المعدل... حاولت فعل هذا بعد تلميحك، ولكن أقصى ما وصلت له هو 640 بايت، ويبدو أن الفرق بين تطبيقك وتطبيقي هو القسم .idata. يرفض ml64 أن يدمجه مع أي قسم آخر! إذا أدمج القسم فالمفترض أن الحجم سينقص 40 بايت أن 600 بايت، ولكن إن كان فهمي صحيحا فشرط المحاذاة ALIGN:16 يجبر ال linker على إضافة 8 بايتات أخرى أي 608 بايت. هذه الزيادة بمقدار 16 بايت عن برنامجك بعد المقارنة تبين أن سببها استعمالي للأمر وطوله 10 بايتات بينما أنت استعملت بطول 7 بايتات. ويبدو أن هذا الفرق الطفيف جُعِل 16 بايت من قبل ال linker بسبب شرط المحاذاة، وبالفعل بعد تغيير الأمر نقص حجم البرنامج 16 بايت أي 624 بايت.(15-09-2021, 04:10 PM)overlap كتب : ML64 لا يهتم باضافتها و منه يزيد صغر حجم التطبيق النهائي...فعلا! بالمناسبة، هل قمت بتصفير ال rich signature وكذلك ال linker versions في ال optional headers بشكل يدوي؟ (15-09-2021, 04:10 PM)overlap كتب : بالمناسبة، الظاهر انك تستعمل اصدار Visual Studio 2017 ؟بالفعل، هذا ما أستخدمه، استنتجت هذا بسبب مشكلة ال exceptions الذي ذكرتها بالأعلى ؟ RE: [تمرين] حللني ان استطعت 4 - overlap - 18-09-2021 إقتباس :بايت عن برنامجك بعد المقارنة تبين أن سببها استعمالي للأمرفي المرفقات مثالين يعطينا نفس النتيجة (حجم البناء) سواء قبل او بعد تغيير الأمر lea الى mov التي يجعلها الكومبايلر movabs إقتباس :فعلا! بالمناسبة، هل قمت بتصفير ال rich signature وكذلك ال linker versions في ال optional headers بشكل يدوي؟نعم، تصفيرها يجعل بعض ادوات الكشف تفشل... لكن كما تعلم اخي ان هذا لا يؤثر على حجم الملف الناتج لانه مجرد تصفير لقيم بايتات موجودة.... إقتباس :Visual Studio 2017الكومبايلر و اللينكر المستعملان في بناء التمرين يخصان اصدار Visual Studio 2010 الفرق في الحجم تأثر بصفة مباشرة في اختيار (Compiler/Linker) من اصدار 2017 الى اصدار 2010 لانه حسب ما قرأته في مشاركاتك كل البراميترات التي مررتها هي نفسها التي استعملتها انا... |