سؤال

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

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

المحلول

على افتراض أنني أفهم السؤال ، ربما سيبدأ هذا. القفزات النسبية تعتمد على الكمبيوتر.

d: eb 04 jmp 13 

0xEB هو الرمز البسيط للقفز النسبي على أساس 8 بت فوري. عنوان التعليمات موجود في إخراج OBJDump ، في هذه الحالة D أو 0xD. إنها تعليمة بايتان (x86 هو طول متغير). إنه يخبرك في الإخراج ما هو عنوان الوجهة ، في هذه الحالة JMP 13. لذا البحث عن الخط في إخراج OBJDump الذي يبدأ بـ 13 والقولون هو بداية هذا الجزء التالي من التعليمات البرمجية.

لفهم كيفية حساب هذا العنوان. يكون الكمبيوتر الشخصي عند 0xD عندما يبدأ في جلب التعليمات ، ويستغرق ذلك بايت ، بحيث يكون الكمبيوتر عند 0xD+2 = 0xF عندما يكون جاهزًا لتنفيذ هذه التعليمات. الإزاحة هي 0x4 So 0xf+0x4 = 0x13 عنوان الوجهة.

20: 75 ed jne f

الشيء نفسه ينطبق على الوراء. PC Plus عدد Bytes = 0x20+2 = 0x22. 0xed هو رقم موقّع وهو سلبي ، لذا فإن علامة تمتد إلى 0xfffffff ... ffffed ، مهما كان سجل العناوين الخاص بك. إضافة 0x22+0xffffff ... fffed وستحصل على 0x0f عنوان الوجهة. يمكنك أيضًا أخذ 0xed ، والعكس وإضافة 1 لإنكاره. ~ 0xed = 0x12 ، 0x12+1 = 0x13. لذلك 0xed يعني طرح 0x13. 0x22-0x13 = 0x0f.

فيما يلي المزيد ، في كل حالة ، يمنحك العنوان المستهدف الذي يمكنك البحث عنه فقط في إخراج OBJDump.

لفهم كيفية حساب هذه القيمة. نفس القصة ، ابدأ بـ OPCODE على 0x400A81 ، يستغرق 6 بايت في هذه الحالة لتعليم الطول المتغير. لذلك بحلول الوقت الذي تكون فيه مستعدًا لتنفيذ الكمبيوتر ، يكون الكمبيوتر 0x400A81+6 = 0x400A87. الإزاحة هي 0x107 ، لذا إذا تم استيفاء الشرط ، فإن عنوان الوجهة هو 0x400a87 + 0x107 = 0x400b8e.

لاحظ أن هذه هي عبارة عن مجموعة من الأمثلة المعزولة.

  400a81:   0f 8f 07 01 00 00       jg     400b8e 
  400a8f:   0f 8f e6 00 00 00       jg     400b7b 
  400a9d:   0f 8f c5 00 00 00       jg     400b68 
  400aab:   0f 8f a4 00 00 00       jg     400b55 
  400ab9:   0f 8f 83 00 00 00       jg     400b42 
  401d76:   0f 8f 31 01 00 00       jg     401ead 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top