رجیستری مخفیگاه اسرار نرم افزار ((‌فروم ))

آیا مجوز دارید؟
احتمالا تا حالا پیش آمده که نرم‌افزاری که به آن احتیاج داشته‌اید را بعد از صرف زمان زیاد و جستجو‌های مکرر در اینترنت پیدا کنید. سپس آن را با خوشحالی دریافت نموده و پس از نصب آن در حالی که فکر می‌کنید کارتان موفقیت‌آمیز بوده و دیگر مشکلی وجود نخواهد داشت ناگهان این پیغام روبرو شوید: «شما تا 30 روز دیگر می‌توانید از نرم‌افزار استفاده نمایید.»
این‌جاست که با خود فکر می‌کنید هنگامی که مهلت استفاده از نرم‌افزار به پایان رسید آن را پاک کنید و مجددا نصب نمایید تا بتوانید دوباره از آن استفاده کنید. جالب این جاست که حتی با انجام این کار هم برنامه بعد از نصب مجدد متوجه می‌شود که مهلت استفاده شما از آن به پایان رسیده است و اجازه دسترسی بیش از سی روز را نمی‌دهد. اگر برنامه پاک شده، پس به نظر شما این اسرار در کدام مخفیگاه پنهان می‌شوند که حتی با حذف نرم‌افزار و نصب مجدد آن هم توسط برنامه قابل دستیابی هستند و از بین نمی‌روند؟ آیا با خود فکر کرده اید که این گونه نرم‌افزارها از کجا و به چه شکل مجوز دسترسی ما را برای استفاده کنترل می‌کنند؟
اگر برنامه نویس هستید شاید تا به حال به این فکر افتاده باشید که برای برنامه‌های خود چنین امکانی را ایجاد کنید تا کاربرانی که نرم‌افزار شما را خریداری نکرده‌اند فقط بتوانند برای مدت زمان محدودی از آن استفاده نمایند. در این مقاله ما توضیح خواهیم داد که چطور می‌توانید این کار را انجام دهید.

گاهی اوقات می‌خواهیم تنظیماتی را متناسب با دستگاه کاربر و روی همان سیستم اعمال نماییم و گاهی پیش می‌آید که بخواهیم برنامه ما اثراتی روی کامپیوتر کاربر از خود به جای بگذارد. مثلا ممکن است برنامه‌ای نوشته باشیم که می‌خواهیم حداکثر یک هفته روی هر دستگاهی که نصب می‌شود اجرا شود و بعد از آن غیر فعال گردد. در دنیای برنامه نویسی دات‌نت چندین روش برای ذخیره تنظیمات برنامه وجود دارد. اولین روش، ذخیره‌سازی مقادیر مورد نیاز تنظیمات در یک پایگاه داده است. این روش توصیه نمی‌شود زیرا قابلیت جابجایی آن پایین و دسترسی به آن دشوار است. روش دیگر استفاده از بخش تنظیمات در داخل متن برنامه است که روش بهتری است، اما باید متن برنامه هم به همراه خود برنامه منتشر شود و ممکن است این را نپسندید. روشی که کاملا مناسب است، استفاده از Registry ویندوز است؛ این روش را در ادامه توضیح خواهیم داد.

