محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

بررسی تفاوت Process و Thread و مفاهیم Virtual Memory و ...

در این مطلب میخوایم Process ، Thread ، Virtual Memory ، ساختار های داده و فرایند اجرای یک برنامه رو باهم به زبان ساده و مختصر بررسی کنیم : وقتی یک برنامه اجرا میشه بهش پردازش یا Process گفته میشه (مثلا الان Notepad وقتی اجرا بشه و شما توش تایپ کنید یه پردازش محسوب میشه و میتونید از داخل Task Manager ببینیدش ) و هر برنامه از یک یا چند پردازش تشکیل شده ، هر نخ یا Thread میاد و یه قسمت از کد برنامه رو اجرا میکنه 

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

و نخ اون چیزیه که سیستم عامل بهش پردازنده رو اختصاص میده برای محاسبه و در نهایت اجرا شدن برنامه ، هر پردازش ممکنه یک تا چند نخ داشته باشه که درست کار کنن و یا ممکنه این نخ ها باهم در تضاد باشن (چند تا نخ یک قسمت از کد رو اجرا کنن) که معمولا ساختار سیستم عامل و Memory Handling جلوگیری میکنه از تداخل نخ ها حافظه مجازی یه حافظه ایه که به صورت خیالی شکل میگیره برای هر پردازش تا اون پردازش بتونه توی محیط خودش فارغ از بقیه پردازش ها کارشو انجام بده ، ساختار داده مربوط به اطلاعاتی میشه که پردازش ها و نخ ها ازش استفاده میکنن و مربوطه به دیتاهاییه که ذخیره میشه ، مکان اون ها و...


Process یا پردازش چیست؟

گفتیم که به یک برنامه در حال اجرا پردازش یا Process میگن ، به تعریف دقیق تر پردازش یا process یک ظرف یا محتوا یا صندوق یا container هست و هر چیزی که برای اجرای یک برنامه نیازه داخل اون قرار میگیره ، هر اطلاعاتی که یه برنامه نیاز داره به اون برای اجرا شدن از قبیل کتابخونه یا library هایی که برنامه نیاز داره ، هر اطلاعاتی که مربوط میشه به اجرای نخ یا thread ها ، هر اطلاعاتی که مربوط به socket ها میشه (برای برقراری ارتباط با اینترنت ) ، open handles مثل mutexes و... و هر پردازش هم حافظه مجازی یا virtual memory خودشو داره که تمام اطلاعات اون برنامه داخل اون ذخیره میشه (حجمی مطابق حافظه اصلی کامپیوتر (4گیگ برای سیستم های 32 بیتی و..))  و هر پردازش شماره و شناسه منحصر به فرد خودشو داره که توسط اون شناسایی میشه 

Virtual Memory یا حافظه مجازی چیست؟

 ما یه حافظه فیزیکی و واقعی داریم (فرض کنید مثلا یک رم داریم با ظرفیت 4 گیگ) و تمامی پردازش ها داخل این حافظه قرار دارن ویه ID یا شناسه خاصی دارن برای خودشون که توسط این عدد شناسایی میشن ، هر پردازش یک جا از حافظرو گرفته و هر پردازش فقط میتونه بخشی رو از مموری یا حافظه اصلی بخونه که مربوط به خودشه ، مثلا ما الان در این تصویر دوتا پردازش داریم با شناسه های متفاوت که درحال اجرا هستن ، هر کدوم حافظه مجازی خودشون رو دارن که این حافظه مجازی رو پردازنده و سیستم عامل برای اون پردازش اختصاص دادن 

بررسی تفاوت Process و Thread و مفاهیم Virtual Memory و ...

حالا هر پردازش هرچیزی که نیاز داره رو داخل این حافظه مجازی قرار میده و از داخل اون به تمام اطلاعات مورد نیازش دسترسی پیدا میکنه ، اطلاعاتی که داخل حافظه مجازی هستن درواقع بخشیشون در حافظه ram هست و بقیشون توی hard و به صورت رندوم قرار دارن ، ولی موقع خوندن اطلاعات ، یک mapper یا همون WMM ای که داخل عکس هست (همون فِلِش ها) میان و از داخل هارد اشاره میکنن به اطلاعات داخل حافظه اصلی یا همون رم

