
محاكي كود Pcode أصلي
تتيح لك إضافة Ghidra التجريبية هذه التعامل بسهولة مع محاكاة pcode الأصلية. لم تعد هناك حاجة إلى أي سكربتات، فقط استخدمها مباشرة من Ghidra. يمكن أن تكون مفيدة بشكل خاص للعمل مع مجموعة متنوعة من المعالجات الغريبة التي لا تدعمها المحاكيات الشائعة.
إذا كان المعالج/الجهاز الافتراضي مدعومًا من Ghidra للهندسة العكسية، فيمكن محاكاته! على سبيل المثال، تم توضيح محاكاة تعليمات eBPF أدناه:

في جوهرها، تعد الإضافة غلافًا موسعًا حول الفئات داخل حزمة ghidra.app.emulator. إليك ما تم تنفيذه:
على الرغم من أن محاكاة PCode مثاليًا تعني التوحيد، فإن معظم المعالجات تحتاج إلى نهجها الخاص. لا تتردد في الإبلاغ عن أي مشكلات تواجهها. أرغب حقًا في اختبار جميع المعالجات، لكن ذلك شبه مستحيل.

تحتوي على جميع نوافذ الإضافة: عرض المكدس، والسجلات، وعرض نقاط التوقف، والنافذة الرئيسية.

تحتوي على اختصارات لتعيين بداية ونهاية المحاكاة، ونقاط التوقف، وتطبيق البايتات المعدّلة على حالة المحاكي.

غيّر السجلات كما تريد. سيساعد تعيين سجل الارتباط (السهم الأخضر) المحاكي على فهم أي سجل يحتوي على عنوان الإرجاع. تعرف الإضافة كيفية عمل ذلك عبر المكدس، وسجل lr، وسجلات AARCH64، وMIPS. إذا كان لديك معالج غريب، فحدد سجل الارتباط واضغط على الزر.

عند فتح برنامجك في СodeBrowser، ستقوم GhidraEmu بتعيين مساحة المكدس تلقائيًا. سيتم تعيين مؤشر المكدس في منتصف نطاق المكدس. يتيح لك ذلك تعيين قيم في أعلى أو أسفل إطارات المكدس. مرّرها إذا واجهت تجمّدًا عند التحديث أو إعادة التعيين. أثناء عملية المحاكاة، إذا احتاج البرنامج إلى مساحة أكبر للمكدس، ستقوم الإضافة بتخصيصها تلقائيًا.


إذا تغيرت أي بايتات أثناء المحاكاة، فستراها في ByteViewer الكلاسيكي. لا تقلق، سيتم إعادة تعيينها إلى قيمها الأصلية بعد الضغط على زر "Reset".

إذا قمت بإجراء تغييرات، فأخبر المحاكي بالبايتات المتغيرة (يتم تحديث المكدس تلقائيًا -- لا حاجة لذلك). بعد التغيير، حددها (ستكون خضراء)، واضغط على هذا الخيار (أو استخدم الاختصار "M").

هنا تطبع الإضافة معلومات الإخراج. على سبيل المثال، رسائل خطأ المحاكاة مثل هذه:

تتيح لك ميزة "Jump Over" القفز إلى الأمام تعليمة واحدة إذا كنت لا تريد محاكاة التعليمات الحالية لسبب ما. نظرًا لأنه سيتم إحباط عملية المحاكاة إذا تم اكتشاف محاولة لقراءة ذاكرة غير مهيأة، تتيح لك هذه الميزة تجاوز ذلك. انظر إلى مثال. إليك واحدة من التعليمات الأولى في العديد من برامج x86_64، وهي حفظ حارس المكدس (canary):
MOV RAX, qword ptr FS:[0x28]
سنحاول فقط الغش قليلًا والقفز فوقها عن طريق زيادة قيمة عداد البرنامج (PC). للقيام بذلك، توقف عند التعليمات التي لا تريد محاكاتها واضغط على الاختصار J. وإلا، فإن المتابعة خطوة بخطوة ستؤدي إلى خطأ قراءة ذاكرة غير مهيأة.

إذا توقفت عند تعليمة تؤدي إلى روتين فرعي (استدعاء داخلي) وتريد محاكاة كل شيء حتى التعليمات التالية ("تخطي الخطوة" الكلاسيكي)، اضغط على الاختصار F6، وسيحدث ذلك بالتأكيد:

بعض النقاط المهمة التي يجب مراعاتها:
استخدم gradle لبناء الإضافة: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle واستخدم Ghidra لتثبيتها: File → Install Extensions...
في CodeBrowser، انتقل إلى File → Configure → Miscellaneous وحدد مربع الاختيار لإضافة GhidraEmu.
هل واجهت أي أخطاء أثناء استخدام الإضافة أو لديك أفكار للتحسين؟ لا تتردد في فتح مشكلة جديدة وسأقوم بحلها.
قيود EmulatorHelper لا تسمح باستخدام مساحة برنامج داخل مساحة أخرى. لذا، على سبيل المثال، لن تعرف مكتبتك المشتركة الخارجية أبدًا مساحة ذاكرة البرنامج والعكس صحيح. لذلك لا يمكنك محاكاتها كعملية واحدة بمساحة ذاكرة واحدة. أخبرني إذا كنت أغفل شيئًا هنا.