
ایجاد یک فرآیند
ویندوز API چندین تابع برای ایجاد فرآیندها ارائه میدهد. سادهترین آن CreateProcess است که تلاش میکند یک فرآیند با همان توکن دسترسی فرآیند ایجادکننده بسازد. اگر توکن متفاوتی مورد نیاز باشد، میتوان از CreateProcessAsUser استفاده کرد که یک آرگومان اضافی (اولین) میپذیرد - یک هندل به یک شیء توکن که قبلاً به نحوی به دست آمده است (مثلاً با فراخوانی تابع LogonUser).
سایر توابع ایجاد فرآیند شامل CreateProcessWithTokenW و CreateProcessWithLogonW (هر دو بخشی از advapi32.dll) هستند. CreateProcessWithTokenW شبیه به CreateProcessAsUser است، اما این دو در امتیازات مورد نیاز برای فراخواننده تفاوت دارند. CreateProcessWithLogonW یک میانبر مفید برای ورود با اعتبار یک کاربر مشخص و ایجاد یک فرآیند با توکن به دست آمده در یک مرحله است. هر دو با برقراری یک فراخوانی رویه از راه دور (RPC) به سرویس Secondary Logon (seclogon.dll، میزبانی شده در SvcHost.Exe) برای انجام ایجاد فرآیند واقعی، آن را فراخوانی میکنند. SecLogon فراخوانی را در تابع داخلی SlrCreateProcessWithLogon خود اجرا میکند و اگر همه چیز خوب پیش برود، در نهایت CreateProcessAsUser را فراخوانی میکند. سرویس SecLogon به طور پیشفرض برای شروع دستی پیکربندی شده است، بنابراین اولین باری که CreateProcessWithTokenW یا CreateProcessWithLogonW فراخوانی میشود، سرویس شروع به کار میکند. اگر سرویس قادر به شروع نباشد (مثلاً یک مدیر میتواند سرویس را غیرفعال کند)، این توابع با شکست مواجه خواهند شد. ابزار خط فرمان runas، که ممکن است با آن آشنا باشید، از این توابع استفاده میکند.

جزئیات داخلی پردازش
این بخش ساختارهای داده اصلی پردازش ویندوز را که توسط قسمتهای مختلف سیستم نگهداری میشوند، توضیح میدهد و روشها و ابزارهای مختلف برای بررسی این دادهها را شرح میدهد.
هر پردازش ویندوز با یک ساختار پردازش اجرایی (EPROCESS) نمایش داده میشود. ساختار EPROCESS علاوه بر دارا بودن بسیاری از ویژگیهای مربوط به یک پردازش، شامل و اشاره کننده به تعدادی ساختار داده مرتبط دیگر نیز هست. به عنوان مثال، هر پردازش یک یا چند نخ دارد که هر کدام با یک ساختار نخ اجرایی (ETHREAD) نمایش داده میشوند.
EPROCESS و بیشتر ساختارهای داده مرتبط با آن در فضای آدرس سیستم وجود دارند. یک استثنا، بلوک محیط پردازش (PEB) است که در فضای آدرس کاربر وجود دارد (زیرا حاوی اطلاعاتی است که توسط کد حالت کاربر قابل دسترسی است). علاوه بر این، برخی از ساختارهای داده پردازش که در مدیریت حافظه استفاده میشوند، مانند لیست مجموعه کاری، فقط در بافت پردازش فعلی معتبر هستند، زیرا در فضای سیستم مخصوص پردازش ذخیره میشوند.
برای هر پردازشی که یک برنامه ویندوز را اجرا میکند، پردازش زیرسیستم ویندوز (Csrss) یک ساختار موازی به نام CSR_PROCESS را نگهداری میکند. علاوه بر این، بخش حالت هسته زیرسیستم ویندوز (Win32k.sys) یک ساختار داده برای هر پردازش به نام W32PROCESS را نگهداری میکند که اولین بار که یک نخ، تابع USER یا GDI ویندوز را که در حالت هسته پیادهسازی شده است، فراخوانی میکند، ایجاد میشود. این اتفاق به محض بارگذاری کتابخانه User32.dll رخ میدهد. توابع معمولی که باعث بارگذاری این کتابخانه میشوند عبارتند از CreateWindow(Ex) و GetMessage.
از آنجا که زیرسیستم ویندوز در حالت هسته از گرافیک شتابدهنده سختافزاری مبتنی بر DirectX استفاده زیادی میکند، زیرساخت مؤلفه رابط دستگاه گرافیکی (GDI) باعث میشود که هسته گرافیکی DirectX (Dxgkrnl.sys) ساختار خاص خود را، DXGPROCESS، مقداردهی اولیه کند. این ساختار حاوی اطلاعاتی برای اشیاء DirectX (سطوح، سایهزنها و غیره) و شمارندهها و تنظیمات خطمشی مربوط به GPGPU برای زمانبندی محاسباتی و مدیریت حافظه است.
به جز پردازش بیکار، هر ساختار EPROCESS توسط مدیر اشیاء اجرایی به عنوان یک شیء پردازش کپسولهسازی میشود. از آنجا که پردازشها اشیاء نامگذاری شده نیستند، در ابزار WinObj (از Sysinternals) قابل مشاهده نیستند. با این حال، میتوانید شیء نوع به نام Process را در دایرکتوری \ObjectTypes (در WinObj) مشاهده کنید. یک دستگیره به یک پردازش، از طریق استفاده از APIهای مربوط به پردازش، دسترسی به برخی از دادههای موجود در ساختار EPROCESS و در برخی از ساختارهای مرتبط با آن را فراهم میکند.
بسیاری از درایورها و اجزای سیستم دیگر، با ثبت اعلانهای ایجاد پردازش، میتوانند ساختارهای داده خود را برای ردیابی اطلاعاتی که به صورت "به ازای هر پردازش" ذخیره میکنند، ایجاد کنند. (توابع اجرایی PsSetCreateProcessNotifyRoutine(Ex, Ex2) این امکان را فراهم میکنند و در WDK مستند شدهاند.) هنگام بحث در مورد سربار یک پردازش، اندازه چنین ساختارهای دادهای اغلب باید در نظر گرفته شود، اگرچه به دست آوردن یک عدد دقیق تقریباً غیرممکن است. علاوه بر این، برخی از این توابع به چنین اجزایی اجازه میدهند تا ایجاد پردازشها را ممنوع یا مسدود کنند. این به فروشندگان ضد بدافزار یک راه معماری برای افزودن بهبودهای امنیتی به سیستم عامل، چه از طریق لیست سیاه مبتنی بر هش و چه از طریق سایر تکنیکها، ارائه میدهد.
شکل زیر فیلدهای کلیدی در ساختار EPROCESS را نشان میدهد.