مثلا شما یه سیستم با رم 4 گیگ دارید و فتوشاپ و اکسل و چند تا نرم افزار رو باز میکنید ، سیستم میاد و به تک تک این برنامه ها یه حافظه مجازی به ظرفیت 4 گیگ اختصاص میده ، فرض کنید فتوشاپ 6 گیگ دیتا داره ، سیستم میاد و مثلا 2 گیگشو میزاره تو رم و 4 گیگ بقیشو میزاره تو هارد ، بعد میره اطلاعات رمو پردازش میکنه و بعد اینکه تموم شد تک تک 4 گیگ رو از هارد میریزه رو رم و پردازششون میکنه !

فرض کنید یک پردازش به یک کتابخونه داخل حافظه مجازی خودش نیاز داره ، وقتی که میخواد اون اطلاعاتو از حافظه مجازی بخونه ، ویندوز با استفاده از WMM میاد و اون اطلاعاتو براش از حافظه واقعی میاره ، خوبی حافظه مجازی اینه که هر پردازش در جای مخصوص خودش اجرا میشه ، یکی دیگه از قابلیتای حافظه مجازی ، Memory Protection هست : در حافظه مجازی ، هر قسمت از دیتا میتونه مجوز و سطح دسترسی خودشو داشته باشه 

مثلا این بخش از حافظه فقط قابل خوندنه یا اون بخش از حافظه فقط قابل خوندن و اجراعه ولی قابل نوشتن نیست ! از اونور شما وقتی داخل حافظه مجازی خودتون هستید ، از طریق WMM فقط به اطلاعات حافظه مجازی خودتون در حافظه فیزیکی و واقعی دسترسی دارید و نمیتونید اطلاعات پردازش های دیگه رو داخل حافظه فیزیکی دست کاری کنید 

با این حرکت خیلی از بدافزار ها قابلیت خودشونو از دست میدن ولی خیلی های دیگه هم از طریق های خاصی این قابلیت رو بایپس میکنن .. حجم حافظه مجازی برای هر پردازش عینا برابر حجم حافظه فیزیکیه (اگر مثلا رم 4 گیگ رو سیستم باشه و 10 تا پردازش در حال استفاده از این حافظه باشن ، 10 تا حافظه مجازی داریم با ظرفیت 4 گیگ )اگر مقدار دیتایی که وارد RAM یا همون حافظه فیزیکی ما میشه بیشتر از حجمش باشه ، حافظه مجازی اون دیتارو در هارد دیسک(HDD-SSD) ذخیره میکنه و WMM از اونجا اطلاعاتو میخونه

Thread یا نخ چیست؟

خب تا اینجا فهمیدیم که ما یه پردازش داریم که همه اطلاعات لازم برای اجرا رو توی خودش داره ، ولی اجرا از کجا اتفاق می افته ؟ نخ یا همون Thread این وظیفه رو بر عهده داره و میاد یه قسمت از کد رو اجرا میکنه (ممکنه یه Thread کل کد رو اجرا کنه 

ممکنه یه قسمت رو اجرا کنه و بقیه قسمت های کد رو Thread های دیگه اجرا کنن یا ممکنه چند تا Thread بخوان یه قسمت از کد رو اجرا کنن ، فرض کنید یه دهن بخواد یه غذا رو بخوره ، ولی از اونور فرض کنید چند تا دهن میخواد یه غذا رو بخوره 😋. سیپیو های جدید میتونن چندین Thread رو همزمان اجرا کنن ولی سیپیو های قدیمی میامدن و Thread هارو یکی یکی اجرا میکردن، Thread ها میان و تمامی منابعی که پردازش ازش استفاده میکنه رو باهم به اشتراک میزارن ، مثل کتابخونه ها ، حافظه ،  socket و ...)