آشنایی با رجیستری
رجیستری مرکز اطلاعات مهم ویندوز است. بسیاری از اطلاعات سخت‌افزاری کامپیوتر و درایورهای نصب شده بر روی سیستم و اطلاعات مربوط به نرم‌افزارهایی که نصب شده اند در داخل رجیستری قرار می‌گیرد. به غیر از موارد ذکر شده، رجیستری همچنین شامل اطلاعات مربوط به کاربران ویندوز هم می‌شود. یعنی، تنظیمات هر کاربر در داخل رجیستری نگهداری می‌گردد و هر کدام از کاربران که وارد شوند، تنظیمات مربوط به همان کاربر در ویندوز بارگذاری می‌شود.
نرم‌افزارها نیز در هنگام نصب از رجیستری کمک می‌گیرند تا اطلاعاتی را که به آنها نیاز دارند در آن ثبت نمایند. با نصب هر نرم‌افزار ممکن است در رجیستری تغییراتی حاصل شود و اطلاعاتی در مورد برنامه در آن به رجیستری اضافه شود. برخی نرم‌افزارها خود از رجیستری بهره گرفته و فضایی را در آن برای ثبت اطلاعات مورد نیاز خود به خود اختصاص می‌دهند. یک برنامه ممکن است هنگام نصب در محلی از رجیستری تاریخ نصب خود را ثبت کند و با هر بار اجرا به محل مورد نظر مراجعه کرده و ببیند که آیا از آن تاریخ، مثلا 30 روز گذشته است یا نه. اگر نگذشته بود به اجرا ادامه دهد.
ویندوز نیز در زمان نصب اطلاعات مورد نیاز نصب را در داخل رجیستری قرار می‌دهد و پس از اتمام آنها را از بین می‌برد.
کاربران نیز می‌توانند توسط برنامه ویرایش رجیستری (که regedit نام دارد) در آن تغییر ایجاد کنند. اطلاعاتی به آن بیفزایند و یا اطلاعات موجود در آن را حذف نمایند ولی دستکاری رجیستری بدون داشتن علم کافی به آن خطرناک است و ممکن است باعث شود که ویندوز شما دچار مشکل جدی شود. توصیه می‌شود فقط بخش‌هایی را از رجیستری ویرایش کنید که کاملا به آن آشنا هستید و از عملکردشان خبر دارید.
در این مقاله روشی توضیح داده می‌شود که با آن بتوانید توسط .Net Framework و زبان برنامه نویسی C# داده‌های مورد نیاز خود را در داخل رجیستری قرار دهید، آنها را از رجیستری بخوانید و تغییر دهید و ذخیره نمایید.

ساختار رجیستری
رجیستری یک پایگاه داده با ساختار Hierarchical (سلسله مراتبی یا همان درختی) است که مشابه ساختار فولدرها و فایلها در داخل هارددیسک است. هر شاخه از این درخت چند زیرشاخه دارد.
رجستری در ویندوز اکس‌پی ویندوز XP دارای دو زیرشاخه اصلی به نامهای HKEY_LOCAL_MACHINE و HKEY_USERS است ولی به جهت خوانایی بهتر رجیستری و جستجوی راحت‌تر اطلاعات در آن سه زیرشاخه (SubTree) دیگر به آنها افزوده شده که به این ترتیب هستند:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_CURRENT CONFIG

هر کدام از زیرشاخه‌ها دارای تعداد زیادی کلید اصلی (Key) هستند. کلیدها همانند فولدرها در سیستم فایل هستند و هر کلید در داخل خود میتواند شامل چندین کلید (SubKey) دیگر باشد. در داخل فولدرها، Entryها (ورودی‌ها)‌ قرار می‌گیرند که آن‌ها را می‌توان معادل فایل‌ دانست. در هر کلید می‌توان به هر تعداد دلخواهی ورودی ایجاد کرد. هر ورودی هم سه ویژگی دارد: Name که نام آن است، DataType که نوع آن است و Value که داده‌ای است که درون ورودی ذخیره می‌گردد.

