שְׁאֵלָה:
windows - מדוע ברירת המחדל של imagebase היא 0x400000?
user4520
2014-09-15 23:00:32 UTC
view on stackexchange narkive permalink

לאחר שנקלעתי לשאלה זו (ותשובה): https://stackoverflow.com/questions/2170843/va-virtual-adress-rva-relative-virtual-address במסע שלי להבנה פורמט PE של חלונות, אני תוהה: מדוע ערך ברירת המחדל של תמונת בסיס הוא 0x400000? מדוע לא יכולנו פשוט להתחיל ב -0? VA יהיה אז, בכל המטרות המעשיות, שווה ל- RVA.

ברור שחסר לי משהו, אך לא הצלחתי למצוא הסבר סביר לכך במשך 40 הדקות האחרונות.

ובכן, אפס יהיה אזור הביוס ... אז זה לא צריך ... מחסנית וערימה יכולים להתחיל בסביבות 0x10000 וכמה קבצי dll אחרים וכו 'נמצאים שם (קבצי .nls וכן הלאה) לפתוח exe ב- ollydbg, ואז תסתכל על תצוגת הזיכרון, תראה מה שם למטה, בדרך כלל יש כמה דברים במערכת, לפחות קובץ nls אחד במערכת שלי והתחלה של ערמת החוט הראשי וגבוהה מ- 0x80000000 (בכל מקרה על 32 סיביות) קבצים ממופים mem, מנהלי התקנים וכאלה
@evlcrn8 המתן - מערכת ההפעלה מתרגמת בכל מקרה את כל אזכורי הזיכרון למיקומים פיזיים, כך שבשום פנים ואופן לא אוכל לגשת לדברים של ה- BIOS או פחות או יותר לכל דבר שלא שייך לי ... נכון?
@evlcrn8: כברירת מחדל, הזיכרון ב- 0x00000000 אינו ממופה; זה בהחלט לא "אזור הביוס". וקבצים הממופים לזיכרון ממצב משתמש ממופים מתחת ל 0x80000000.
אני רק זוכר את זה כאזור הביוס מימי הדוס הישנים, וזה די תקוע איתי, אני די בטוח שקבצים הממופים באמצעות mapviewoffile היו ב> 0x80000000 כשבדקתי
שתיים תשובות:
Jason Geffner
2014-09-16 00:02:01 UTC
view on stackexchange narkive permalink

מדוע ערך ברירת המחדל של imagebase הוא 0x400000?

מאת http://msdn.microsoft.com/en-us/ library / ms809762.aspx -

בהפעלה המיוצרת עבור Windows NT, בסיס התמונות המוגדר כברירת מחדל הוא 0x10000. עבור קבצי DLL, ברירת המחדל היא 0x400000. ב- Windows 95, לא ניתן להשתמש בכתובת 0x10000 לטעינת EXE של 32 סיביות מכיוון שהיא נמצאת באזור כתובת ליניארי המשותף לכל התהליכים. מסיבה זו, מיקרוסופט שינתה את כתובת בסיס ברירת המחדל עבור הפעלות Win32 ל- 0x400000.

שים לב שכתובת הבסיס המוגדרת כברירת מחדל (או "המועדפת") מוגדרת על ידי הקישור (ה- ld של GCC, ה- link.exe של Microsoft VC ++ וכו ') בזמן הבנייה; כתובת הבסיס המוגדרת כברירת מחדל (או "מועדפת") היא לא נקבעת על ידי Windows.

זה של מיקרוסופט הוא קצת מוזר, בפעם האחרונה שהסתכלתי זה עובד לפי שם המודול ומחשב את הבסיס מזה
@evlncrn8: על פי http://msdn.microsoft.com/en-us/library/f7f5138s.aspx, אפילו MS VC ++ 'link.exe' האחרון משתמש ב- 0x400000 ככתובת הבסיס המוגדרת כברירת מחדל.
@evlncrn8: יתכן שתראה "אקראיות כתובת טעינה".
לא אני יודע aslr, זה לא זה ... http://www.delorie.com/gnu/docs/binutils/ld_4.html שם בסיס התמונה (אם נבחרה האפשרות האוטומטית) נבחר מ- hash של שם הקובץ .. קישור.exe עושה משהו דומה, אני מנסה למצוא את המסמך עליו, אבל אין לי הרבה כספומט
@evlncrn8: כן, לא הייתי מסכים שיש אפשרות לזה, פשוט אמרתי שזה לא ברירת המחדל :)
ריימונד חן פרסם כתב מפורט על שאלה מדויקת זו: http://blogs.msdn.com/b/oldnewthing/archive/2014/10/03/10562176.aspx
@QAZ: וואו, הוא פרסם את זה הבוקר. אולי השאלה הזו של StackExchange הובילה את ריימונד לכתוב את ההודעה בבלוג :) הייתי אומר שההסבר שניתן באותו פוסט בבלוג החדש הוא מלא יותר מזה שאליו קישרתי למעלה, אז אל תהסס לפרסם אותו כתשובה כאן (אז אתה מקבל אשראי) ואשמח להצביע עליו.
blabb
2014-09-16 01:04:21 UTC
view on stackexchange narkive permalink

תוכל לשנות את הבסיס אם תרצה ש- msvc אוסף מנהלי התקנים עם בסיס תמונות של 0x10000

 : \ >kd -c "! dh acpi; q" -zc: \ WINDOWS \ system32 \ drivers \ acpi.sys | grep -i imageFile סוג: IMAGE EXECUTABLE00010000 תמונה בסיסית 5.01 גרסת תמונה 2DD80 גודל התמונה: \ >  

הנה כיצד לשנות את אופן ההפעלה של אופן השימוש במערכת הבסיס חייבת להיות מכפלת של 64k אם בסיס: 0 הוא exe משומש יהיה בעל בסיס תמונות של 0x10000

 : \ >dir / b & type * & cl / nologo / Zi * / link / base: 0x200000 & dir /bsysbp.cppsysbp.cpp# כולל את <stdio.h> # כולל את <stdlib.h>int main (בטל) {printf ("כל הבסיסים שייכים לבסיס \ n"); יציאה (0);} sysbp.cppsysbp.cppsysbp.exesysbp.ilksysbp.objsysbp.pdbvc100.pdb: \ >sysbp.exeall הבסיסים שייכים לבסיס: \ >cdb -c "q;" sysbp.exe | grep -i modloadModLoad: 00200000 00222000 sysbp.exeModLoad: 7c900000 7c9b2000 ntdll.dllModLoad: 7c800000 7c8f6000 C: \ WINDOWS \ system32 \ kernel32.dllq: \ >  


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...