
नेटिव Pcode एमुलेटर
यह प्रायोगिक Ghidra प्लगइन आपको native pcode एमुलेशन से आसानी से निपटने में सक्षम बनाता है। अब किसी स्क्रिप्ट की आवश्यकता नहीं है, इसे सीधे Ghidra से उपयोग करें। यह विभिन्न असामान्य प्रोसेसरों के साथ काम करने के लिए विशेष रूप से उपयोगी हो सकता है जो सामान्य एमुलेटरों द्वारा समर्थित नहीं हैं।
यदि प्रोसेसर/vm reverse engineering के लिए Ghidra द्वारा समर्थित है, तो इसे emulate किया जा सकता है! उदाहरण के लिए, eBPF निर्देशों का एमुलेशन नीचे प्रदर्शित किया गया है:

संक्षेप में, प्लगइन ghidra.app.emulator पैकेज के अंदर की क्लासेस के चारों ओर एक विस्तारित रैपर है। यहाँ बताया गया है कि क्या लागू किया गया है:

सभी प्लगइन windows शामिल हैं: Stack view, Registers, Breakpoints view, और Main Window.

इसमें एमुलेशन का आरंभ और अंत सेट करने, breakpoints सेट करने, और एमुलेटर state में बदले हुए bytes लागू करने के लिए hotkeys शामिल हैं।

Registers को अपनी इच्छानुसार बदलें। link register (हरा तीर) सेट करने से एमुलेटर को यह समझने में मदद मिलेगी कि किस register में return address है। प्लगइन जानता है कि यह stack, lr register, AARCH64, और MIPS registers के माध्यम से कैसे काम करता है। यदि आपके पास कोई असामान्य register है, तो link register चुनें और बटन दबाएँ।

जब आप अपने प्रोग्राम को CodeBrowser में खोलते हैं, GhidraEmu stack space को स्वचालित रूप से map करेगा। Stack pointer को stack range के मध्य में सेट किया जाएगा। यह आपको stack frames के ऊपर या नीचे values सेट करने की अनुमति देता है। यदि updating या resetting के दौरान रुकावट (freeze) का अनुभव हो तो इसे scroll करें। एमुलेशन प्रक्रिया के दौरान, यदि प्रोग्राम को stack के लिए अधिक स्थान की आवश्यकता होती है, तो प्लगइन इसे स्वचालित रूप से आवंटित करेगा।


यदि एमुलेशन के दौरान कोई bytes बदलते हैं, तो आप उन्हें classic ByteViewer में देखेंगे। चिंता न करें, "Reset" बटन दबाने के बाद वे अपने मूल मानों पर वापस सेट हो जाएँगे।

यदि आपने परिवर्तन किए हैं, तो एमुलेटर को बदले हुए bytes के बारे में बताएं (stack स्वचालित रूप से अपडेट होता है -- इसकी आवश्यकता नहीं है)। बदलने के बाद, उन्हें चुनें (वे हरे होंगे), और इस विकल्प को दबाएं (या "M" hotkey का उपयोग करें)।

यहाँ प्लगइन आउटपुट जानकारी प्रिंट करता है। उदाहरण के लिए, एमुलेशन error messages इस प्रकार हैं:

"Jump Over" सुविधा आपको एक instruction आगे कूदने की अनुमति देती है यदि आप किसी कारण से वर्तमान instruction को emulate नहीं करना चाहते हैं। चूँकि uninitialized memory को पढ़ने का प्रयास पता चलने पर एमुलेशन प्रक्रिया समाप्त कर दी जाएगी, यह सुविधा आपको इसे बायपास करने की अनुमति देती है। एक उदाहरण देखें। यह कई x86_64 प्रोग्रामों के पहले निर्देशों में से एक है, canary stack saving:
MOV RAX, qword ptr FS:[0x28]
हम बस थोड़ा cheat करने की कोशिश करेंगे और PC value बढ़ाकर इसे jump over करेंगे। ऐसा करने के लिए, उस instruction पर रुकें जिसे आप emulate नहीं करना चाहते और J hotkey दबाएं। अन्यथा, आगे step करने पर uninitialized memory read error उत्पन्न होगा।

यदि आप किसी ऐसे instruction पर रुकते हैं जो subroutine (internal call) की ओर ले जाता है और आप अगले instruction तक सब कुछ emulate करना चाहते हैं (classic "step over"), तो F6 hotkey दबाएं, और यह निश्चित रूप से होगा:

विचार करने योग्य कुछ महत्वपूर्ण बिंदु:
Extension बनाने के लिए gradle का उपयोग करें: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle और इसे स्थापित करने के लिए Ghidra का उपयोग करें: File → Install Extensions...
CodeBrowser में, File → Configure → Miscellaneous पर जाएं और GhidraEmu plugin के लिए checkbox चुनें।
प्लगइन का उपयोग करते समय कोई bug मिला या सुधार के लिए विचार हैं? नई issue खोलने में संकोच न करें, मैं इसे देख लूँगा।
EmulatorHelper प्रतिबंध program space का उपयोग किसी अन्य space में करने की अनुमति नहीं देते हैं। इसलिए आपकी external shared library, उदाहरण के लिए, program memory space के बारे में कभी नहीं जान पाएगी और इसके विपरीत भी। इसलिए आप इसे एक memory space वाली एक प्रक्रिया के रूप में emulate नहीं कर सकते। यदि मैं यहाँ कुछ भूल रहा हूँ तो मुझे बताएं।