2009-10-29 17 views
7

मेरे पास मेमोरी डंप (अप्रबंधित प्रक्रिया) है। मैं प्रक्रिया में लोड किए गए डीएलएस में से एक (विंडबग का उपयोग करके) कैसे निकाल सकता हूं? मेरा मतलब है कि वास्तव में डिस्कमैं स्मृति डंप से डीएलएल फ़ाइल कैसे निकाल सकता हूं?

उत्तर

5

में डीएलएल फ़ाइल को सहेजना है, आप windbg निर्देशिका के अंदर sos.dll का उपयोग कर सकते हैं।

पहले, windbg में sos.dll लोड:

.load clr10\sos.dll 

तब का उपयोग सैम या SaveAllModule विशिष्ट डिस्क स्थान पर मॉड्यूल को निकालने के लिए:!

!sam c:\notepad 
2

का उपयोग किए बिना एक DLL निकालने के लिए एसओएस, .writemem एक्सटेंशन का उपयोग निम्नानुसार करें:

  1. मॉड्यूल प्रारंभ और अंत पते का उपयोग करके पता लगाएं lmvm dllname
    ieframe के लिए उदाहरण के उत्पादन: ? 61fb8000 - 61370000
    उत्पादन: Evaluate expression: 12877823 = 00c48000

  2. तो DLL इस प्रकार बचाने:
    .writemem C:\tmp\mydll.dll 61370000 L?00c48000


  3. start end module name
    61370000 61fb8000 ieframe

  4. लंबाई = अंत से शुरू की गणना

यह आपको सही डीएलएल देने की संभावना नहीं है क्योंकि यह डिस्क से लोड किया गया था, इसे ठीक करना गैर-तुच्छ है।

(आंशिक रूप से this article के आधार पर)

+0

मैंने कोशिश की लेकिन यह काम नहीं किया। मैंने विंडबग को Calc.exe से जोड़ा और exe लिखा और एक बड़ी फाइल मिली। अजीब। – Saar

+0

मुझे लगता है कि संरेखण में विसंगतियों के कारण है - बड़ी स्मृति संरेखण आवश्यकताओं के कारण पी 32 फाइलें डिस्क की तुलना में स्मृति में अधिक जगह लेती हैं। इन नियमों को पूरा करने के लिए आपको डंप किए जाने के बाद निष्पादन योग्य तरीके से पुनर्निर्माण की आवश्यकता है। इसके अलावा, डीबग सेक्शन डंप नहीं किया गया है (क्योंकि यह मैप नहीं किया गया है, मुझे लगता है)। आयात सारणी को पुनर्निर्माण की भी आवश्यकता है। – deemok

-2

हाँ, यह सच है। calc.exe भी अपनी बहु उपयोगकर्ता भाषा इंटरफ़ेस जानकारी खींच लेगा और इसे स्मृति में संलग्न करेगा, जैसे कि विंडोज़ प्रोग्राम जैसे एमस्पेंट, फोटोवोइवर इत्यादि।

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

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