برنامه‌نویسی رجیستری
حالا به سراغ برنامه‌نویسی و تغییر رجیستری در دات‌نت می‌رویم. البته رجیستری مخصوص ویندوز است و در سیستم‌عامل‌های دیگر وجود ندارد؛ پس اگر بخواهید برنامه ای بنویسید که با رجیستری نیز سر و کار داشته باشد برنامه شما مختص ویندوز خواهد شد و در سیستم عامل‌های دیگر عمل نخواهد کرد.
همانطور که احتمالا می‌دانید .Net Framework دارای اسمبلی‌های زیادی است. اسمبلی‌ها به زبان ساده همان کتابخانه‌هایی هستند که شامل تعداد زیادی کلاس بوده و برای برنامه نویسان تهیه شده‌اند تا آنها بتوانند توسط این کلاس‌های از پیش تعریف شده برنامه‌های قدرتمندتر را به شکلی آسان‌تر بنویسند. بسیاری از این کلاس‌ها به برنامه‌نویسان کمک می‌کنند که از دغدغه‌های برنامه نویسی سطح پایین (Low Level Programming) رهایی یابند و درگیر جزئیات نشوند.
برای استفاده از هر کدام از این کتابخانه‌ها در داخل C# باید یک Reference (ارجاع) به اسمبلی آن کتابخانه داشته باشیم. بعد از ایجاد ارجاع به فایل اسمبلی می‌توان از کلاس‌های موجود در آن استفاده کرد. یکی از اسمبلی‌های .Net فایل mscorlib.dll است. این همان فایلی است که کلاس‌های مورد نیاز برای کار با رجیستری در آن قرار دارد. هنگامی که به این اسمبلی ارجاع می‌دهیم باید به داخل NameSpaceی به نام Microsoft.Win32 مراجعه کنیم. این NameSpace در اسمبلی mscorlib تعریف شده و کلاس‌های زیادی در آن قرار داده شده است که برخی از این کلاس‌ها مربوط به برنامه نویسی رجیستری است.
در .Net Framework برای طبقه بندی و نظم کلاس‌ها آنها را بر اساس وظیفه در داخل NameSpaceها قرار داده اند تا دستیابی به آنها آسان‌تر صورت پذیرد.

برای کار با رجیستری دو کلاس به نامهای Registry و RegistryKey تعریف شده است که اساس کار ما را تشکیل می‌دهند. در کلاس Registry چندین فیلد به صورت Static وجود دارد که از نوع کلاس RegistryKey هستند که و هر کدام به یکی از زیرشاخه‌های موجود در رجیستری اشاره دارند.

شما با هر کدام از زیرشاخه‌ها که بخواهید کار کنید باید یک Instance از کلاس RegistryKey ایجاد کرده و آن را برابر با فیلد متناظر آن زیردرخت در کلاس Registry قرار رهید. بطور مثال اگر بخواهید در برنامه خود با زیر شاخه HKEY_CURRENT_USER کار کنید باید کد زیر را باید در برنامه خود بنویسید :

;RegistryKey root = Registry . CurrentUser

هم اکنون می‌توانید با شیء جدیدی که ایجاد کرده اید و به زیردرخت موردنظر اشاره دارد کار کنید.
کلاس RegistryKey دارای متدها و Property‌های زیادی برای دستکاری رجیستری است که به توضیح برخی از آن‌ها می‌پردازیم. به طور کلی برای دستیابی به هر SubTree یا SubKey در دات‌نت از کلاس RegistryKey استفاده می‌کنیم.
برای دسترسی به هر SubKey در داخل  SubTree مورد نظر از متد OpenSubKey() از کلاس Registry استفاده می‌کنیم. این متد یک SubKey موجود را جستجو کرده و آن را در اختیار کاربر می‌دهد. این متد شامل دو پارامتر ورودی است. اولین پارامتر آن از نوع String بوده و آدرس کلیدی است که شما مد نظر دارید. اگر بخواهید در داخل یکی از کلیدها به یک Entry دست پیدا کنید می‌توانید با این متد به مسیر مورد نظر بروید. پارامتر دوم این متد توسط یک مقدار Boolean مشخص می‌کند که آیا SubKey که مسیر آن در پارامتر اول ذکر شده به صورت Writeble باز شود یا خیر که اگر بخواهیم در داخل آن مسیر مقداری را ذخیره کنیم و یا یک SubKey دیگر ایجاد کنیم مقدار این پارامتر را برابر با True می‌گذاریم و اگر تنها به دنبال خواندن باشیم، باید مقدار آن را false قرار دهیم. خروجی این متد نیز از نوع RegistryKey است.  

