2012-04-29 17 views
13

मुझे निम्नलिखित असेंबली निर्देश को समझने के लिए एक सहायक हाथ की आवश्यकता है। ऐसा लगता है कि मैं कुछ अज्ञात वैल्यू + = 20 99 4 ए पर एक पता बुला रहा हूं? , लेकिन यह देखते हुए कि ऑफसेट इतनी बड़ी है -ई 8 एएसएम कॉल निर्देश को समझने में मदद की आवश्यकता है x86

E8 32F6FFFF - call std::_Init_locks::operator=+20994A 

उत्तर

42

जो कुछ भी आप disassembly प्राप्त करने के लिए प्रयोग कर रहे हैं, उपयोगी बनने की कोशिश कर रहा है एक कुछ प्रतीक है कि इसके बारे में जानता है से ऑफसेट के रूप में कॉल का लक्ष्य देकर यह शायद उलझन में है।

  • E8 एक रिश्तेदार ऑफसेट के साथ एक call है:

    कॉल का वास्तविक लक्ष्य के रूप में गणना की जा सकती है।

  • 32-बिट कोड सेगमेंट में, ऑफ़सेट को 32-बिट मान के रूप में निर्दिष्ट किया गया है।
  • यह मान छोटे-एंडियन बाइट ऑर्डर में है।
  • ऑफ़सेट को निम्न निर्देश के पते से मापा जाता है।

उदा।

<some address>  E8 32 F6 FF FF   call <somewhere> 
<some address>+5  (next instruction) 
  • ऑफसेट 0xFFFFF632 है।
  • हस्ताक्षरित 32-बिट मान के रूप में व्याख्या किया गया, यह -0x9CE है।
  • call निर्देश <some address> पर है और यह 5 बाइट लंबा है; अगला निर्देश <some address> + 5 पर है।
  • तो कॉल का लक्ष्य पता <some address> + 5 - 0x9CE है।
+0

आपको बहुत टैंक। आपका उदाहरण स्पॉट पर है! – Michael

+0

@ मैथ्यू कॉल निर्देश 5 बाइट से अधिक लंबा हो सकता है? (एक x86 archi में। अगला instric हो सकता है <कुछ पता> + 6)? किस मामले में? – Rafa

+0

@ राफा, कॉल रिश्तेदार ऑफ़सेट निर्देश 5 बाइट्स है, क्योंकि अधिकतम रिश्तेदार ऑफसेट 4 बाइट्स में फिट होना चाहिए। यदि लक्ष्य 2 ** 31 बाइट्स से अधिक दूर है, 'mov reg, imm64; कॉल रेग 'का उपयोग किया जाता है। –

-2

यदि आप एक डिस्सेबलर के साथ पीई फ़ाइल का विश्लेषण कर रहे हैं, तो डिस्सेबलर ने आपको गलत कोड दिया होगा। अधिकांश मैलवेयर लेखक ई 8 के एंटी-डिस्सेप्लिब्स तकनीक के रूप में प्रवेश का उपयोग करते हैं। आप सत्यापित कर सकते हैं कि E8 के ऊपर वाले कोड कूद निर्देश हैं जहां कूद स्थान E8 के बाद है।

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