2016-04-22 7 views
7

से पहले REX.w उपसर्ग का अर्थ बग को हल करते समय मैं दो Win64 DLLs के आयात कूद तालिकाओं के बीच एक अंतर आया। kernel32.dll का 64 बिट संस्करण सादा FF25jmp इसकी आयात कूद तालिकाओं में निर्देश का उपयोग करता है। दूसरी तरफ advapi32.dll का 64 बिट संस्करण 48FF25 का उपयोग करता है जो jmp ऑपोड से पहले उपसर्ग को इंगित करता है। हालांकि, दोनों में 32 बिट ऑपरेंड होता है और एक आरआईपी + ऑफसेट पता निर्दिष्ट करता है।AMD64 jmp (FF25)

क्या इस विशिष्ट ऑपोड पर REX.w उपसर्ग के लिए कोई अर्थ है?

मैं अक्सर मशीन कोड के साथ काम नहीं कर रहा हूं, इसलिए कृपया किसी भी वास्तविक गलतियों से क्षमा करें।

+0

मुझे लगता है कि आपको इसे इंटेल दस्तावेज़ों में प्रलेखित किया जाएगा। –

+2

यह इंटेल मैनुअल में सूचीबद्ध नहीं है और डिस्सेबलर्स मैंने भी इसका कोई अर्थ नहीं उठाया है। मुझे लगता है कि 'rex.w' सिर्फ अनदेखा किया गया है। – Jester

उत्तर

9

REX.W उपसर्ग को अनदेखा किया जाता है। 64-बिट मोड में FF /4 ऑपोड में हमेशा 64-बिट ऑपरेंड होता है (जेएमपी आर/एम 64), इसलिए ऑपरेटिंग आकार बदलते उपसर्ग (आरईएक्सडब्ल्यू, 66) का कोई प्रभाव नहीं पड़ता है।

यही कारण है कि यह REX.W उपसर्ग मौजूद है, शायद यह माइक्रोसॉफ्ट के x64 कॉलिंग सम्मेलन के नियमों को अनदेखा करने के अनुरूप है। जंप आयात स्टब प्रभावी रूप से एक निर्देश फ़ंक्शन है, और चूंकि विंडोज़ पर अपवाद अतुल्यकालिक हैं, इसलिए वे किसी भी समय हो सकते हैं, इस फ़ंक्शन को निष्पादित करते समय उत्पन्न होने के अपवाद के लिए यह संभव है। माइक्रोसॉफ्ट कई restrictions on instructions used at the start and end of functions रखता है। विशेष रूप से समारोह को एक उपन्यास के साथ समाप्त होना चाहिए जिसमें केवल कुछ निर्देश शामिल हैं। MSDN पर Kevin Frei's blog अनुसार यदि पिछले अनुदेश एक अप्रत्यक्ष कूद यह REX.W उपसर्ग का उपयोग करना चाहिए है:

एक अन्य ध्यान दें: यदि अंतिम JMP एक आईपी-रिश्तेदार JMP नहीं है, लेकिन एक अप्रत्यक्ष जेएमपी, यह आरईएक्स उपसर्ग से पहले होना चाहिए, ओएस को इंगित करने के लिए दिनचर्या को अनदेखा करें कि कूद कार्य के बाहर की ओर जाता है, अन्यथा, ओएस मानता है कि यह एक ही फ़ंक्शन के अंदर एक अलग स्थान पर कूद है।

REX.W का उपयोग कर के बीच विसंगति के बारे में आया हो सकता है क्योंकि इस ऊपर बताया गया नियम क्या माइक्रोसॉफ्ट आधिकारिक दस्तावेज एक अंतिम जेएमपी शिक्षा का आवश्यकता के साथ पूरी तरह से संगत नहीं है:

केवल एक JMP बयान के सबसेट epilog में स्वीकार्य हैं। ये विशेष रूप से एमडीआरएम मेमोरी संदर्भों के साथ जेएमपीएस की कक्षा के हैं जहां मॉडआरएम मॉड फील्ड वैल्यू 00. मॉड्रम मॉड फील्ड वैल्यू 01 या 10 के साथ एपिलॉग में जेएमपीएस का उपयोग प्रतिबंधित है।

ध्यान दें कि इस के बाद रिश्तेदार जेएमपी निर्देश जो एक ModR/एम एन्कोडिंग का उपयोग नहीं करते शामिल नहीं होंगे जेएमपी का सबसे आम प्रकार के साथ एक समारोह समाप्त करने के लिए है, इसलिए मैं इस पर विश्वास करने के लिए इच्छुक हूँ आधिकारिक दस्तावेज है कि है यहां त्रुटि में

असंगतता के लिए अन्य संभावित कारण हैं माइक्रोसॉफ्ट के अनचाहे हैंडल आयात कूद कूदने वाले विशेष रूप से या आरईएक्स के बिना कूदने वाले स्टब्स हैं। उपसर्ग एक बग है और जब यह अपवाद होता है तो प्रोग्राम को बहुत ही असंभव मामले में समाप्त कर दिया जाएगा जब उन्हें निष्पादित किया जा रहा है तब होता है।

+3

यही कारण है। CoreClr में https: // github पर ओएस अनविंडर की एक प्रति है।कॉम/डॉटनेट/कोरक्लर/ब्लॉब/मास्टर/src/unwinder/amd64/unwinder_amd64.cpp जहां आप जांच सकते हैं कि स्टैक अवांछित कैसे काम करता है। यह वास्तव में आरईएक्स उपसर्ग के लिए जांच करता है जैसे केविन ने अपने ब्लॉग पर बताया। –

+3

यह ['RtlVirtualUnwind' फ़ंक्शन] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms680617.aspx) के लिए एसडीके दस्तावेज़ में अर्ध-दस्तावेज भी है, विशेष रूप से" टिप्पणियां "के अंतर्गत , जहां यह x64 पर एपिलॉग मार्करों की एक विस्तृत सूची देता है जो स्टैक अवांछित कोड द्वारा पहचाने जाते हैं। –

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