التعامل مع الريجستري في الويندوز من خلال لغة البايثون

التعامل مع الريجستري في الويندوز من خلال لغة البايثون

نظام تشغیل مایكروسوفت ویندوز هو النظام الأكثر انتشارًا في العالم مما یجعله الأكثر عرضة للقرصنة ومحاولات الإختراق من قبل المخترقین. نتیجةً لذلك، أصبح تخصص التحقیق الجنائي الرقمي رائجًا بشكل ملحوظ في السنوات الأخیرة. یقوم المحققون الجنائیون “الرقمیون” بعملیة البحث في الملفات المخفیة داخل النظام والتي یقوم نظام ویندوز بشكل ممتاز، بتسجیل جمیع الحركات وعملیات الاتصال والعملیات الداخلیة، سواء من قبل المستخدم أو النظام نفسة. كل ذلك یتم تسجیله في ملفات التسجیل التي یخفیها النظام بعنایة. في هذا المقال من بايثونات سنتعلم كیف نصل لملفات الريجستري في الويندوز ونستعرض محتویاتها.

اظهار ملفات الريجستري في الويندوز

یمكن إظهار تلك الملفات في ویندوز عن طریق تنفيذ أمر regedit في موجه الأوامر run:

تشغيل امر regedit

تُظهر الصورة أعلاه مفتاح الخلیة HKEY_LOCAL_MACHINE وما یوجد في داخله من مفاتیح و قیم، وهي ببساطة مجلدات و ملفات تسجل جمیل التحركات وما یحدث داخل نظام التشغیل سواء الناتجة من تفاعل المستخدم المباشر أو تفاعل النظام مع أي جهة خارجیة عن طریق اتصالات الشبكة.

تماما كما في لغة البایثون و قوامیسها من حیث المبدأ، أنه لكل مفتاح قیمة، نجد أن جمیع تلك المجلدات تسمى مفاتیح والملفات تسمى قیم. من الممكن أن یحتوي المفتاح الواحد على عدة مفاتیح في داخلة و قیم. لنفهم أولاً ماذا یوجد لدینا وماهي الوظائف والعملیات التي یمكننا استخدامها لتحقیق ذلك.

لتحقيق ذلك، لابد من الاستعانة بأدوات خارجیه تمكننا من تصدیر تلك المفاتیح بشكل یسهل الولوج لمحتویاتها عن طریق بایثون. سنحتاج أولا لأداة regfileExport المجانیة التي یمكن الحصول علیها من الرابط التالي:

RegFileExporter

نحتاج لاتباع تعلیمات الاستخدام لتصدیر ملفات التسجیل من خلال الأداة. نحن لسنا بصدد تعلم ذلك الآن ولكننا بصدد كشف محتویات بعض المفاتیح والقیم بواسطة بایثون.

لهذا المقال، استخرجنا المفتاح SOFTWARE  من خلال الأداة، وسنقوم بالتجول فیه وعرض محتویاته.

التعامل مع الريجستري في الويندوز من خلال البايثون

سنحتاج إلى تثبیت مكتبة python-registry من خلال الأمر التالي:

pip install python-registry

والأن لنتعرف على ما یوجد بشكل عام ونفهم كیفیة الوصول لمفاتيح وقيم الريجستري في الويندوز عن طریق ما تقدمه مكتبة python-registry.

عمليات python-registery

و نلخص أهم وظائفها التي سنحتاجها هنا كما یلي:

جدول العملیات على المفاتیح (المجلدات):