مشابه نحوه تقسیم APIها و اجزای کرنل به ماژولهای ایزوله و لایهای با قراردادهای نامگذاری خاص خود، ساختارهای داده یک فرآیند نیز از طراحی مشابهی پیروی میکنند. همانطور که در شکل بالا نشان داده شده، اولین عضو ساختار فرآیند اجرایی (EPROCESS) "Pcb" (بلوک کنترل فرآیند) نامیده میشود. این یک ساختار از نوع KPROCESS (برای فرآیند کرنل) است. اگرچه روالهای اجرایی اطلاعات را در EPROCESS ذخیره میکنند، اما دیسپچر، زمانبند و کد حسابداری وقفه/زمان - که بخشی از کرنل سیستمعامل هستند - از KPROCESS استفاده میکنند. این امکان وجود یک لایه انتزاعی بین قابلیتهای سطح بالای اجرایی و پیادهسازی سطح پایین آن از برخی توابع را فراهم میکند و به جلوگیری از وابستگیهای ناخواسته بین لایهها کمک میکند. شکل زیر فیلدهای کلیدی در ساختار KPROCESS را نشان میدهد.

اگر از آخرین SDK ویندوز 10 استفاده میکنید، نسخه بهروز شده WinDbg شامل یک لینک مستقیم زیر آدرس PEB خواهد بود که با کلیک روی آن، دستورات .process و !peb به طور خودکار اجرا میشوند.
PEB در فضای آدرس حالت کاربر پردازشی که توصیف میکند، قرار دارد. این ساختار حاوی اطلاعات مورد نیاز لودر تصویر، مدیر پشته و سایر اجزای ویندوز است که باید از حالت کاربر به آن دسترسی داشته باشند؛ ارائه تمام این اطلاعات از طریق فراخوانهای سیستمی بسیار پرهزینه خواهد بود. ساختارهای EPROCESS و KPROCESS فقط از حالت هسته قابل دسترسی هستند. فیلدهای مهم PEB در شکل زیر نشان داده شدهاند.

