سؤال

لقد كتبت برنامجا "خطيرا" في C ++ الذي يقفز ذهابا وإيابا من إطار مكدس واحد إلى آخر. الهدف هو القفز من أدنى مستوى من مكدس المكالمات إلى المتصل، قم بعمل شيء ما، ثم القفز مرة أخرى مرة أخرى، في كل مرة تخطي جميع المكالمات بينها.

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

الآن أنا أخذ نفس البرنامج وإعادة كتابةه في ج، ولا يعمل. على وجه التحديد، لا يعمل مع GCC V4.0.1 (Mac OS). بمجرد الانتقال إلى إطار المكدس الجديد (مع تعيين مؤشر قاعدة المكدس بشكل صحيح)، تنفذ التعليمات التالية، كونها قبل مكالمة فقط fprintf. وبعد التعليمة الأخيرة المدرجة هنا تعطل، إلغاء القيادة NULL:

lea    0x18b8(%ebx), %eax
mov    (%eax), %eax
mov    (%eax), %eax

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

ما هو رمز موقف مستقل؟ كيف يعمل رمز المستوى المستقل؟ إلى ما هو هذا السجل يشير؟

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

المحلول

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

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

أخيرا، تستخدم المخططات الأخرى الترامبولينات المختلفة التي تتصل بالإزاحة النسبية المعروفة. تحتوي الإزاحة النسبية على رمز و / أو بيانات يتم تحديثها بواسطة محمل.

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

نصائح أخرى

EBX يشير إلى جدول إزاحة العالم. يرى هذا المرجع حول الموافقة المسبقة عن علم على i386. وبعد يشرح الرابط ما هو الموافقة المسبقة عن علم هو كيف EBX يستخدم.

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