;(RegistryKey key = root . OpenSubKey("[SubKey Path]", true / false

اگر بخواهیم از نام زیر شاخه‌های موجود در یک SubTree یا یک SubKey مطلع شویم از متدی به نام GetSubKeyNames() استفاده می‌کنیم. این متد یک آرایه از رشته‌ها را برمی‌گرداند که شامل تمامی نام‌های یک زیر شاخه است.

;()String[] subKeyNames = key . GetSubKeyNames

متدی نیز برای دریافت Entryهای موجود در یک SubKey تعریف شده است به نام GetValueNames(). همان طور که گفته شد هر Entry از سه قسمت تشکیل شده که در اینجا ما با دو بخش آن یعنی Name و Value کار داریم. نام تمامی Entryهای SubKey جاری توسط متد GetValueNames() در اختیار ما قرار می‌گیرد و سپس می‌توان با استفاده از متد GetValue که به عنوان ورودی نام یک Entry را دریافت می‌نماید مقدار آن را بدست آورد. نوع خروجی این متد Object است که خودمان باید مقدار آن را به نوع داده مناسب Cast نماییم.

;()String[] valueNames = key.GetValueNames
;([Object value = key.GetValue(valueNames[x

برای ایجاد یک SubKey از متد CreateSubKey() استفاده می‌شود. این متد شامل دو پارامتر ورودی است که اولین پارامتر مشخص‌کننده نام زیر شاخه جدید و دومین پارامتر از نوع شمارشی به نام RegistryKeyPermissionCheck است که معین می‌کند بعد از ایجاد زیر شاخه چه نوع عملیاتی از نظر خواندن و نوشتن می‌توان روی آن انجام داد. خروجی این متد نیز از نوع RegistryKey بوده و همان
زیر شاخه جدید را پس از ایجاد در اختیار ما می‌گذارد.

,"[RegistryKey newSubKey = key . CreateSubKey("[SubKey Name
;([RegistryKeyPermissionCheckItems]

همچنین اگر بخواهیم در مسیر جاری یک Entry ایجاد نماییم از متد SetValue استفاده می‌کنیم. این متد یک مقدار رشته ای که نام Entry را مشخص می‌کند و یک Value را دریافت کرده سپس یک Entry در مسیری که در آن قرار داریم ایجاد می‌نماید.

 ;([newSubKey . SetValue("[Entry Name]" , [Value

برای حذف یک Entry متدی وجود دارد با نام DeleteValue() که توسط نام یک Entry آن را حذف می‌نماید. همچنین برای حذف یک SubKey نیز از متد DeleteSubKey()  استفاده می‌شود. این متد نیز با پارامتر ورودی نام زیر شاخه عمل حذف را انجام می‌دهد.

;("newSubKey . DeleteValue("[Entry Name
;("key . DeleteSubKey("newSubKey

دو متد به نامهای GetValue()و SetValue() نیز در کلاس Registry و به صورت Static تعریف شده اند که کاربرد آنها برای ایجاد یک Entry در داخل SubTreeها به طور مستقیم و یا دریافت مقادیرEntryهای موجود در SubTreeها است.

یک برنامه نمونه
در اینجا می‌خواهیم کدهای مربوط به یک برنامه را به شما نشان دهیم که با اجرای برنامه به یک آدرس از رجیستری مراجعه کرده و در آنجا مقداری را می‌خواند که این مقدار همان مجوز دسترسی ما به برنامه است.
در این برنامه قبل از اجرا تاریخ اولین نصب کنترل شده و در صورت اجازه دسترسی برنامه اجرا می‌شود و در غیر اینصورت برنامه بسته می‌شود.

"شما {0} روز دیگر می‌توانید از برنامه استفاده کنید"

"شما نمی‌توانید از برنامه استفاده کنید"

این چکیده ای از برنامه نویسی روی رجیستری بود و می‌توانید با مراجعه به منابع دیگر مطالب بیشتری راجع به آن بیاموزید ولی توصیه می‌کنم برای هر اقدامی در داخل رجیستری بسیار احتیاط کنید زیرا هر عمل ناسنجیده‌ای ممکن است منجر به صدمه به ویندوز شود.


/ 0 نظر / 9 بازدید