العمليةالوصف
key.path()لعرض مسار المفتاح الحالي
key.subkey(“")للوصول لمتحویات مفتاح معین
key.subkeys()للوصول للمفاتیح الداخلیة للمتاح الحالي
key.value(“")للوصول لقیمة المفتاح الذي یحتویها
key.values()للوصول لجمیع القیم الموجودة داخل المفتاح الحالي

جدول عملیات القیم (الملفات):

العمليةالوصف
value.name()لعرض إسم القیمة
value.value_type_str()لعرض نوع القیمة
value.value(“")لعرض القیمة نفسها )ما تحتویه من معلومات(

والآن لنكتب بعض البرامج التي تعرض لنا المحتویات التالیة كما في المسار في الصورة:

python-registery

أداة تصدير registry

#  استیراد فئةRegistry  من مكتبةpython-registry
from​ Registry.Registry ​import​ Registry

'''
استیراد مكتبة os
للحصول على خدمة تنظیف الشاشة من نظام التشغیل
'''
import​ os

#انشاء كائن تسجیل لیكون الخلیة الكبیرة ذات مسار سوفتویر
registry_hive = Registry(​'SOFTWARE'​)
os.system(​'clear'​) ​# تنظیف الشاشة

#فتح المسار المراد داخل الخلیة للوصول لمفتاح التسجیل المعني
registry_key = registry_hive.open(​'Microsoft\Windows\CurrentVersion'​)

#التجول و عرض محتویات جمیع المفاتیح في المسار
for​ k ​in​ registry_key.values():
	print(​'name : '​,k.name())
	print(​'type : '​,k.value_type_str())
	print(​'data : '​,k.value())
	print(​'\n'​+​'*'​ * ​10​)

ممتاز والآن لنختبر المزید بشكل آخر لمسار آخر ونستعرض المفاتیح الفرعیة فیه:

from​ Registry.Registry ​import​ Registry
import​ os
os.system(​'clear'​)
hive = Registry(​"SOFTWARE"​)
r_key = hive.open(​"Microsoft\Windows NT"​)
print(r_key.subkeys())

لنجد المخرجات كما یلي:

[<Registry.Registry.RegistryKey object at ​0x104496940​>]

ممتاز له مفتاح فرعي واحد، وذلك المفتاح له قیم ألیس كذلك؟ لنختبر قیمة الإسم لدیه ولنضف سطرا یقوم بالمرور على جمیع المفاتیح (في حال كانت أكثر من واحد) لیأخذ أسماءها و یضعها في قائمة. سنستخدم lambda لذلك. قم بإضافة السطر التالي لبرنامجك:

print(list(map( ​lambda​ sub : sub.name() ,r_key.subkeys())))
print(​'\n'​ , ​'*'​ * ​20​)

و المخرجات ستكون:

[<Registry.Registry.RegistryKey object at ​0x10b550908​>]
[​'CurrentVersion'​]

قمنا للوصول لإسم المفتاح الفرعي الوحید CurrentVersion وإضافته في قائمة.

و الآن لنرى ما یحویه من قیم بإضافة الاسطر التالیة:

print(r_key.subkey(​'CurrentVersion'​).values())
print(​'\n'​ , ​'*'​ * ​20​)

المخرجات:

[<Registry.Registry.RegistryValue object at ​0x102ec8a58​>,
<Registry.Registry.RegistryValue object at ​0x102ec8ac8​>,
<Registry.Registry.RegistryValue object at ​0x102ec8b38​>,
<Registry.Registry.RegistryValue object at ​0x102ec8ba8​>,
<Registry.Registry.RegistryValue object at ​0x102ec8c18​>,
<Registry.Registry.RegistryValue object at ​0x102ec8c88​>,
<Registry.Registry.RegistryValue object at ​0x102ec8cf8​>,
<Registry.Registry.RegistryValue object at ​0x102ec8d68​>,
<Registry.Registry.RegistryValue object at ​0x102ec8dd8​>,
<Registry.Registry.RegistryValue object at ​0x102ec8e48​>,
<Registry.Registry.RegistryValue object at ​0x102ec8eb8​>,
<Registry.Registry.RegistryValue object at ​0x102ec8f28​>,
<Registry.Registry.RegistryValue object at ​0x102ec8f98​>,
<Registry.Registry.RegistryValue object at ​0x102ecb048​>,
<Registry.Registry.RegistryValue object at ​0x102ecb0b8​>,
<Registry.Registry.RegistryValue object at ​0x102ecb128​>,
<Registry.Registry.RegistryValue object at ​0x102ecb198​>,
<Registry.Registry.RegistryValue object at ​0x102ecb208​>,
<Registry.Registry.RegistryValue object at ​0x102ecb278​>,
<Registry.Registry.RegistryValue object at ​0x102ecb2e8​>,
<Registry.Registry.RegistryValue object at ​0x102ecb358​>,
<Registry.Registry.RegistryValue object at ​0x102ecb3c8​>,
<Registry.Registry.RegistryValue object at ​0x102ecb438​>,<Registry.Registry.RegistryValue object at ​0x102ecb4a8​>,
<Registry.Registry.RegistryValue object at ​0x102ecb518​>,
<Registry.Registry.RegistryValue object at ​0x102ecb588​>]
********************

نجد أنه یحتوي على قیم كثیرة، لنختبر طباعة أسماءها وذلك بالمرور علیها بحلقة تكراریة واستدعاء وظیفة الإسم لكل منها. و لكن قبل ذلك، لنستدعي وظیفة عرض المسار:

print(r_key.subkey(​'CurrentVersion'​).path())
print(​'\n'​ , ​'*'​ * ​20​)

المخرجات:

ROOT\Microsoft\Windows NT\CurrentVersion

وللأسماء:

for​ v ​in​ r_key.subkey(​'CurrentVersion'​).values():
print(v.name())
print(​'\n'​ , ​'*'​ * ​20​)

لتكون المخرجات على النحو الآتي:

SystemRoot
BuildBranch
CurrentBuild
CurrentMajorVersionNumber
CurrentMinorVersionNumber
CurrentType
CurrentVersion
EditionID
InstallationType
InstallDate
ProductName
ReleaseId
SoftwareType
UBR
PathName
Customizations
BuildLabExBuildLab
ProductId
DigitalProductId
DigitalProductId4
CurrentBuildNumber
BuildGUID
RegisteredOrganization
RegisteredOwner
InstallTime

رائع جدًا،  ولكن قبل الختام لنختبر سطرًا برمجیًا أخیرًا. لنأخذ إسمًا من تلك الأسماء و نطبع قیمته:

print(r_key.subkey(​'CurrentVersion'​).value(​'PathName'​))

و النتیجة:

<Registry.Registry.RegistryValue object at ​0x104d1e5c0​>

لماذا ذلك؟ مع أننا استدعینا وظیفة طباعة قیمته مباشرة ؟ ببساطة، لأن تلك القیمة تحتوي قیمة تحتوي قیمة بداخلها وكأنها مفتاح بذاته. إذًا سنقوم بالتعدیل التالي لنرى النتیجة:

print(r_key.subkey(​'CurrentVersion'​).value(​'PathName'​).value())

و النتیجة C:\WINDOWS
و ستجد نفسك كثیرا في مواقف مماثلة 🙂
البدایة…

 

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *