2009-10-21 14 views
14

के तहत सूचक स्थिरता मैं कुछ समय के लिए सी और सी ++ परियोजनाओं के लिए विंडोज एक्सपी प्रो 64-बिट के तहत विजुअल स्टूडियो 2005 का उपयोग कर रहा हूं। डीबगर में समय-समय पर उपयोग की जाने वाली लोकप्रिय चालों में से एक प्रोग्राम के पिछले डीबगिंग रन से एक संख्यात्मक सूचक मूल्य याद रखना था (0x00000000FFAB8938 कहें), इसे उचित टाइपकास्ट के साथ विंडो देखने के लिए जोड़ें (कहें, ((MyObject *) 0x00000000FFAB8938)->data_field) और फिर अगली डीबगिंग रन के दौरान ऑब्जेक्ट द्वारा कब्जा कर लिया गया स्मृति देखें। कई मामलों में यह काफी सुविधाजनक और उपयोगी चीज है, क्योंकि जब तक कोड अपरिवर्तित रहता है, तब तक यह अपेक्षा करना उचित है कि आवंटित मेमोरी लेआउट अपरिवर्तित रहेगा। संक्षेप में, यह काम करता है।विंडोज विस्टा

हालांकि, अपेक्षाकृत हाल ही में मैंने विंडोज विस्टा (होम प्रीमियम) 64-बिट वाले लैपटॉप पर विजुअल स्टूडियो के उसी संस्करण का उपयोग शुरू किया। आश्चर्यजनक रूप से पर्याप्त है, इस सेटअप में इस चाल का उपयोग करना बहुत मुश्किल है। वास्तविक स्मृति पता किसी भी स्पष्ट कारण के लिए रन से चलाने के लिए अक्सर बदलता प्रतीत होता है, यानी जब कार्यक्रम का कोड बिल्कुल नहीं बदला गया था। ऐसा प्रतीत होता है कि वास्तविक पता पूरी तरह यादृच्छिक रूप से नहीं बदल रहा है, यह केवल मानों के एक निश्चित अधिक या कम स्थिर सेट से एक मान का चयन करता है, लेकिन किसी भी मामले में यह इस प्रकार की मेमोरी देखने के लिए और अधिक कठिन बनाता है।

क्या किसी को भी विंडोज विस्टा में इस व्यवहार का कारण पता है? मेमोरी लेआउट में बदलाव का कारण क्या है? क्या प्रक्रिया में कुछ बाह्य घुसपैठ अन्य [सिस्टम] प्रक्रियाओं से अंतरिक्ष स्थान को संबोधित करता है? या यह Vista के तहत हीप एपीआई कार्यान्वयन की कुछ quirk/सुविधा है? क्या ऐसा होने से रोकने के लिए कोई रास्ता है?

+1

लिनक्स के तहत लंबे समय से एक हीप यादृच्छिकता है जिसका उद्देश्य बफर ओवरफ्लो हमलों से परहेज करना है। शायद यह अंततः एमएस द्वारा भी लागू किया गया है? – jdehaan

+0

ठीक है, मुझे इसके बारे में पता है, लेकिन AFAIK यह केवल तभी काम करता है जब आप * कॉम्पम्प्यूटर रीबूट करते हैं। अधिक सटीक, मैंने सुना है कि एमएस ने प्रत्येक संस्करण में चीजों को यादृच्छिक बनाने के लिए अपने संस्करण को लागू किया है (यह नहीं पता कि यह लिनक्स पर कैसे काम करता है)। तो, विस्टा में जो व्यवहार मैं देखता हूं वह संबंधित नहीं लगता है। – AnT

+0

हालांकि यह कुछ हो सकता है। मैं वीएस 2005 चला रहा हूं, जो 32-बिट एप्लीकेशन है जो 64-बिट अनुप्रयोगों को डीबग कर सकता है। AFAIK, यह एमएस के रिमोट डीबगिंग तंत्र के माध्यम से काम करता है। क्या यह हो सकता है कि जब भी मैं वीएस 2005 से 64-बिट एप्लिकेशन शुरू करता हूं तो विस्टा अनिवार्य रूप से "64" एक नया 64-बिट वातावरण बूट करता है (इस प्रकार चीजों को यादृच्छिक बनाने के कारण)? – AnT

उत्तर

30

विंडोज विस्टा address space layout randomization, heap randomization, and stack randomization लागू करता है। यह एक सुरक्षा तंत्र है, जो बफर ओवरफ्लो हमलों को रोकने की कोशिश कर रहा है जो इस बात पर भरोसा करते हैं कि कोड और डेटा का प्रत्येक टुकड़ा स्मृति में है।

MoveImages रजिस्ट्री मान सेट करके एएसएलआर बंद करना संभव है। मुझे ढेर यादृच्छिकरण को अक्षम करने का कोई तरीका नहीं मिला, लेकिन कुछ माइक्रोसॉफ्ट लड़के _crtheap के सापेक्ष कंप्यूटिंग पते की सिफारिश करता है। यहां तक ​​कि यदि ढेर चारों ओर घूमता है, तो सापेक्ष पता स्थिर रह सकता है।

+0

धन्यवाद। :) अनुमान लगाने के लिए यह एक बात है लेकिन उत्पीड़न को देखना अच्छा लगा। – BobbyShaftoe

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