2011-09-11 8 views
5

मुख्य प्रोग्राम को अपने स्वयं के छविबेस में बहुत ऊपर उठाने के बाद।सी ++ लोड लाइब्रेरी एपीआई के छवि बेस को नियंत्रित करने के लिए कैसे करें

मैं कैसे गारंटी नहीं कि dll लोड हो जाता है कि लोड होगा 0x400000

dllImageBase = LoadLibrary("test.dll"); 
printf("imagebase = 0x%x", dllImageBase); 

में मैं हमेशा 0x460000 0x400000 के बजाय

मैं अपने dll पहले निर्देश की जरूरत है 0x401000 से शुरू करने के लिए मिलता है, इसकी आदत लिंकर rebase करने के लिए रिबेसिंग

कमान से पहले 0x600000 पर शुरू

#pragma comment(linker, "/BASE:8000000") 
है

तो 0x400000 वास्तव में अभी भी नि: शुल्क है, फिर भी यह डिफ़ॉल्ट रूप से इसका उपयोग नहीं करता है .. इसलिए किसी भी तरह से मैं इसे नियंत्रित कर सकता हूं, जहां इसे स्थानांतरित करना चाहिए। कुछ WIN32API शायद?

+0

आप कैसे जानते हैं कि '0x400000' निःशुल्क है? कुछ अन्य डीएलएल वहां हो सकते हैं। –

+0

मैंने मेमोरी मैप और मेरे प्रोग्राम का देखा। कोड/पीई हेडर '0x8000000' पर शुरू होता है .. और इससे पहले कि यह 0x3300000' है जो सिर्फ sortbls.nls है और यह केवल कम हो रहा है और कम कुछ भी वास्तव में' 0x4000000' का उपयोग नहीं कर रहा है। लेकिन भविष्य में कहीं भी आप क्या कह रहे हैं यह कुछ सनकी दुर्घटनाओं से टूट जाएगा हाँ? अगर मैं इसे 0x4000000 सेट करने के तरीके के बारे में समझता हूं। फिर फिर यदि मैं किसी भी तरह से इसे नियंत्रित करने का तरीका समझता हूं तो वे फिर कभी लोड नहीं होंगे – SSpoke

+0

मुझे इसे नियंत्रित करने के किसी भी तरीके से अवगत नहीं है। यदि आपका कोड किसी विशेष पते पर रहने वाले किसी विशेष डीएलएल पर निर्भर करता है, तो यह टूट गया है। उस के रूप में सरल (उदा।, X64 विंडोज विशेष रूप से उन पते को यादृच्छिक करने का प्रयास करता है जिन पर विभिन्न डीएलएल सुरक्षा उपाय के रूप में लोड होते हैं)। –

उत्तर

5

आपको जहां भी आप चाहते हैं डीएलएल लोड करने के लिए पता स्थान लेआउट यादृच्छिकरण को अक्षम करना होगा। एक ऐसी सुविधा जो आपको रोकने की कोशिश कर रही है उससे रोकने के लिए डिज़ाइन की गई है।/DYNAMICBASE लिंकर विकल्प। जब मैंने कोशिश की तो 0x400000 पर लोड हो रहा था।

+0

एलओएल चेतावनी एलएनके 4044: अपरिचित विकल्प "डायनामिकबेस: नहीं"; अनदेखा, मुझे लगता है कि मेरा कंपाइलर पुराना है – SSpoke

2

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

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

+0

असेंबली कोड अगले कॉल ऑफसेट उत्पन्न करने के लिए गणित का उपयोग करता है जो उस विशिष्ट आधार पते में हार्डकोड किया जाता है। मुझे पता है कि यह देखने के लिए यह एक बहुत ही अजीब बात है लेकिन इसे पहली जगह – SSpoke

+0

@ एसएसपीओक में डीएलएल फ़ंक्शन के रूप में नहीं कहा जाना चाहिए: ठीक है अगर आप एक चाल का उपयोग करके मूल पता नहीं कर सकते हैं जैसा कि मैंने उपरोक्त सुझाव दिया है तो आपके पास हंस पासेंट के समाधान का उपयोग करने के अलावा कोई विकल्प नहीं। बस ध्यान रखें कि कुछ भी गारंटी नहीं देता है कि विंडोज़ का बाद का संस्करण आपके कोड को तोड़ नहीं देगा। एक अलग समाधान निश्चित रूप से आगे का सबसे अच्छा तरीका है। मुझे पूरा यकीन नहीं है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं, हालांकि, यह मुझे लगता है जैसे आप अपने द्वारा चुने गए किसी भी मूल पते का उपयोग कर सकते हैं। – Goz

+0

मैं भी गोज़ की कामना करता हूं, लेकिन मैं रिवर्स इंजीनियरिंग 128 कार्यों के साथ एक बड़ा कार्यक्रम हूं, सबसे अच्छा समाधान उन सभी असेंबली को सी कोड में परिवर्तित करना होगा या कम से कम इनलाइन करना होगा, लेकिन अब मैं एक आलसी तरीका चाहता हूं, इसलिए मैंने परिवर्तित किया एक डीएल को निकालने के लिए इसे मुख्य() हटा दिया गया और इसे एक डेलमेन के साथ बदल दिया गया ताकि यह सफलतापूर्वक डीएलएल के रूप में लोड हो सके – SSpoke

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