PDA

View Full Version : مشکل با کد سطح کرنل



r00tkit
شنبه 24 مهر 1389, 14:06 عصر
سلام

کد زیر برای تغییر حالت Cpu هستش

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



Unhandled exception at ......: 0xC0000096: Privileged instruction.


یه درایور نوشتم :




#include <ntddk.h>


NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
__asm
{

MOV EAX,CR0
OR AL,1
MOV CR0,EAX

}
DbgPrint("Hello, World\n");

return STATUS_SUCCESS;
}


build و نصبش کردم وقتی start می کنم هیچ تغییری احساس نمی کنم

فکر کنم کلا" یه جایی رو متوجه نشدم

Mehdi Asgari
شنبه 24 مهر 1389, 14:49 عصر
بیت اول CR0 اسمش Protection Enable هست (یعنی 1 بودن اون به معنای Protected Mode و 0 بودنش یعنی Real Mode)
تو در کد بالا داری PE رو ست می کنی؛ خب، این فلگ قبلا ست شده هست و تو انتظار داری چه تفاوتی رو مشاهده کنی ؟

r00tkit
شنبه 24 مهر 1389, 15:53 عصر
درسته باید 0 قرار داده بشه ولی بازم چیزی نشد

من انتظار داشتم سیستم کراش کنه یا یه پیغامی چیزی بده چون windows تو حالت PM کار می کنه و cpu رفته تو RM

مشکل از درک مباحثه باید یه بار دیگه منابع رو با دقت بخونم

ممنون

pswin.pooya
شنبه 24 مهر 1389, 17:28 عصر
برای اینکه کد بالا کار کنه برنامه باید توی رینگ صفر (سطح کرنل) اجرا شه که به جزء کرنل خود ویندوز و یا لینوکس و هر سیستم عامل دیگه هیچ پروسسی حتی درایورها توی این سطح اجرا نمی شن.

r00tkit
شنبه 24 مهر 1389, 18:17 عصر
اگه نوشته های مارک رو قبول دارید:

windows internal


Device drivers are loadable kernel-mode modules (typically ending in .sys) that interface
between the I/O manager and the relevant hardware. They run in kernel mode

ویندوز فقط 2 سطح رو پشتیبانی می کنه اگه kernel mode نیست ؟ پس کجاست ؟


به عبارت دیگه:

ویکی:


