2012-06-10 6 views
5

मुझे DLL disassembled और वहाँ कुछ कार्यों को देखते हैं। मुझे वह फ़ंक्शन मिला जो मुझे चाहिए और इसका पता 0x10001340 है।क्या डीएलएल में फ़ंक्शन पता के लिए यह संभव है कि यह एप्लिकेशन में लोड हो जाए?

इस पते, वही रह सकते हैं अगर मैं अपने आवेदन में इस DLL लोड? तो क्या मेरे लिए मेरे आवेदन से उस पते को उस समारोह से कॉल करना संभव होगा?

मैं पूछ रहा हूँ क्योंकि मुझे यकीन है कि नहीं कर रहा हूँ: क्या हुआ अगर आप इस dll लोड, मुख्य आवेदन में कुछ समारोह पहले से ही एक ही पता है? तो हो सकता है कि लोडिंग या इत्यादि के दौरान एक डीएल के अंदर के कार्य पते बदल सकते हैं।

+0

आपको यह सही मिला ... –

+0

क्या विकल्प के बारे में सही है? : लोड होने पर डी पता बदल सकता है? – Kosmos

उत्तर

8

विंडोज़ डीएलएस पर एक अधिमानी लोड पता है, लेकिन लोडर उन सभी संदर्भों को बदलने में सक्षम है अगर यह नोटिस करता है कि वर्चुअल एड्रेस स्पेस का ऐसा हिस्सा है पहले से ही इस्तेमाल किया हुआ। इस प्रक्रिया को "रिबेसिंग" कहा जाता है।

"डिफ़ॉल्ट" आधार पता लिंकिंग समय (/BASE माइक्रोसॉफ्ट लिंकर के साथ) पर निर्दिष्ट किया गया है, और यदि आप किसी अन्य के साथ डीएलएल का उपयोग करने की योजना बनाते हैं तो इसे डिफ़ॉल्ट से अलग करने के लिए उपयोगी हो सकता है। एक ही आधार पता; यह लोडिंग प्रक्रिया को गति देता है, क्योंकि लोडर को प्रत्येक लोड पर डीएलएस में से किसी एक को रीबेस नहीं करना पड़ता है। (आईआईआरसी ऐसे उपकरण भी हैं जो मौजूदा डीएल को रीबेज करने और डिस्क पर परिणाम सहेजने में सक्षम हैं)

यह ध्यान में रखना अच्छा है कि, विंडोज विस्टा से, एक निर्दिष्ट ध्वज के साथ संकलित डीएलएस हमेशा यादृच्छिक रूप से लोड होते हैं कुछ प्रकार के शोषण से बचने के लिए आधार पता।

3

यह बेहद संभावना है कि आप एक ही पते के साथ समाप्त हो जाएंगे। डीएलएल के लिए लिंकर के लिए डिफ़ॉल्ट/BASE तर्क 0x10000000 है, इस प्रकार आपका पता बिंदु उस पते पर समाप्त हुआ। लेकिन वहाँ कई DLLs कि डिफ़ॉल्ट सेटिंग का उपयोग जुड़े हुए हैं, केवल एक ही वास्तव में उस पते पर लोड कर सकते हैं कर रहे हैं। बाद में लोड होने वाले अन्य सभी को फिर से आधारित करने की आवश्यकता है।

आप के लिए/आधार एक बेहतर मूल्य के साथ आ सकता है, यह हालांकि एक गारंटी है कि आप लोड का पता आप के लिए पूछना कभी नहीं है।

2

के रूप में Matteo कहा, एक DLL एक पसंदीदा लोड पते (IMAGE_OPTIONAL_HEADER संरचना के ImageBase फ़ील्ड में निर्दिष्ट) है। जब सिस्टम एक डीएलएल लोड करने का प्रयास करता है तो यह संभव होने पर इसे इस पते पर लोड करेगा (जब तक कि पता स्थान यादृच्छिकरण सक्षम न हो) और कोई "पैचिंग" आवश्यक नहीं है। यदि यह पसंदीदा पते पर लोड नहीं हो सकता है तो डीएलएल स्थानांतरित किया जाता है जिसके लिए डीएलएल में स्थानांतरण के लिए क्षतिपूर्ति करने के लिए किसी भी पूर्ण संदर्भ की आवश्यकता होगी।

तो अपने प्रश्न का उत्तर देने के लिए: कोई गारंटी नहीं है कि एक डीएलएल अपने पसंदीदा पते पर लोड किया जाएगा। एक बार लोड लोड होने के बाद डीएलएल की अधिक प्रतियां लोड नहीं होंगी, इसलिए पते नहीं बदले जाएंगे। हालांकि एक बार अनलोड किए जाने पर (डीएलएल संदर्भ गिना जाता है) इस बात की कोई गारंटी नहीं है कि अगली बार उसी पते पर लोड किया जाएगा।

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