سؤال

هل من الممكن استخدام أدوات GNU (دول مجلس التعاون الخليجي، Binutils، إلخ) لتعديل جميع تكرارات تعليمات التجميع في NO-OP؟ على وجه التحديد، يقوم دول مجلس التعاون الخليجي مع خيار -pg بإنشاء التجميع التالي (ARM):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

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

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

يمكن ل Linux Kernel أن تفعل شيئا مشابها لهذا وقت التشغيل، لكنني أبحث عن حل وقت البناء.

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

المحلول

سيكون هذا بالتأكيد أسهل من خلال تنسيق تعليمات الطول الثابت RISC-ISH أكثر من X86.

يجب أن تكون واضحة نسبيا لاستخدام Libelel (تعليمي لطيف هنا: http://people.freebsd.org/~jkoshy/download/libelf/article.html) أو libbfd (http://sourceware.org/binutils/docs-2.19/bfd/index.html.) لفتح ملف الكائنات، تعديل التعليمات داخل قسم .Text، واكتبها مرة أخرى باستخدام واجهات برمجة التطبيقات المقدمة. سواء كان الأمر يستحق الجهد أو عدم الاعتماد على الاعتبارات غير الفنية (أنا فضولي بعض الشيء ...).

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

نصائح أخرى

يمكنك ترجمة التعليمات البرمجية gcc -S لإخراج قائمة المجمع، بدلا من الترجمة بالكامل في ملف كائن أو قابل للتنفيذ. بعد ذلك، فقط استبدل الإرشادات المطلوبة مع عدم العمليات (مثل استخدام sed)، ومواصلة تجميع من هناك.

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

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