ساختار CSR_PROCESS حاوی اطلاعاتی در مورد پردازشها است که مختص زیرسیستم ویندوز (Csrss) است. به همین دلیل، فقط برنامههای ویندوز دارای ساختار CSR_PROCESS مرتبط با خود هستند (به عنوان مثال، Smss ندارد). علاوه بر این، از آنجا که هر Session نمونه خاص خود از زیرسیستم ویندوز را دارد، ساختارهای CSR_PROCESS توسط پردازش Csrss در هر Session جداگانه نگهداری میشوند. ساختار اصلی CSR_PROCESS در شکل زیر نشان داده شده.
ساختار W32PROCESS آخرین ساختار داده سیستمی مرتبط با پردازشهاست که بررسی خواهیم کرد. این ساختار شامل تمام اطلاعاتی است که کد مدیریت گرافیک و پنجره ویندوز در هسته (Win32k) برای حفظ اطلاعات وضعیت در مورد پردازشهای رابط کاربری گرافیکی (GUI) نیاز دارد (که قبلاً به عنوان پردازشهایی تعریف شدند که حداقل یک فراخوانی سیستمی USER/GDI انجام دادهاند). ساختار اصلی W32PROCESS در شکل زیر نشان داده شده است. متأسفانه، از آنجا که اطلاعات نوع برای ساختارهای Win32k در نمادهای عمومی موجود نیست، نمیتوانیم به راحتی آزمایشی را برای نمایش این اطلاعات به شما نشان دهیم.

ساختار دادههای مختلف دخیل در دستکاری و مدیریت وضعیت فرآیند و چگونگی بازرسی این اطلاعات توسط ابزارها و دستورات دیباگر را دیدیم. در این بخش، نحوه و زمان ایجاد و پر شدن این ساختار دادهها و همچنین رفتار کلی ایجاد و خاتمه فرآیندها را بررسی میکنیم. همانطور که دیدیم، تمام توابع مستند شده ایجاد فرآیند، در نهایت به CreateProcessInternalW ختم میشوند، بنابراین از اینجا شروع میکنیم.
ایجاد یک فرآیند ویندوز شامل چندین مرحله است که در سه بخش از سیستم عامل انجام میشود: کتابخانه سمت کلاینت ویندوز Kernel32.dll (کار اصلی از CreateProcessInternalW شروع میشود)، Executive ویندوز، و فرآیند زیرسیستم ویندوز (Csrss). به دلیل معماری زیرسیستم چند محیطی ویندوز، ایجاد یک شیء فرآیند Executive (که سایر زیرسیستمها میتوانند از آن استفاده کنند) از کار مربوط به ایجاد یک فرآیند زیرسیستم ویندوز جدا شده است. بنابراین، اگرچه توضیحات زیر در مورد جریان تابع CreateProcess ویندوز پیچیده است، به خاطر داشته باشید که بخشی از کار مربوط به معنای اضافه شده توسط زیرسیستم ویندوز است، در مقابل کار اصلی مورد نیاز برای ایجاد یک شیء فرآیند Executive.
لیست زیر مراحل اصلی ایجاد یک فرآیند با توابع CreateProcess* ویندوز را خلاصه میکند. عملیات انجام شده در هر مرحله به تفصیل در بخشهای بعدی توضیح داده شده است.
۱. پارامترها را اعتبارسنجی کنید؛ پرچمها و گزینههای زیرسیستم ویندوز را به معادلهای بومی آنها تبدیل کنید؛ لیست ویژگیها را تجزیه، اعتبارسنجی و به معادل بومی آن تبدیل کنید.
۲. فایل تصویری (exe.) که قرار است در داخل فرآیند اجرا شود را باز کنید.
۳. شیء فرآیند اجرایی ویندوز را ایجاد کنید.
۴. نخ اولیه را ایجاد کنید (پشته، زمینه و شیء نخ اجرایی ویندوز).
۵. عملیات پس از ایجاد و مقداردهی اولیه فرآیند خاص زیرسیستم ویندوز را انجام دهید.
۶. اجرای نخ اولیه را آغاز کنید (مگر اینکه پرچم CREATE_SUSPENDED مشخص شده باشد).
۷. در بستر فرآیند و نخ جدید، مقداردهی اولیه فضای آدرس را تکمیل کنید (برای مثال، DLLهای مورد نیاز را بارگذاری کنید) و اجرای نقطه ورودی برنامه را آغاز کنید.
شکل زیر نمای کلی از مراحلی را نشان میدهد که ویندوز برای ایجاد یک فرآیند دنبال میکند.

Telegram: @CaKeegan
Bale: @CaKeegan
Gmail : amidgm2020@gmail.com