مثلا فرض کنید یه کیلاگر روی سیستم هست ، یه Thread اون قسمت از کدی رو میخونه که منتظر تایپ شماست و اونارو ذخیره میکنه ، یه Thread اون کدی رو میخونه که Socket ای منتظر دریافت دستور از نویسنده اون کیلاگره ، یه Thread قسمتی از کدو میخونه که بعد دریافت مثلا 250 تا کلید ، یک ایمیل به نویسنده اون کیلاگر بفرسته و .. (اگر چند تا Thread یه برنامه رو اجرا کنه اون برنامه سریع تر اجرا میشه نسبت به اینکه یه Thread بخواد کل کد های برنامه رو اجرا کنه  

وقتی یه پردازش چند تا Thread داره و پردازنده اون هارو اجرا میکنه ، هر کدوم از Thread ها به نحو خودشون توی ریجستر ها دست میبرن و مقادیر اون رو تغییر میدن ، مثلا پردازشی مثل Notepad اگر سه تا نخ داشته باشه و نخ اول مقدار eax رو تغییر بده ، نخ دوم اگر بیاد مقدار eax رو تغییر میده و نخ سوم باز مقدار eax رو مجددا تغیر میده و نخ اول اگر اجرا بشه مقدار eax رو میکنه همونی که خودش بوده 

و شما با نگاه کردن به مقدار یک ریجستر در آخر اجرا نمیتونید بفهمید چند تا thread ران شده و.. ، پس وقتی پردازنده یک Thread رو اجرا کرد ، میاد و از تمامی ریجستر ها و مقادیر ها یه Snapshot میگیره و یه جا ذخیرش میکنه و میره سراغ Thread بعدی و اونو اجرا میکنه و در نهایت از اونم یه Snaptshot میگیره .... (در بحث DATA STRUCTURES بیشتر در مورد این ها صحبت میکنیم) و نخ ها حافظه جدای خودشونو ندارن و از حافظه مجازی ای که پردازششون استفاده میکنه استفاده میکنن ، و هر نخ ساختار حافظه خودشو داره (stack,resgiter)

بررسی تفاوت Process و Thread و مفاهیم Virtual Memory و ...

مثلا در بالا در ستون های سمت چپ که یه پردازشو نشون میده با نخ تکی ، وقتی که نخ کد برنامه رو از قسمت text میخونه و میاد توی استک و دیتا هارو اجرا میکنه و میریزه و حذف میکنه و با ریجستر ها کار میکنه ، این حالت ساده و اولیه برنامه ها بوده ولی در ستون های سمت راست پردازشی رو نشون میده که توسط چند نخ داره اجرا میشه و هر نخ استک و ریجستر های خودشو داره (ولی تمام نخ ها کد رو از یه قسمت میخونن)

مثلا در اینجا وقتی دوتا نخ دارن کدی رو اجرا میکنن ، فرض کنید الان دوتا نخ یک قسمت از کد رو اجرا کنن (مثلا در مثال بالا روتین1) ، در پردازنده های جدید نخ ها باهم  هماهنگ (Sync) میشن و در ویندوز دستوراتی هست که اگر چند تا نخ بخوان یک قسمت از کد رو اجرا کنن ، بزارنشون در صف و همزمان باهم اجرا نشن

در عکس بالا دیدید که پردازش یه سری اطلاعات ذخیره میکنه مثل شناسه پردازش ، کاربری که اونو اجرا کرده ، و... و نخ ها هم یه سری اطلاعات ذخیره میکنن و استک و ریجستر های خودشونو دارن ، ولی این اطلاعات دقیقا چی هستن و کجا ریخته میشن و ذخیره میشن ؟

Data Structures یا ساختار داده چیست؟

ما دو دسته ساختارهای داده داریم که یه سریشون متعلق به ما هستن و یه سری دیگشون متعلق به سیستم عامل :

ساختارهای های داده ای که متعلق به ما هستن :

  • TIB (Thread Information Block) : که یه سری اطلاعات داره راجب نخ ها ، اینکه نخ ها کی و کجا شروع شدن و ذخیره شدن ، شناسه نخ ها چیه ، اطلاعاتی که نخ ها تو ریجستر ها ریختن و تمامی این اطلاعات توی حافظه مجازی ذخیره میشه
  • TEB (Thread Environment Block) : مثل مورد قبلی فقط اطلاعات بیشتری از نخ ها داخل این هست
  • PEB (Process Environment Block) : اطلاعاتی راجب پردازش ها ، شناسشون ، زمان و مکان شروعشون ، اطلاعات مروبط به کتابخانه ها ، مسیر های برنامه و .. که این اطلاعات به مراتب مهم تر از اطلاعات مربوط به نخ ها هستن  نکته : این ساختار داده حاوی اطلاعاتیس که به برنامه میگه که آیا داخل دیباگر درحال اجرا شدن هست یا نه و بدافزار نویس ها به کمک این ساختار داده PEB میان و جلوگیری میکنن از اجرای کد داخل دیباگر ها ( یکی از تکنیک های ضد مهندسی معکوس بدافزار هاس)

ساختارهای داده ای که متعلق به سیستم عامل هستن:

  • EProcess (Exclusive Process Block) : اطلاعات بسیار زیاد تری درمورد پردازش ها دارن منتها در اختیار سیستم عامل هست و در اختیار ما نیست ،این اطلاعات داخل حافظه شخصی ویندوز هستن و نه ما  و نه هیچ برنامه ای نمیتونه بهشون دسترسی پیدا کنه ، مثلا اطلاعاتی مثل Mapper یا همون WMM بین حافظه فیزیکی و حافظه مجازی ، مجوز های مربوط به فایل هایی که لود شدن (مثل همون Socket ها ، DLL یا کتابخونه ها و...) و تغییر دادن این ها میتونه به یه بدافزار سطح دسترسی اشتباه بده و باعث بشه سیستم خراب بشه ، این دو خیلی برای روتکیت ها مهم هستن (البته روتکیت ها از ویندوز 8 به بعد خیلی کم شدن بخاطر Kernel Restriction ها و System Private Memory Restriction ها و..)
  • EThread (Exclusive Process Thread) :مثل EProcess ولی مثلا اینجا اطلاعات رجیستر ها و مقادیرشون و حالتاشون رو داره و تعویضشون خطرناکه چون کل اجرای برنامه رو مختل میکنه یا تغییر میده

Process Creation یا ایجاد پردازش چیست؟

حالا میخوایم مراحل اجرای یک برنامه رو به طور ساده بیان کنیم :

فرض کنید میخواید ماشین حساب رو از My Computer اجرا کنید:

  1. داخل My Computer میشید و calc.exe رو اجرا میکنید
  2. برنامه My Computer درواقع یه پردازش داره به اسم Explorer.exe که میاد و یه API Call میکنه ، یعنی میاد و به وسیله Create Process API یک پرادزش دیگه رو صدا میکنه که در اینجا calc.exe هست ، این Create Process API یک تابع داخل ویندوز هست (جزو دستورات داخلی ویندوز هست)
  3. ویندوز شروع به ساخت ساختار داده EProcess میکنه ، داخل حافظه شخصی خودش (Windows Private Memory) و یه شناسه پردازش (Process ID) به calc.exe  و شناسه والد (Parent ID) هم به explorer.exe میده ، به نشانی اینکه چه برنامه ای calc رو اجرا کرده و اطلاعات دیگه ای رو میزاره داخلش
  4. ویندوز میاد و حافظه مجازی رو برای این پردازش میسازه (هم حجم حاقظه فیزیکی اصلی سیستم)
  5. ویندوز میاد و برنامه calc.exe رو داخل این حافظه اجرا میکنه ( map میکنه حافظه مجازی رو با فیزیکی به وسیله WMM و فایل PE(Portable Executable) رو هم داخل حافظه مجازی قرار میده و اجرا میکنه
  6. ویندوز تمامی کتابخونه ها یا Library های مورد نیاز رو هم لود میکنه داخل حافظه مجازی (در این مرحله بیشتر کتابخونه های Third Party رو لود میکنه)
  7. ویندوز اولین نخ رو میسازه و شروع به اجرای پردازش میکنه (و بعدش بقیه نخ هارو)
  8. و نخ اصلی رو میزاره که برنامه رو از نقطه شروعش اجرا کنه ( Entry Point)  ( هر کتابخونه نقطه شروع خودشو داره و هر Thread وقتی میره به کتابخونه ها باید از اون ها شروع کنه

این اطلاعات خیلی مهمه برای یه متخصص تجزیه تحلیل کن بدافزار (تیم ابی) یا بدافزار نویس (تیم قرمز) چون بعدها میخواد Process Injection هارو بشناسه و اون هارو حتی بنویسه مثلا یکی از اون تکنیک ها Process Hollowing هست و بعدها واسه درک اون ها باید این هارو بلد باشه حجم اطلاعات بسیار زیادی بود ، واسه دونستن بعضی از این مفاهیم باید کلی پیش زمینه داشته باشید ولی اگر بعد چند بار خوندن نفهمیدیدشون حتما بپرسید :)


محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

11 شهریور 1400 این مطلب را ارسال کرده

نظرات