2012-03-22 11 views
12

जेएमपी मशीन निर्देश के हेक्स कोड रूपांतरण के बारे में कोई संदेह है। मेरे पास एक पूर्ण पता है जिसे मैं कूदना चाहता हूं, "जेएमपी 0x400835" कहें। सबसे पहले, क्या यह अनुमति है? यदि हां, संबंधित हेक्स कोड क्या होगा? यदि नहीं, तो क्या मैं पहले कुछ रजिस्टर में पता संग्रहीत कर सकता हूं, ईएक्स कहता हूं और फिर "जेएमपी ईएक्स" डाल सकता हूं? मैं x86 (64b) आर्किटेक्चर पर काम कर रहा हूं।जेएमपी निर्देश - हेक्स कोड

मैंने जीडीबी में डायसैम आउटपुट से हेक्स कोड मुद्रित करने का प्रयास किया है, लेकिन कोई स्थिरता नहीं है, यानी, मुझे हेक्स कोड में गंतव्य पता नहीं दिखाई देता है।

मैं हेक्स कोड और मशीन निर्देशों के लिए नया हूं, इसलिए मेरी अज्ञानता को क्षमा करें।

उत्तर

23

64 बिट मोड में एक पूर्ण पते पर JMP absaddr फॉर्म की कोई छलांग नहीं है। एक कूद का संचालन हमेशा 32 बिट रिश्तेदार विस्थापन rip पर होता है, जो संकेत 64 बिट तक बढ़ा दिया जाता है।

कारण आप कोई स्थिरता नहीं देखते हैं संभवतः ऑफसेट वर्तमान निर्देश सूचक पर निर्भर करता है और आप इसे पहचान नहीं पाए।

jmp eax या तो अनुमति नहीं है, क्योंकि पते 64 बिट आर्किटेक्चर पर हमेशा 64 बिट चौड़े हैं। एक अनुक्रम mov rax, addr + jmp rax संभव है, यह

48 c7 c0 35 08 40 00   mov rax, 0x00400835 
ff e0       jmp rax 

या

कैसा दिखेगा
48 b8 35 08 40 00 00 00 00 00 mov rax, 0x0000000000400835 
ff e0       jmp rax 

मैं इन हेक्स कोड कैसे पता चला? खैर, मैंने अपने कंपाइलर से पूछा था। मैंने gcc -c के साथ संकलित किया और objdump के साथ अलग किया गया। मैंने इंटेल सिंटैक्स का उपयोग करने के लिए परेशान नहीं किया, क्योंकि मुझे इसकी आवश्यकता नहीं है। तो यह AT & टी वाक्यविन्यास में है।

echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c 
gcc -c test.c 
objdump -d test.o 
+0

उत्तर के लिए धन्यवाद। यह वास्तव में मेरी मदद की। objdump गंभीरता से एक अच्छा उपकरण है! –

+0

हे .. मैंने आपकी पोस्ट को "उपयोगी" के रूप में चिह्नित किया है .. मुझे लगता है कि मुझे क्या लगता है, है ना? –

+0

@ दीपनंजन मज़ुमदार आपको चेक मार्क – hirschhornsalz

संबंधित मुद्दे