ما هي الطريقة المناسبة لاستبدال أجزاء صغيرة جدًا من ملف ثنائي برمجيًا؟

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

سؤال

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

لكن المؤشرات إلى الوظائف المحفوظة في هذه الثنائيات ليست مستمرة من خلال الجلسات.

ماذا ستكون الطريقة الصحيحة لتغيير تلك الموجودة على الطيران؟ (بالنظر إلى أن لدى أحدهم التجميع والتجميع المتاح في التطبيق الرئيسي)

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

المحلول

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

نصائح أخرى

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

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

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...وهلم جرا.

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

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