التعامل مع الريجستري في الويندوز من خلال لغة البايثون
نظام تشغیل مایكروسوفت ویندوز هو النظام الأكثر انتشارًا في العالم مما یجعله الأكثر عرضة للقرصنة ومحاولات الإختراق من قبل المخترقین. نتیجةً لذلك، أصبح تخصص التحقیق الجنائي الرقمي رائجًا بشكل ملحوظ في السنوات الأخیرة. یقوم المحققون الجنائیون “الرقمیون” بعملیة البحث في الملفات المخفیة داخل النظام والتي یقوم نظام ویندوز بشكل ممتاز، بتسجیل جمیع الحركات وعملیات الاتصال والعملیات الداخلیة، سواء من قبل المستخدم أو النظام نفسة. كل ذلك یتم تسجیله في ملفات التسجیل التي یخفیها النظام بعنایة. في هذا المقال من بايثونات سنتعلم كیف نصل لملفات الريجستري في الويندوز ونستعرض محتویاتها.
اظهار ملفات الريجستري في الويندوز
یمكن إظهار تلك الملفات في ویندوز عن طریق تنفيذ أمر regedit في موجه الأوامر run:
تُظهر الصورة أعلاه مفتاح الخلیة HKEY_LOCAL_MACHINE وما یوجد في داخله من مفاتیح و قیم، وهي ببساطة مجلدات و ملفات تسجل جمیل التحركات وما یحدث داخل نظام التشغیل سواء الناتجة من تفاعل المستخدم المباشر أو تفاعل النظام مع أي جهة خارجیة عن طریق اتصالات الشبكة.
تماما كما في لغة البایثون و قوامیسها من حیث المبدأ، أنه لكل مفتاح قیمة، نجد أن جمیع تلك المجلدات تسمى مفاتیح والملفات تسمى قیم. من الممكن أن یحتوي المفتاح الواحد على عدة مفاتیح في داخلة و قیم. لنفهم أولاً ماذا یوجد لدینا وماهي الوظائف والعملیات التي یمكننا استخدامها لتحقیق ذلك.
لتحقيق ذلك، لابد من الاستعانة بأدوات خارجیه تمكننا من تصدیر تلك المفاتیح بشكل یسهل الولوج لمحتویاتها عن طریق بایثون. سنحتاج أولا لأداة regfileExport المجانیة التي یمكن الحصول علیها من الرابط التالي:
نحتاج لاتباع تعلیمات الاستخدام لتصدیر ملفات التسجیل من خلال الأداة. نحن لسنا بصدد تعلم ذلك الآن ولكننا بصدد كشف محتویات بعض المفاتیح والقیم بواسطة بایثون.
لهذا المقال، استخرجنا المفتاح SOFTWARE من خلال الأداة، وسنقوم بالتجول فیه وعرض محتویاته.
التعامل مع الريجستري في الويندوز من خلال البايثون
سنحتاج إلى تثبیت مكتبة python-registry من خلال الأمر التالي:
pip install python-registry
والأن لنتعرف على ما یوجد بشكل عام ونفهم كیفیة الوصول لمفاتيح وقيم الريجستري في الويندوز عن طریق ما تقدمه مكتبة python-registry.
و نلخص أهم وظائفها التي سنحتاجها هنا كما یلي:
جدول العملیات على المفاتیح (المجلدات):
العملية
الوصف
key.path()
لعرض مسار المفتاح الحالي
key.subkey(“")
للوصول لمتحویات مفتاح معین
key.subkeys()
للوصول للمفاتیح الداخلیة للمتاح الحالي
key.value(“")
للوصول لقیمة المفتاح الذي یحتویها
key.values()
للوصول لجمیع القیم الموجودة داخل المفتاح الحالي
جدول عملیات القیم (الملفات):
العملية
الوصف
value.name()
لعرض إسم القیمة
value.value_type_str()
لعرض نوع القیمة
value.value(“")
لعرض القیمة نفسها )ما تحتویه من معلومات(
والآن لنكتب بعض البرامج التي تعرض لنا المحتویات التالیة كما في المسار في الصورة:
# استیراد فئة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)
ممتاز والآن لنختبر المزید بشكل آخر لمسار آخر ونستعرض المفاتیح الفرعیة فیه:
[<Registry.Registry.RegistryKey object at 0x104496940>]
ممتاز له مفتاح فرعي واحد، وذلك المفتاح له قیم ألیس كذلك؟ لنختبر قیمة الإسم لدیه ولنضف سطرا یقوم بالمرور على جمیع المفاتیح (في حال كانت أكثر من واحد) لیأخذ أسماءها و یضعها في قائمة. سنستخدم lambda لذلك. قم بإضافة السطر التالي لبرنامجك:
[<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>]
********************
نجد أنه یحتوي على قیم كثیرة، لنختبر طباعة أسماءها وذلك بالمرور علیها بحلقة تكراریة واستدعاء وظیفة الإسم لكل منها. و لكن قبل ذلك، لنستدعي وظیفة عرض المسار:
<Registry.Registry.RegistryValue object at 0x104d1e5c0>
لماذا ذلك؟ مع أننا استدعینا وظیفة طباعة قیمته مباشرة ؟ ببساطة، لأن تلك القیمة تحتوي قیمة تحتوي قیمة بداخلها وكأنها مفتاح بذاته. إذًا سنقوم بالتعدیل التالي لنرى النتیجة:
مهندس حاسب آلي و مدرب معتمد TOT. مدرب للبرمجة بلغة بايثون. باحث و مطور في أمن المعلومات مع شركة كويت هاكرز الكويتية. محاضر في عدة مؤتمرات في مجال أمن المعلومات و البايثون و الهندسة الاجتماعية.