يتيح لك هذا البرنامج الإضافي التجريبي Ghidra التعامل بسهولة مع محاكاة كود pcode الأصلي. لم تعد هناك حاجة إلى نصوص برمجية بعد الآن، فقط استخدمها مباشرة من غيدرا. يمكن أن يكون مفيدًا بشكل خاص للعمل مع مجموعة متنوعة من المعالجات الغريبة التي لا تدعمها المحاكيات الشائعة.
إذا كان المعالج/VM مدعومًا بواسطة Ghidra للهندسة العكسية، فيمكن محاكاته! على سبيل المثال، يتم توضيح محاكاة تعليمات eBPF أدناه:
في جوهر الأمر، البرنامج الإضافي عبارة عن غلاف ممتد حول الفئات الموجودة داخل الحزمة ghidra.app.emulator
. وهنا ما تم تنفيذه:
على الرغم من أن محاكاة PCode تتضمن التوحيد بشكل مثالي، إلا أن معظم المعالجات تحتاج إلى أسلوبها الخاص. لا تتردد في الإبلاغ عن أي مشاكل تواجهك. أرغب حقًا في اختبار جميع المعالجات، لكن هذا ليس ممكنًا.
يحتوي على جميع نوافذ البرنامج المساعد: عرض المكدس، والسجلات، وعرض نقاط التوقف، والنافذة الرئيسية.
يحتوي على مفاتيح التشغيل السريع لتعيين بداية ونهاية المحاكاة ونقاط التوقف وتطبيق البايتات المتغيرة على حالة المحاكي.
تغيير السجلات كما تريد. سيساعد تعيين سجل الارتباط (السهم الأخضر) المحاكي على فهم السجل الذي يحتوي على عنوان المرسل. يعرف البرنامج المساعد كيفية عمله من خلال سجلات المكدس، وسجل lr، وAARCH64، وMIPS. إذا كان لديك واحدة غريبة، حدد الرابط تسجيل واضغط على الزر.
عندما تفتح برنامجك في CodeBrowser، سيقوم GhidraEmu بتعيين مساحة المكدس تلقائيًا. سيتم تعيين مؤشر المكدس في منتصف نطاق المكدس. يسمح لك هذا بتعيين القيم في أعلى أو أسفل إطارات المكدس. قم بالتمرير إذا واجهت تجميدًا عند التحديث أو إعادة التعيين. أثناء عملية المحاكاة، إذا كان البرنامج يحتاج إلى مساحة أكبر للمكدس، فسيقوم البرنامج الإضافي بتخصيصها تلقائيًا.
إذا تغيرت أي بايتات أثناء المحاكاة، فسوف تراها في ByteViewer الكلاسيكي. لا تقلق، سيتم إعادة ضبطها إلى قيمها الأصلية بعد الضغط على زر "إعادة الضبط" .
إذا قمت بإجراء تغييرات، فأخبر المحاكي عن وحدات البايت التي تم تغييرها (يتم تحديث المكدس تلقائيًا - لا داعي لذلك). بعد التغيير، حددها (ستكون باللون الأخضر)، واضغط على هذا الخيار (أو استخدم مفتاح التشغيل السريع "M").
هنا يقوم البرنامج المساعد بطباعة معلومات الإخراج. على سبيل المثال، رسائل خطأ المحاكاة مثل هذه:
تتيح لك ميزة "القفز فوق" الانتقال إلى تعليمات واحدة إذا كنت لا ترغب في محاكاة التعليمات الحالية لسبب ما. نظرًا لأنه سيتم إحباط عملية المحاكاة إذا تم اكتشاف محاولة لقراءة الذاكرة غير المهيأة، فإن هذه الميزة تسمح لك بتجاوزها. انظر إلى مثال. فيما يلي إحدى الإرشادات الأولى في العديد من برامج x86_64، حفظ مكدس الكناري:
MOV RAX, qword ptr FS:[0x28]
سنحاول فقط الغش قليلاً والقفز فوقه من خلال زيادة قيمة جهاز الكمبيوتر. للقيام بذلك، توقف عند التعليمات التي لا تريد محاكاتها واضغط على مفتاح J
السريع. وإلا فإن المضي قدمًا قد يؤدي إلى خطأ في قراءة الذاكرة غير المهيأة.
إذا توقفت عند تعليمات تؤدي إلى روتين فرعي (مكالمة داخلية) وأردت محاكاة كل شيء حتى التعليمات التالية ("الخطوة الكلاسيكية")، فاضغط على مفتاح التشغيل السريع F6
، وسيحدث ذلك بالتأكيد:
بعض النقاط المهمة التي يجب مراعاتها :
استخدم gradle لإنشاء الامتداد: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
واستخدم Ghidra لتثبيته: File → Install Extensions...
في CodeBrowser، انتقل إلى File → Configure → Miscellaneous
وحدد خانة الاختيار الخاصة بالمكون الإضافي GhidraEmu.
هل واجهت أي أخطاء أثناء استخدام البرنامج المساعد أو لديك أفكار للتحسينات؟ لا تخجل من فتح موضوع جديد وسأكتشف ذلك.
لا تسمح قيود EmulatorHelper باستخدام مساحة البرنامج في مكان آخر. لذا فإن مكتبتك المشتركة الخارجية، على سبيل المثال، لن تعرف أبدًا مساحة ذاكرة البرنامج والعكس صحيح. لذلك لا يمكنك محاكاتها كعملية واحدة بمساحة ذاكرة واحدة. اسمحوا لي أن أعرف إذا كنت في عداد المفقودين شيئا هنا.