मुख्य प्रोग्राम को अपने स्वयं के छविबेस में बहुत ऊपर उठाने के बाद।सी ++ लोड लाइब्रेरी एपीआई के छवि बेस को नियंत्रित करने के लिए कैसे करें
मैं कैसे गारंटी नहीं कि dll लोड हो जाता है कि लोड होगा 0x400000
dllImageBase = LoadLibrary("test.dll");
printf("imagebase = 0x%x", dllImageBase);
में मैं हमेशा 0x460000 0x400000 के बजाय
मैं अपने dll पहले निर्देश की जरूरत है 0x401000 से शुरू करने के लिए मिलता है, इसकी आदत लिंकर rebase करने के लिए रिबेसिंग
कमान से पहले 0x600000 पर शुरू
#pragma comment(linker, "/BASE:8000000")
है
तो 0x400000 वास्तव में अभी भी नि: शुल्क है, फिर भी यह डिफ़ॉल्ट रूप से इसका उपयोग नहीं करता है .. इसलिए किसी भी तरह से मैं इसे नियंत्रित कर सकता हूं, जहां इसे स्थानांतरित करना चाहिए। कुछ WIN32API शायद?
आप कैसे जानते हैं कि '0x400000' निःशुल्क है? कुछ अन्य डीएलएल वहां हो सकते हैं। –
मैंने मेमोरी मैप और मेरे प्रोग्राम का देखा। कोड/पीई हेडर '0x8000000' पर शुरू होता है .. और इससे पहले कि यह 0x3300000' है जो सिर्फ sortbls.nls है और यह केवल कम हो रहा है और कम कुछ भी वास्तव में' 0x4000000' का उपयोग नहीं कर रहा है। लेकिन भविष्य में कहीं भी आप क्या कह रहे हैं यह कुछ सनकी दुर्घटनाओं से टूट जाएगा हाँ? अगर मैं इसे 0x4000000 सेट करने के तरीके के बारे में समझता हूं। फिर फिर यदि मैं किसी भी तरह से इसे नियंत्रित करने का तरीका समझता हूं तो वे फिर कभी लोड नहीं होंगे – SSpoke
मुझे इसे नियंत्रित करने के किसी भी तरीके से अवगत नहीं है। यदि आपका कोड किसी विशेष पते पर रहने वाले किसी विशेष डीएलएल पर निर्भर करता है, तो यह टूट गया है। उस के रूप में सरल (उदा।, X64 विंडोज विशेष रूप से उन पते को यादृच्छिक करने का प्रयास करता है जिन पर विभिन्न डीएलएल सुरक्षा उपाय के रूप में लोड होते हैं)। –