آنالیز ساختار ویندوز و روت کیت های سطح هسته-بخش پایانی

اگر کمی با برنامه نویسی کرنل آشنایی داشته باشید، حتما ساختار DRIVER_OBJECT را به خوبی می شناسید. این ساختار دارای فیلدی به نام MajorFunction است که آرایه ای از نوع PDRIVER_DISPATCH که آدرس روتین های مدیریت IRP دریافتی را در خود نگهداری می کند. IRP ها در wdm.h تعریف گردیده اند، نمیخواهیم وارد مبحث برنامه نویسی سطح کرنل شویم پس بیشتر وارد جزییات نمی شویم. اگر بتوانیم به ساختار DRIVER_OBJECT یک درایور دسترسی پیدا کنیم می توانیم عمل هوک را برای IRP های دریافتی آن انجام دهیم و IRP های آن درایور را مشاهده نماییم. ساده ترین راه برای دسترسی به این ساختار استفاده از تابع IoGetDeviceObjectPointer() است. این تابع آدرس Device Object را به عنوان خروجی بر میگرداند و درواقع Driver Object فیلدی از Device Object است.ساختار Device_Object ها را در تصویر زیر میبینیم:

Device_Object

همانگونه که مشاهده می کنیم فیلد NextDevice به دیوایس بعدی اشاره می کند وقتی درایورها به هم متصل شده اند و یک chain تشکیل دهند می توان مقادیر آن را مشاهده نماییم.  هر DeviceObject دارای DriverObject خودش می باشد که در فیلد DriverObject مشخص گردیده است. برای مشاهده درایورها می توانیم از کامند !object \device\ استفاده نماییم که لیستی از کل آبجکت ها را نشان می دهد. سپس برای نمایش استک از کامند  !devstackمی توانیم استفاده نماییم.

!object

همچنین برای نمایش Driver Object و Device object نیز از کامند های !devobj و !drvobj استفاده کنیم.

!drvobj

در تصویر بالا میبینید برای نمایش بهتر همراه جزییات از سطح 2 نمایش اطلاعات می توان استفاده نمود که لیست MajorFunction در ساختار  Driver_Object را برایمان نشان می دهد، در تصویر زیر نیز اطلاعاتی درباره DeviceObject مشاهده می کنیم.

!devobj

یکی دیگر از موارد استفاده از تکنیک DKOM پنهان نمودن درایور است. با استفاده از تابع ZwQuerySystemInformation  و پارامتر SYSTEM_INFOMATION_CLASS  لیست ماژول های بارگذاری شده در کرنل را بدست آوریم. در ساختار Driver Object فیلدی به نام DriverSection وجود دارد. این فیلد دارای ساختار _KLDR_DATA_TABLE_ENTRY می باشد. تصویر زیر را مشاهده کنید:

DriverSection

بعد از بدست آوردن آدرس DriverObject یک درایور، براحتی می توان مقدار فیلد DriverSection آن را مشاهده نماییم که در ساختار ها قابل نمایش این فیلد بصورت زیر است :

سپس اطلاعات موجود در آن آدرس از حافظه ، با قالب ساختار _KLDR_DATA_TABLE_ENTRY مشاهده می کنیم که اطلاعات درباره درایور KSecDD به ما میدهد. با توجه به اطلاعات بدست آمده لیست را از این درایور پیمایش می کنیم و سپس ساختار آدرس گره بعدی را مشاهده می کنیم:

2

در تصویر بالا می بینیم که گره بعدی مربوط به درایور VBoxGuest.sys می باشد. حال روت کیت می تواند با استفاده از تکنیک DKOM در این لیست درایورهای دلخواه خود را حذف نماید. در تصویر زیر می توانید روند انجام این کار راببینید.

 

در این چند پست با روش دیباگ کرنل ، برخی کامندهای WinDBG بهمراه ساختارهای کرنل ویندوز و بطور خلاصه چگونگی سو استفاده روت کیت ها از این ساختار آشنا شدید که این ابتدای کار است. در شماره های بعد تکنیک های مختلف دیگری را مورد بررسی قرار خواهیم داد. بعنوان سخن پایانی به روش های گوناگون برای شناسایی پروسه ها بپردازیم،  مثلا می توان شناسایی پروسه ها در تمامی session های ویندوز را با استفاده از ساختار _MM_SESSION_SPACE انجام داد. لیست هندل ها نیز به پروسه های خود اشاره می کنند و می توان با استفاده از فیلد QuotaProcess ، UniqueProcessld  از ساختار  _HANDLE_TABLE لیست پروسه های مرتبط را بدست آورد، فیلد دیگر در این ساختار HandleTableList است که آدرس گره ابتدایی این لیست را میتوان با استفاده از  HandleTableListHead بدست آورد و با پیمایش آن لیست تک تک پروسه ها را بدست آوریم. هر پروسه شامل تریدها،هندل ها، dll ها و … می شود و پروسه فعالیت خودش را با یک ترید آغاز می کند. هر ترید دارای ساختار ETHREAD می باشد که با بررسی این ساختار می توانیم دریابیم فیلدی از آن  به یک ساختار EPROCESS اشاره می کند و در مقابل نیز در ساختار EPROCESS هم دارای فیلدی به نام ObjectTable  است که به ساختار HANDLE TABLE اشاره می کند. با استفاده از فیلد Cid از ساختار ETHREAD می توانیم به ID پروسه والد و ترید دست یابیم:

Ethead_CID

  با این توصیفات به این نتیجه میتوان رسید که هر روت کیت برای پنهان ماندن خود بایستی همه ساختار ها را تغییر دهد، پس بایستی همه چیز را چک نماییم و اولین تناقض در ساختارها  باعث شناسایی و کشف روت کیت خواهد شد.

 

باشد که رستگارشویم.

AHA

قطره ای از دریای بیکران IT

More Posts

2 thoughts on “آنالیز ساختار ویندوز و روت کیت های سطح هسته-بخش پایانی”

    1. سلام دوست عزیز،
      ممنون لطف دارین، کمترین کاری که میتونیم بکنیم انتشار آموخته ها به دیگران هستش. ان شالله مطالب برای بازدیدکنندگان مفید واقع بشه.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *