ELF निष्पादन योग्य के कौन से हिस्से मेमोरी में लोड हो जाते हैं, और कहां?


10

जो मुझे पहले से पता है:

एक ELF निष्पादन योग्य में कई खंड होते हैं, स्पष्ट रूप से .text और .data खंड स्मृति में लोड हो जाते हैं क्योंकि ये कार्यक्रम के मुख्य भाग हैं। लेकिन काम करने के लिए एक कार्यक्रम के लिए, इसे और अधिक जानकारी की आवश्यकता है, खासकर जब गतिशील रूप से जुड़ा हुआ है।

मुझे जो दिलचस्पी है, वे .plt, .got, .dynamic, .dynsym, .dynstr वगैरह जैसे खंड हैं। ईएलएफ के वे हिस्से जो क्रियाओं को पते से जोड़ने के लिए जिम्मेदार हैं।

जो मैंने अब तक पता लगाने में सक्षम किया है, वह यह है कि .symtab और .strtab जैसी चीजें मेमोरी में लोड नहीं होती हैं (या नहीं रहती हैं)। लेकिन .dynsym और .dynstr लिंकर द्वारा उपयोग किए जाते हैं? क्या वे स्मृति में रहते हैं? क्या मैं उन्हें प्रोग्राम कोड से एक्सेस कर सकता हूं?

और क्या किसी निष्पादन योग्य का कोई भाग कर्नेल मेमोरी में रहता है?

इसमें मेरी रुचि ज्यादातर फोरेंसिक है, लेकिन इस विषय पर कोई भी जानकारी मदद करेगी। इन तालिकाओं और डायनेमिक लिंकिंग के बारे में मैंने जो संसाधन पढ़े हैं, वे उच्च स्तर के हैं, वे केवल कामकाज की व्याख्या करते हैं, स्मृति में सामग्री के बारे में व्यावहारिक कुछ भी नहीं।

मेरे प्रश्न के बारे में अस्पष्ट कुछ भी बताएं।

जवाबों:


12

निम्नलिखित एक बहुत अच्छा संदर्भ है: http://www.ibm.com/developerworks/linux/library/l-dynamic-lbooks/ । इसमें विभिन्न स्तरों पर विभिन्न संदर्भों के अंत में एक ग्रंथ सूची शामिल है। : आप हर रक्तमय विस्तार जानना चाहते हैं आप स्रोत के लिए सीधे जा सकते हैं http://www.akkadia.org/drepper/dsohowto.pdf । (उलरिक ड्रेपर ने लिनक्स डायनामिक लिंकर लिखा है।)

"Objdump -h my.exe" या "readelf -S myexe" जैसी कमांड चलाकर आप अपने निष्पादन योग्य सभी अनुभागों का वास्तव में अच्छा अवलोकन प्राप्त कर सकते हैं।

.Interp सेक्शन में डायनेमिक लोडर का नाम होता है, जिसका उपयोग इस ऑब्जेक्ट में प्रतीकों को गतिशील रूप से जोड़ने के लिए किया जाएगा। .Dynamic अनुभाग प्रोग्राम हेडर का एक आसवन है जिसे पढ़ने के लिए डायनेमिक लोडर के लिए आसान प्रारूपित किया जाता है। (इसलिए इसमें अन्य सभी वर्गों के लिए संकेत हैं।)

Thegot (ग्लोबल ऑफ़सेट टेबल) और .plt (प्रोसीजर लिंकेज टेबल) दो मुख्य संरचनाएं हैं जिन्हें गतिशील लिंकर द्वारा हेरफेर किया जाता है। Thegot चर के लिए एक अप्रत्यक्ष तालिका है और .plt फ़ंक्शन के लिए एक अप्रत्यक्ष तालिका है। प्रत्येक निष्पादन योग्य या लाइब्रेरी (जिसे "साझा ऑब्जेक्ट" कहा जाता है) की अपनी .got और .plt होती हैं और ये उस साझा किए गए ऑब्जेक्ट द्वारा संदर्भित प्रतीकों के टेबल होते हैं जो वास्तव में किसी अन्य साझा ऑब्जेक्ट में निहित होते हैं।

.Dynsyn में आपके साझा किए गए ऑब्जेक्ट में प्रतीकों के बारे में सभी जानकारी होती है (दोनों जिन्हें आप परिभाषित करते हैं और उन बाहरी लोगों को जिन्हें आपको संदर्भित करने की आवश्यकता है।) Thedynsyn में वास्तविक प्रतीक नाम नहीं हैं। वे .dynstr में शामिल हैं और .dynsyn में .dynstr के संकेत हैं। .gnu.hash नाम से प्रतीकों की त्वरित खोज के लिए उपयोग की जाने वाली एक हैश तालिका है। इसमें केवल पॉइंटर्स (.dynstr में पॉइंटर्स और बाल्टी चेन बनाने के लिए उपयोग किए जाने वाले पॉइंटर्स) होते हैं।

जब आपके साझा किए गए ऑब्जेक्ट डेरेफरेंस को कुछ प्रतीक "फू" करते हैं तो डायनेमिक लिंकर को उन सभी डायनामिक ऑब्जेक्ट्स में "फू" के रूप में देखना पड़ता है, जिनसे आप यह पता लगाने के लिए जुड़े होते हैं कि उनमें से कौन सा "फू" है जिसे आप खोज रहे हैं (और फिर रिश्तेदार "foo" का पता उस साझा किए गए ऑब्जेक्ट के अंदर है। डायनेमिक लिंकर सभी लिंक्ड शेयर्ड ऑब्जेक्ट्स के .gnu.hash अनुभाग (या पुराने साझा किए गए ऑब्जेक्ट्स के लिए .hash सेक्शन) के पास नहीं है। हैश सेक्शन।) एक बार लिंक किए गए साझा किए गए ऑब्जेक्ट में सही पता लगने के बाद यह आपके साझा किए गए ऑब्जेक्ट के .got या .plt में डालता है।


धन्यवाद, आपके लिंक मुझे उन वर्गों के वर्चुअल मैपिंग का पता लगाने में एक कदम आगे ले जाते हैं जिनकी मुझे आवश्यकता है। जैसा कि इसमें मेरी रुचि फोरेंसिक है, "DRAM में लोड" अभी भी मेरे लिए प्रासंगिक है। यदि कोई खंड मैप किया गया है, लेकिन कभी लोड नहीं किया गया है, तो मैं इसे मेमोरी डंप में नहीं पा सकूंगा :)
Dutch

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

आपके उत्तर को उत्तर के रूप में चिह्नित किया गया है, क्योंकि यह उतनी ही जानकारी है जितना मुझे मिलने वाला है :) बाकी काम मुझे खुद करना होगा, यह मेरा शोध है।
डची

तो, हाँ .dynsym और।
ysdx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.