تو این مقاله ابتدا بررسی میشه که Registry چیه و سپس نحوه کار با Registry با پایتون بررسی میشه.

رجیستری (Registry) یه Database (پایگاه داده) غولپیکر و مرکزی برای سیستمعامل ویندوزه. فکر کن ویندوز یه آدمه، رجیستری مغز و سیستم عصبیشه. تمام تنظیمات، گزینهها، اطلاعات مربوط به سختافزار، نرمافزار، تنظیمات کاربرها و خلاصه هرچیزی که ویندوز برای درست کار کردن بهش احتیاج داره، به صورت خیلی مرتب و دستهبندی شده توی رجیستری ذخیره شده. مثلا:
اینکه پسزمینه دسکتاپت چه عکسی باشه.
وقتی روی یه فایل txt. دوبار کلیک میکنی، با چه نرمافزاری باز بشه (مثلا Notepad).
کدوم برنامهها اجازه دارن موقع روشن شدن کامپیوتر خود به خود اجرا بشن.
اطلاعات لایسنس نرمافزارهات.
تنظیمات درایورهای سختافزاری مثل کارت گرافیک و صدا.
همهی اینا و هزاران هزار تنظیم دیگه، توی رجیستری نوشته شدن.
چرا اصلا ویندوز به رجیستری نیاز داره؟
شاید بپرسی چرا همهی این تنظیمات توی یه فایل متنی ساده ذخیره نمیشن؟
قدیما همینطور بود. هر برنامهایی تنظیمات خودشو توی فایلهای جداگونهای به اسم INI ذخیره میکرد. این کار چندتا مشکل بزرگ داشت:
شلوغی و بینظمی: دهها و صدها فایل تنظیمات مختلف در سراسر هارد دیسک پخش میشدن.
کند بودن: پیدا کردن و خوندن این همه فایل پراکنده زمانبر بود.
عدم استاندارد: هر برنامهایی ساز خودشو میزد و فرمت فایل تنظیماتش فرق داشت.
رجیستری اومد تا این مشکلات رو حل کنه. با داشتن یه پایگاه داده مرکزی و یکپارچه، همهچی منظم و استاندارد شد و دسترسی به اطلاعات با سرعت خیلی خیلی بالاتری انجام میشه.
ساختار رجیستری:
رجیستری یه ساختار درختی و سلسله مراتبی داره. برای اینکه راحت درکش کنی، رجیستری رو مثل یه کمد بایگانی غولپیکر با ۵ تا کشوی اصلی تصور کن.
این ساختار از چند بخش اصلی تشکیل شده:
1 - کَندوها (Hives): اینا همون 5 تا کشوی اصلی کمد ما هستن. هر کدوم از این کندوها، مسئول نگهداری یه بخش بزرگ از تنظیمات سیستم هستن. اسم همشون با HKEY شروع میشه.
HKEY_CLASSES_ROOT (HKCR): اطلاعات مربوط به فایلها. مثلا اینکه فایل mp3. با چه برنامهای باز بشه یا آیکونش چه شکلی باشه.
HKEY_CURRENT_USER (HKCU): مهمترین بخش برای کاربر عادی. تمام تنظیمات مربوط به همین کاربری که الان باهاش وارد ویندوز شدی اینجا ذخیره میشه. مثل عکس دسکتاپ، تنظیمات نرمافزارهات و...
HKEY_LOCAL_MACHINE (HKLM): تنظیمات کلی و سراسری سیستم که به کاربر خاصی ربط نداره. مثل تنظیمات سختافزارها، درایورها و خود ویندوز. این بخش برای همهی Userهای روی سیستم یکسانه.
HKEY_USERS (HKU): اطلاعات پروفایل تمام کاربرهایی که روی این کامپیوتر اکانت دارن اینجا ذخیره میشه. در واقع، HKEY_CURRENT_USER یه جورایی لینک یا میانبُر به یکی از زیرمجموعههای همین کندو هست.
HKEY_CURRENT_CONFIG (HKCC): اطلاعات مربوط به پروفایل سختافزاری فعلی. معمولا کمتر باهاش کار داریم.
2 - کلیدها (Keys): اگه کندوها کشوهای اصلی باشن، کلیدها مثل پوشه داخل اون کشوها هستن. کارشون دستهبندی کردن اطلاعاته. مثلا داخل کندوی HKEY_CURRENT_USER یه کلید به اسم Software وجود داره که تنظیمات نرمافزارها داخل اون قرار میگیره. این کلیدها میتونن داخل همدیگه هم باشن که بهشون میگیم زیرکلید (Subkey).
3 - مقدارها (Values): اینا دیگه اصل مطلب هستن. مقدارها اطلاعات و تنظیمات نهایی هستن که مثل برگههای کاغذ داخل اون پوشهها قرار دارن. هر مقدار (Value) از سه بخش تشکیل شده:
نام (Name): یه اسم برای اون تنظیم.
نوع (Type): نوع دادهای که ذخیره میشه. مثلا متنه، عدده یا چیز دیگه.
داده (Data): مقدار واقعی اون تنظیم.
معروفترین انواع داده (Type) اینا هستن:
REG_SZ: برای ذخیره کردن یه متن ساده (String). مثلا آدرس یه فایل.
REG_BINARY: برای ذخیره دادههای خام و باینری (0 و 1).
REG_DWORD: برای ذخیره کردن یه عدد (معمولا برای تنظیماتی که حالت خاموش/روشن یا 0/1 دارن).
چجوری رجیستری رو ببینیم؟
ویندوز یه ابزار داخلی به اسم Registry Editor یا regedit.exe داره که بهت اجازه میده این ساختار درختی رو ببینی و ویرایش کنی. چجوری بازش کنم؟
دکمههای Win + R رو روی کیبورد بزن تا پنجره Run باز بشه.
توی کادرش تایپ کن regedit و Enter رو بزن.
یه پنجره کنترل دسترسی کاربر (UAC) باز میشه که باید Yes رو بزنی.
حالا پنجره رجیستری ادیتور رو میبینی. سمت چپ، ساختار درختی کلیدها (همون پوشهها) و سمت راست، مقدارهای (Value) داخل اون کلید رو نشون میده.
دقت کن:
رجیستری قلب ویندوزه. هرگز چیزی رو که نمیدونی چیه، الکی تغییر نده یا حذف نکن. یه تغییر اشتباه میتونه باعث از کار افتادن یه نرمافزار یا حتی خود ویندوز بشه و دیگه سیستم بالا نیاد! فعلا فقط برای نگاه کردن و یادگیری ازش استفاده کن.
یه مثال کاربردی. یکی از اولین کارهایی که بدافزارها میکنن اینه که خودشون رو ماندگار (Persistent) کنن. یعنی کاری کنن که بعد از هر بار روشن شدن کامپیوتر، دوباره اجرا بشن. یکی از معروفترین راهها برای این کار، استفاده از رجیستریه. بدافزار میاد و یه Value از خودش توی این آدرس میسازه:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
هر برنامهایی که آدرس فایل اجراییش توی این مسیر از رجیستری ثبت بشه، ویندوز موقع بالا اومدن به صورت خودکار اجراش میکنه.
چجوری توی رجیستری یه مسیر خاص رو پیدا کنیم؟
کار با Registry Editor (regedit) خیلی شبیه کار با همون File Explorer خودمونه که باهاش فایلها و پوشهها رو میبینی.وقتی regedit رو باز میکنی، دو تا بخش اصلی میبینی:
پنل سمت چپ (همون ساختار درختی): در بالاترین سطح، کندوها (Hives) قرار دارن. کنار هر کندو یه علامت فلش (>) هست. با کلیک روی این فلش، اون کندو باز میشه و کلیدهای (Keys) داخلش رو میبینی. خود این کلیدها هم میتونن زیرکلید (Subkey) داشته باشن که با کلیک روی فلش کنارشون، نمایش داده میشن.
پنل سمت راست: وقتی روی هر کلید یا زیرکلیدی در پنل سمت چپ کلیک کنی، محتویاتش، یعنی مقدارها (Values) توی پنل سمت راست نمایش داده میشه.
چندتا مسیر مهم و کاربردی در رجیستری:
مسیرهای مربوط به استارتآپ و ماندگاری (نقاط داغ برای بدافزارها).
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
کاربرد: لیست برنامههایی که برای کاربر فعلی موقع بالا اومدن ویندوز اجرا میشن. این معروفترین مکان برای ماندگاریه.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
کاربرد: مثل بالایی، ولی برنامههای این لیست برای همه کاربرهای سیستم موقع استارتآپ اجرا میشن. چون روی کل سیستم تاثیر داره، دستکاریش معمولا به دسترسی ادمین نیاز داره.
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
کاربرد: برنامههایی که فقط یک بار موقع استارتآپ بعدی اجرا میشن و بعد از اجرا، کلیدشون از اینجا پاک میشه.
مسیرهای مربوط به تنظیمات ظاهری و کاربر! اینا برای شخصیسازی ویندوز استفاده میشن.
HKEY_CURRENT_USER\Control Panel\Desktop
کاربرد: تنظیمات دسکتاپ اینجا ذخیره میشن. مثلا Value ایی به اسم Wallpaper مسیر عکس پسزمینه دسکتاپت رو نگه میداره. یا Value ای به اسم WallpaperStyle میگه عکس باید کشیده بشه (Stretch) یا وسط قرار بگیره (Center).
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
کاربرد: این مسیر پر از تنظیمات جذاب برای فایل اکسپلوره. مثلا Value ای به اسم Hidden اگه مقدارش 1 باشه یعنی فایلهای مخفی نشون داده بشن و اگه 2 باشه یعنی مخفی بمونن.
مسیرهای مربوط به اطلاعات سیستم و نرمافزارها.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
کاربرد: یه معدن طلا از اطلاعات مربوط به خود ویندوز. چیزهایی مثل ProductName (مثلا Windows 10 Pro)، CurrentVersion (ورژن ویندوز)، RegisteredOwner (نام صاحب سیستم) اینجا پیدا میشه.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
کاربرد: لیست تمام برنامههایی که روی سیستمت نصب کردی اینجا هست. وقتی وارد Control Panel میشی تا یه برنامه رو حذف کنی، ویندوز لیستش رو از اینجا میخونه.
مسیرهای مربوط به تعیین برنامه پیشفرض فایلها.
HKEY_CLASSES_ROOT\.docx
کاربرد: اینجا مشخص میشه که فایلهایی با پسوند docx. از چه نوعی هستن. اگه Value پیشفرضش (Default) رو ببینی، نوشته مثلا Word.Document.12.
HKEY_CLASSES_ROOT\Word.Document.12\shell\open\command
کاربرد: این مسیر به ویندوز میگه وقتی کاربر روی یه فایل ورد کلیک کرد، دقیقا چه دستوری رو با چه پارامترهایی باید اجرا کنه تا اون فایل باز بشه. بدافزارها میتونن این مسیرها رو دستکاری کنن تا به جای برنامه اصلی، خودشون اجرا بشن.
کار با Registry توسط پایتون.
برای کار با رجیستری ویندوز در پایتون، نیازی به نصب هیچ کتابخونهی خارجی نداری. خود پایتون یه ماژول داخلی و قدرتمند به اسم winreg داره که تمام ابزارهای لازم رو در اختیارمون میذاره.
پس اولین قدم توی کدمون، وارد کردن این ماژوله:
import winreg
قبل از اینکه بتونی چیزی رو از رجیستری بخونی یا توش بنویسی، اول باید به کلید مورد نظرت وصل بشی و یه دسترسی ازش بگیری. این کار مثل اینه که قبل از خوندن یه فایل، اول باید اون رو ()open کنی. برای این کار از تابع winreg.OpenKeyEx استفاده میکنیم.
این تابع چندتا ورودی مهم میگیره:
کندو (Hive): کندوی اصلی که کلید ما توش قرار داره. از مقادیر خود ماژول winreg استفاده میکنیم. مثلا:
winreg.HKEY_CURRENT_USER
مسیر زیرکلید (Sub-key Path): آدرس کامل کلیدی که میخوایم باز کنیم.
رزرو شده (Reserved): این پارامتر همیشه 0 هست.
سطح دسترسی (Access): مشخص میکنیم که میخوایم به این کلید فقط برای خوندن دسترسی داشته باشیم یا برای نوشتن هم لازمش داریم. مهمترینها:
winreg.KEY_READ: فقط برای خوندن (پیشفرض).
winreg.KEY_WRITE: فقط برای نوشتن.
winreg.KEY_ALL_ACCESS: دسترسی کامل (خوندن، نوشتن، حذف و...).
بهترین کار اینه که عملیات باز کردن کلید رو داخل یه بلوک with انجام بدیم. اینجوری پایتون خودش حواسش هست که بعد از تموم شدن کارمون، اتصال به کلید رو ببنده و منابع سیستم رو آزاد کنه.
مثال برای درک بهتر: باز کردن کلید معروف Run برای خوندن برنامههای استارتآپ:
import winreg hive = winreg.HKEY_CURRENT_USER path = r"Software\Microsoft\Windows\CurrentVersion\Run" try: with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key: print(f"Successfully opened key: {path}") except FileNotFoundError: print(f"Error! The key '{path}' was not found") except Exception as e: print(f"Error: {e}")
حالا که کلید رو باز کردیم، دو کار اصلی میتونیم باهاش انجام بدیم:
1 - خوندن یک مقدار (Value) مشخص.
2 - لیست کردن تمام مقدارهای داخل یک کلید (Enumeration).
کار اول: برای این کار از تابع winreg.QueryValueEx استفاده میکنیم. این تابع اسم مقدار رو میگیره و مقدار واقعی (Data) اون رو برمیگردونه. کد:
import winreg hive = winreg.HKEY_CURRENT_USER path = r"Software\Microsoft\Windows\CurrentVersion\Run" try: with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key: print(f"Successfully opened key: {path}") value_name = "cmd" # اسم مقداری که میخوای بخونی data, reg_type = winreg.QueryValueEx(key, value_name) print(f"Value Name: {value_name}") print(f"Data: {data}") print(f"Data Type: {reg_type}") except FileNotFoundError: print(f"Error! The key '{path}' was not found") except Exception as e: print(f"Error: {e}")
خروجی:
Successfully opened key: Software\Microsoft\Windows\CurrentVersion\Run Value Name: cmd Data: C:\Windows\system32\cmd.exe Data Type: 1
(من یه دونه مقدار ساختم به اسم cmd که برای دادهی اون آدرس cmd رو وارد کردم تا cmd پس از اجرای سیستم بالا بیاد)
کار دوم: اینجا از winreg.EnumValue استفاده میکنیم که با دادن اندکس، اسم مقدار، نوع و دادهش رو برمیگردونه. تو یه حلقه این کار رو ادامه میدیم تا خطای OSError بیاد (یعنی دیگه مقداری نیست). کد:
import winreg hive = winreg.HKEY_CURRENT_USER path = r"Software\Microsoft\Windows\CurrentVersion\Run" try: with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_READ) as key: index = 0 while True: try: name, data, reg_type = winreg.EnumValue(key, index) print(f"{index}: {name} = {data}") index += 1 except OSError: break # دیگه مقداری وجود نداره except FileNotFoundError: print("کلید پیدا نشد") except Exception as e: print(f"خطا: {e}")
خروجی:
0: MicrosoftEdgeAutoLaunch_FCE02F16768008C88057B9C15E001F4B = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --win-session-start 1: cmd = C:\Windows\system32\cmd.exe
مرحله بعد: نوشتن، ویرایش یا ساختن مقدار جدید توی رجیستری.
تو دنیای بدافزارها، خیلی وقتا دیده میشه که یه بدافزار برای اجرای خودش بعد از ریاستارت سیستم، یه مقدار جدید توی کلید Run میسازه. این دقیقا همون کاریه که ما الان میخوایم تمرینی انجام بدیم (برای اینکار از متد SetValueex استفاده میشه). کد:
import winreg hive = winreg.HKEY_CURRENT_USER path = r"Software\Microsoft\Windows\CurrentVersion\Run" try: with winreg.OpenKeyEx(hive, path, 0, winreg.KEY_SET_VALUE) as key: value_name = "MyName" # اسم مقداری که قراره بسازیم یا ویرایش کنیم value_data = r"C:\Windows\system32\cmd.exe" # دیتای مربوط به اون مقدار winreg.SetValueEx(key, value_name, 0, winreg.REG_SZ, value_data) print("مقدار با موفقیت ثبت شد") except FileNotFoundError: print("کلید مورد نظر پیدا نشد") except Exception as e: print(f"خطا: {e}")
با اجرای این کد یه مقدار با اسم MyName داخل کلید مروبطه ساخته میشه و برای داده اون آدرس cmd.exe ثبت میشه.
نکته. اگه اون مقدار قبلا وجود داشته باشه، مقدارش رو آپدیت میکنه! اگه وجود نداشته باشه، میساز.
(بیشتر از این لازم نیست روی این موضوع وقت بزاریم)