تحرير المكتبة في محرر Hex مع الحفاظ على سلامتها

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

  •  02-10-2019
  •  | 
  •  

سؤال

أحاول تحرير مكتبة في محرر Hex ، وضع إدراج. النقطة الرئيسية هي إعادة تسمية بعض الإدخالات فيه. إذا قمت به في وضع "otherwrite" ، فكل شيء يعمل بشكل جيد ، لكن في كل مرة أحاول إضافة بعض الرموز إلى نهاية السلسلة في وضع "إدراج" ، تفشل المكتبة في التحميل. أي شيء أفتقده هنا؟

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

المحلول

نعم ، أنت في عداد المفقودين. مكتبة تتبع PE/covp التنسيق ، وهو ثقيل جدا على المؤشرات في جميع أنحاء الملف. (على سبيل المثال ، في بداية الملف هو جدول يشير إلى مواقع كل قسم في الملف).

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

إحدى التقنيات للتغلب على هذا "كهف رمز" ، حيث تستبدل قطعة من الكود الحالي بتعليمات JMP صريحة إلى موقع فارغ (يمكنك القيام بذلك في وقت التشغيل ، حيث لديك القدرة على إنشاء ذاكرة جديدة) - حيث يمكنك تحديد بعض التعليمات البرمجية الجديدة التي يمكن أن تكون ذات طول تعسفي - ثم يمكنك العودة صراحة إلى المكان الذي اتصلت به من (+5 بايت قل لـ JMP Opcode + Operand).

نصائح أخرى

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

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

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

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

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

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

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

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