The Kernel-Mode Driver Framework (KMDF) is a driver framework developed by Microsoft as a tool to aid driver developers create and maintain Kernel mode (http://en.wikipedia.org/wiki/Kernel_mode) device drivers for Windows 2000 (http://en.wikipedia.org/wiki/Windows_2000)[1] (http://en.wikipedia.org/wiki/KMDF#cite_note-win2k-0) and later releases

pswin.pooya
شنبه 24 مهر 1389, 18:32 عصر
چرا بیخودی دلیل میاری.

هر PC از 386 به بعد چهار سطح سخت افزاری داره. که بهش رینگ میگن. موقع بوت رینگ صفر که بهش سطح کرنل میگن روی کار هستش این سطح میتونه کلیه تنطیمات و ذستورات رو اجرا کنه. ویندوز و سیستم عاملهای دیگه توی این سطح بوت میشن و بعد برای امنیت از سطح شماره یک به عنوان سطح درایورهای سیستمی و برنامه های سیستمی استفاده میکنن که فقط قابلیت تبادل با IO رو دارن که خود کرنل ابن قابلیت رو با دستکاری یک ریجیستر که اسمش یادم نیست به اون سطح میده. حالا وقتی شما درایور میسازید نصبت به برنامه های عادی مجوزهای بیشتری دارید اما تمام مجوزهای لازمه رو ندارید که بتونید به اصطلاح خودتون خراب کاری به بار بیارین. چون این رینگ به رینگ صفر از نظر دستورات نزدیک هست معمولا بهش سطح کرنل گفته میشه اما خود کرنل جای دیگه هست و قابلیتهای دیگه داره.

ضمننا هیچ کسی به جرء تیم توسعه نمی تونه اطلاعات پایه ای رو بیرون بده که همچین تیم توسعه MS رو با پول و قراداد و ... محدودشون کردن که طرف حتی جرات نمیکنه بگه من توی MS کار میکنم. مطمئن باش ویندوز هم همچین در پیت نیستش که بیاد و همچین کار ناشیانه ای انجام بده. بیشتر باگها و مواردی که باعث میشن برنامه ها داخل ویندوز خودشون رو به جای کرنل جا بزنن به نحوه فراخوانی syscallها بر میگرده که با gateها کنترل میشن. و توی بعضی از مستندات توسعه سیستم عاملی PC به این موضوع هم اشاره شده که برنامه های مخرب میتونن با کرک اونها خودشون رو به جای کرنل جا بزنن. و برعکس ویندوز، لینوکس از وقفه ها استفاده میکنه که باعث میشه سطح رینگ برنامه مقصد و مبدا فراخوانی کننده رو به صورت سخت افزاری و نرم افزاری کنترل کنه.

r00tkit
شنبه 24 مهر 1389, 20:07 عصر
اولا" با خودی دلیل اوردم

بخش اول متنت رو خوندم با کمی تغییر می شه:

/.

پردازنده های مبتنی بر IA32 چهار سطح دسترسی دارند . سطح اول یا Ring0 دارای مجوز کامل دسترسی به تمام امکانات پردازنده Ring1 و Ring2 و Ring3 هم به ترتیب دارای دسترسی های محدودتری به پردازنده هستند . چون ویندوز و بسیاری از سیستم عاملهای مدرن غیر از IA32 برای سایر مدلها نیز طراحی شده اند و بسیاری از پردازنده های فقط دو یه سه سطح دسترسی برای پردازنده قائل هستند ، عموم سیستمهای عامل دارای صرفا" دو جزء Ring0 و Ring3 هستند ( که لزومی برای بازنویسی کد برای هر معماری سخت افزاری وجود نداشته باشه ؛ مثلا معماری آلفا که با IA32 متفاوت است )

./

بخش دوم متنت رو هم یه ویرایش بکن تا متوجه منظور دقیق بشم

pswin.pooya
شنبه 24 مهر 1389, 20:29 عصر
برنامه که توی رینگ صفر اجرا میشه مجوزهای بقیه رینگهای رو به دلخواه صادر میکنه. فقط بعضی از توابع و ثباتها هستند که توی رینگ صفر اجرا میشن. و توی مابقی قابل دسترسی نیستد. همه این موارد توی GDT ( Global des tabel) مشخص میشه. بعد از اینکه GDT ساخته شد و همینطور مواردی مثل pic و pit برنامه ریزی شدند دیگه جدول بردار وقفه real mode و موارد دیگه اون به طور کل بهم میریزه و برگشت تا حد زیادی غیر ممکن و به درد نخور میشه. (هر چند اگر کرنل باشه میتونه سوئیچ رو انجام بده اما دیگه real mode به دردش نمی خوره مگر اینکه تمام موارد رو به حات قبل بتونه برگردونه).


چون ویندوز و بسیاری از سیستم عاملهای مدرن غیر از IA32 برای سایر مدلها نیز طراحی شده اند و بسیاری از پردازنده های فقط دو یه سه سطح دسترسی برای پردازنده قائل هستند ، عموم سیستمهای عامل دارای صرفا" دو جزء Ring0 و Ring3 هستند

موردی که شما داری بهش اشاره میکنی. user space و kernel space هست که به نطر من بطور کل قضیه اونها با مود کرنل یا رینگ صفر فرق میکنه. بازم میگم برای اینکه درایورها امکانات بیشتری داشته باشن همچین تفاوتی رو قائل میشن دیگه کنترل کل سیستم رو بهشون نمی دن. اگر قبول نداری میتونی تست کنی (که ظاهرا هم کردی)

مورد دیگه اینه که برای پورت شدن به پلتفرمهای مختلف معمولا یه لایه جدا به اسم HAL ( Hardware abstraction layer ) می نویسن که یکسری از مواردی رو که مال یک پلتفرم خاص هست انجام بده. مثل ساخت بردار وقفه اون پلتفرم و همینطور برای سخت افزارهای جانبی درایورها رو مینویسند که بطور کل از دسترسی اونها به cpu جلوگیری میکنن . سعی میکنن که بقیه کد کاملا مستقل از پلتفرم باشه. نه اینکه همه چیزها رو یکی بگیرن. مثلا من سه سطح به صورت نرم افزاری در نظر میگیرم حالا توی یک پلتفرم دو سطح بیشتر وجود نداره. کاری که میکنم اینه که دو سطح بالا رو می دم به رینگ 1 یا دو سطح پایین رو میدم به رینگ صفر. و داخل یه پلتفرم مثل x86 چهار سطح وجود داره که دیگه مشخص هستش چی کار میکنم.

من خودم روی دیزاین HAL سیستم عاملم حدود یکسال کار کردم تا به تونم کاملا abstract کنمش اما کم کم به این نتیجه رسیدم که کلا باید مدولار بیس عمل کنم و به مدولها یکسری مجوزها رو بدم و بقیه موارد که مربوط به cpu هست رو داخل hal انجام بدم.

r00tkit
شنبه 24 مهر 1389, 21:00 عصر
برای قسمت اول ( نمی دونم چرا متوجه نمی شم فکر کنم جمله هات خیلی طولانی هستش)

مورد دوم


user space و kernel space هست که به نطر من بطور کل قضیه اونها با مود کرنل یا رینگ صفر فرق میکنه
:متفکر:


باید توی رینگ صفر (سطح کرنل) اجرا شه که



مورد سوم HAL چیز خوبیه :چشمک:

دوست من منبعی برای اطلاعات بیشتر (معرفی کتاب) نداری؟؟؟

دارم windows internal رو می خونم کتاب Protected Mode Software Architecture هم تو صفه

به نظر شما بشینم manual اینتل رو بخونم ؟؟؟ زیاد نیست ؟؟؟

ال لاری اقرا ماسین چوق سورم سنه:لبخند:

pswin.pooya
شنبه 24 مهر 1389, 21:10 عصر
بهترین منبع برای کارهای سیستم عاملی:

ویکی osdev:
http://wiki.osdev.org/Main_Page

و فروم osdev بهترین جا برای پرسیدن سوالهاست:
http://forum.osdev.org/

Mehdi Asgari
یک شنبه 25 مهر 1389, 10:43 صبح
کد درایور های ویندوز در سطح کرنل یا رینگ صفر اجرا میشه؛ ولی ، این که "هر کاری" رو نمی تونن انجام بدن، برای اینه که برای انجام بدوی ترین کارها، نیازمند سرویس های ارائه شده توسط کرنل ویندوز هستن. شما حتی می تونی برای ارتباط با سخت افزار از HAL استفاده نکنی.
در مورد سویچ بک کردن به real mode همونطور که پویا گفت، باید یه سری کارها روانجام بدی (مراجعه شود به
Intel 64 and IA-32 Architectures Software Developer's Manual
Volume 3A: System Programming Guide, Part 1
Section 8.9.2: Switching back to Real-Address Mode
)
اونطور که پیداست این دوستمون تخصصشون بیشتر در مباحث پایه ای سیستم عامل و معماری و ایجاد سیستم عامل (و مباحث مربوطه) هست و فروم و سایتی هم که معرفی کرد در همون راستا بود. اگر میخوای برای کرنل ویندوز، درایور بنویسی این کتب اکیدا توصیه میشه
Windows Internals
Rootkit Arsenal
Windows NT Device Driver Development
Programming the Microsoft Windows Driver Model
The Windows 2000 Device Driver Book, A Guide for Programmers, Second Edition
و تمام manual های اینتل (جلد 1 و 3)
یه سری فروم هم مثل osronline هستن که فقط مخصوص کرنل ویندوز هستند.


ضمننا هیچ کسی به جرء تیم توسعه نمی تونه اطلاعات پایه ای رو بیرون بده که همچین تیم توسعه MS رو با پول و قراداد و ... محدودشون کردن که طرف حتی جرات نمیکنه بگه من توی MS کار میکنم.
به غیر از مارک راسینویچ و کتاب ها و مقالاتش، مراجعه شود به Channel 9 مایکروسافت و ویدئو ها رو با عباراتی مثل driver یا kernel سرچ کنید