PE ImageBase एड्रेस मेमोरी में क्यों बदलता है?
मैं एक दुर्भावनापूर्ण 32-बिट x 86 विंडोज निष्पादन योग्य उलट रहा हूं। घिड्रा में सांख्यिकीय रूप से पीई हेडर की समीक्षा करते हुए, मैं देख रहा हूं कि ImageBase
यह 0x400000
अपेक्षित है। हालांकि, जब बाइनरी को मेमोरी में लोड किया जाता है, तो प्रारंभिक आरवीए ImageBase
फ़ाइल में परिभाषित से मेल नहीं खाता है । उदाहरण के लिए, मैंने इन-मेमोरी बेस एड्रेस को सेट किया है 0x4B0000
और देखा है 0x900000
। यह व्यवहार एक साफ VM पर होता है, और जब Immunity और x32dbg के साथ-साथ IDA फ्री के साथ डिबगिंग होता है।
मेरी समझ यह है कि विंडोज लोडर पढ़ता है ImageBase
और उस पते का उपयोग करता है जो वर्चुअल एड्रेस स्पेस में मैपिंग सेक्शन शुरू करने के लिए ऑफसेट करता है। क्योंकि सिस्टम कोड लोडिंग को संभालता है, और मेरा सिस्टम पहले निष्पादन पर साफ है, मेरी धारणा यह है कि असामान्य ImageBase
छेड़छाड़ के बजाय लोडर बारीकियों का एक लक्षण है। मैंने कभी इस परिदृश्य का सामना नहीं किया है और किसी भी अंतर्दृष्टि की सराहना करेंगे।
MD5: 1f63d04ee95ea041f2f6b1e818d94a7c
SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1
ImageBase
0x400000
Ghidra में पीई हेडर देखने पर सेट करें :
ImageBase
मेमोरी-मैप्ड पीई हेडर में ( 0x4B0000
) ImageBase
स्थिर फाइल में सेट से मेल नहीं खाता :
पीई वर्गों के साथ स्मृति में मैप किया ImageBase
पर0x4B0000
जवाब
यह सिर्फ एक पसंदीदा पता है। विंडोज लगभग किसी भी पते पर बाइनरी को लोड कर सकता है और इसे इस नए स्थान पर रीबेस कर सकता है।
ImageBase: स्मृति में लोड होने पर छवि के पहले बाइट का पसंदीदा पता; 64 K का गुणक होना चाहिए। DLL के लिए डिफ़ॉल्ट 0x10000000 है। Windows CE EXEs के लिए डिफ़ॉल्ट 0x00010000 है। Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 और Windows Me के लिए डिफ़ॉल्ट 0x00400000 है।
स्रोत: MSDN