PDA

View Full Version : DLL در virtual address spaces



r00tkit
یک شنبه 06 تیر 1389, 22:50 عصر
سلام

وقتی یه dll توسط چند process استفاده می شه ان dll توی address spaces هر کدوم از process ها کپی می شه ؟

یا این حالت رخ می ده
http://www.barnamenevis.org/forum/attachment.php?attachmentid=51902&stc=1&d=1277664931

در این حالت dll در یه جایی هست و همه ی process ها به انجا اشاره می کنن

اگه این حالت رخ بده این dll ها کجاست که هم زمان بین dll ها share شده ؟یعنی تو چه ادرسی هست
چون در این روش به ادرس مذکور توسط process ها دسترسی هست باعث نقص امنیتی نمی شه

یه توضیحی بدید

پی نوشت:
سرچ کردم و در حال خوندن windows via c/C++‎ هستم (اولاشم)

vcldeveloper
دوشنبه 07 تیر 1389, 00:50 صبح
یک DLL در فضای Virtual Address یک پروسس Map میشه. هر ماجول (از جمله DLLها) یک Base Address داره، وقتی DLL در فضای آدرس یک پروسه لود میشه، ویندوز سعی میکنه DLL را در همان Base Address ایی که مشخص شده، لود کنه، ولی اگر اون فضای آدرس اشغال شده باشه، ویندوز DLL را در آدرس دیگه ایی در فضای آدرس پروسه لود میکنه، و آدرس توابع موجود در DLL را برای آن پروسه، متناسب با Base Address جدید، تغییر میده.

Processها به RAM دسترسی مستقیم ندارند، و دسترسی شان به DLL از طریق همان Map شدن DLL صورت میگیره، یعنی ویندوز به اون پروسه اجازه میده که یک View فقط خواندنی از فضایی از RAM که DLL در آن لود شده، در فضای آدرس مجازی خودش داشته باشه.

برای کدهای سطح کرنل که در فضای آدرس همه پروسه های در حال اجرا وجود دارند هم به همین شکل عمل میشه، یعنی با ایجاد هر پروسه، کدهای سطح کرنل مربوطه از جایی به فضای آدرس پروسه کپی نمیشند، بلکه این کدها یک بار لود میشند، و به ازاء هر پروسه ایی که شروع میشه، در فضای آدرس اون پروسه جدید Map میشند.

r00tkit
پنج شنبه 10 تیر 1389, 12:44 عصر
ممنون که جواب می دین اما:




یک DLL در فضای Virtual Address یک پروسس Map میشه. هر ماجول (از جمله DLLها) یک Base Address داره، وقتی DLL در فضای آدرس یک پروسه لود میشه، ویندوز سعی میکنه DLL را در همان Base Address ایی که مشخص شده، لود کنه، ولی اگر اون فضای آدرس اشغال شده باشه، ویندوز DLL را در آدرس دیگه ایی در فضای آدرس پروسه لود میکنه، و آدرس توابع موجود در DLL را برای آن پروسه، متناسب با Base Address جدید، تغییر میده.


ربط import address table به این مطلب رو هم می خوام بدونم(base address و ادرس توابع داخل این جدول قرار می گیره و وقتی dll در base address مپ نشد ادرس توابع موجود رو در داخل IAT عوض می کنه)

و سوال دیگه اینکه وقتی در runtime یه dll رو link می کنیم با LoadLibrary بازم یه map دیگه ایجاد می شه یا از همون ادس map شدهی قبلی استفاده می کنه؟ (با فرض اینکه dll مورد نظر قبلا static mapشده)

vcldeveloper
پنج شنبه 10 تیر 1389, 14:46 عصر
و سوال دیگه اینکه وقتی در runtime یه dll رو link می کنیم با LoadLibrary بازم یه map دیگه ایجاد می شه یا از همون ادس map شدهی قبلی استفاده می کنه؟
تا جایی که من اطلاع دارم، لود کردن یک ماجولی که از قبل لود شده، با LoadLibrary موجب افزایش مقدار Reference Counter اون ماجول میشه، و ماجول مربوطه مجددا لود نمیشه. هر زمان که مقدار Reference Counter یک ماجول صفر بشه، ویندوز اون ماجول رو از حافظه خارج میکنه.


ربط import address table به این مطلب رو هم می خوام بدونم
متوجه نشدم که دقیقا منظورتون چی هست؛ میخواید بدونید که اگر DLL در Base Address خودش لود نشه، چطور آدرس توابع آن در فضای آدرس پروسه مربوطه بر اساس Base Address جدید تنظیم میشه؟
دقت کنید که تغییر Base Address در فضای آدرس همون پروسه انجام میشه، یعنی یک DLL ممکنه در فضای آدرس پروسه های مختلف Base Address مختلفی داشته باشه، و تغییری در ماجول اصلی DLL که در RAM لود شده، ایجاد نمیشه.