إنشاء نظام لمراقبة تغييرات الملفات باستخدام بايثون

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

مقدمة: لمحة تاريخية

قديماً، كان هناك برنامج لمراقبة ملفات النظام يُدعى “Watchdog”. كان عبارة عن أيقونة كلب تظهر على الحاسوب عندما يقوم شخص ما بتثبيت برنامج على نظامك عن بعد، ليخبرك أنه تم تثبيت برنامج معين ويسألك إذا كنت على علم بذلك. أي أنه كان يراقب تحركات النظام بالكامل. اليوم، سنحاول بناء نظام مشابه لمراقبة الملفات، ومن ثم سنتقدم لمراقبة الخادم، وصولاً إلى مفاهيم مثل “الهوني بوت” (Honeypot) وكيفية اكتشاف المخترقين بمجرد دخولهم إلى ملفات الخادم.

لنبدأ خطوة بخطوة لشرح كل شيء.

التحضير وبيئة العمل

في البداية، سأقوم بإنشاء مجلد على سطح المكتب وسأطلق عليه اسم rt. بعد ذلك، سأفتح محرر الأكواد وأضيف هذا المجلد إليه. داخل المجلد rt، سأقوم بإنشاء ملف جديد باسم 1.py. سأستخدم لغة البرمجة بايثون في هذا المقال.

لأغراض الاختبار، سأقوم بإنشاء مجلد آخر سأقوم بمراقبته. على سبيل المثال، في القرص K:، سأنشئ مجلداً باسم rakoo. هذا المجلد فارغ حالياً، وسنبرمج نظام المراقبة ليعلمنا بأي تغيير يحدث بداخله.

تثبيت المكتبة

المكتبة التي سنستخدمها هي watchdog، وهي تحمل نفس اسم البرنامج القديم الذي ذكرته. لتثبيت المكتبة على نظامك، افتح واجهة الأوامر (CMD) واكتب الأمر التالي:

pip install watchdog

بعد الضغط على Enter، سيتم تثبيت المكتبة. يمكنك البحث عنها عبر الإنترنت لقراءة المزيد من التوثيق الخاص بها. هي متوافقة مع إصدارات ويندوز 3 وما فوق.

كتابة الشيفرة البرمجية

الآن بعد أن عرفنا كيفية تثبيت المكتبة، دعونا نبدأ بالبرمجة. سنحتاج إلى مراقبة عدة أحداث: إنشاء ملف، حذف ملف، تعديل ملف، ونقل ملف. سنحتاج أيضًا إلى التعامل مع الوقت لإرسال النتائج بشكل دوري.

import time
import ctypes
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

def on_create(event):
    """دالة يتم استدعاؤها عند إنشاء ملف أو مجلد."""
    message = f"File Created: {event.src_path}"
    print(message)
    title = "Warning"
    # إظهار صندوق رسالة للمستخدم
    ctypes.windll.user32.MessageBoxW(0, message, title, 0)

def on_delete(event):
    """دالة يتم استدعاؤها عند حذف ملف أو مجلد."""
    message = f"File Deleted: {event.src_path}"
    print(message)
    title = "Warning"
    ctypes.windll.user32.MessageBoxW(0, message, title, 0)

def on_modify(event):
    """دالة يتم استدعاؤها عند تعديل ملف."""
    message = f"File Modified: {event.src_path}"
    print(message)
    title = "Warning"
    ctypes.windll.user32.MessageBoxW(0, message, title, 0)

def on_move(event):
    """دالة يتم استدعاؤها عند نقل ملف أو إعادة تسميته."""
    message = f"File Moved/Renamed: from {event.src_path} to {event.dest_path}"
    print(message)
    title = "Warning"
    ctypes.windll.user32.MessageBoxW(0, message, title, 0)

if __name__ == "__main__":
    # تحديد المسار المراد مراقبته
    path = "K:\\rakoo"
    
    # إنشاء معالج الأحداث
    event_handler = FileSystemEventHandler()

    # ربط الدوال المخصصة بالأحداث المقابلة
    event_handler.on_created = on_create
    event_handler.on_deleted = on_delete
    event_handler.on_modified = on_modify
    event_handler.on_moved = on_move

    # إنشاء كائن المراقبة
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)

    # بدء المراقبة
    observer.start()
    print(f"Starting watchdog for path: {path}")

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        # إيقاف المراقبة عند ضغط المستخدم على Ctrl+C
        observer.stop()
        print("\nWatchdog stopped by user.")
    
    # انتظار انتهاء عمل المراقب قبل إغلاق البرنامج
    observer.join()

شرح الشيفرة

  1. استدعاء المكتبات:
    • import time: للتعامل مع الوقت، وتحديداً لإبقاء السكربت قيد التشغيل.
    • from watchdog.observers import Observer: هذا هو الكلاس الرئيسي المسؤول عن مراقبة الملفات والمجلدات.
    • from watchdog.events import FileSystemEventHandler: هذا هو الكلاس الذي يحتوي على الأحداث التي يمكننا مراقبتها (إنشاء، حذف، تعديل، نقل).
    • import ctypes: للتعامل مع واجهات التطبيقات في نظام ويندوز، وتحديداً لإظهار صندوق الرسائل.
  2. تحديد المسار ومعالج الأحداث:
    • path = "K:\\rakoo": ننشئ متغيراً لتخزين مسار المجلد الذي نريد مراقبته.
    • event_handler = FileSystemEventHandler(): ننشئ نسخة من معالج الأحداث.
    • نقوم بربط كل دالة (on_create, on_delete, on_modify, on_move) بالحدث المناسب في event_handler.
  3. كائن المراقبة (Observer):
    • observer = Observer(): ننشئ كائن المراقبة.
    • observer.schedule(...): نستخدم هذه الدالة لجدولة المراقبة. نمرر لها ثلاثة وسائط:
      1. event_handler: معالج الأحداث الذي سيستجيب للتغييرات.
      2. path: المسار المراد مراقبته.
      3. recursive=True: لجعل المراقبة تشمل المجلدات الفرعية داخل المسار المحدد.
  4. بدء وإيقاف المراقبة:
    • observer.start(): تبدأ عملية المراقبة في خيط منفصل.
    • try...except KeyboardInterrupt: نستخدم حلقة لا نهائية مع time.sleep(1) لإبقاء البرنامج الرئيسي قيد التشغيل. إذا ضغط المستخدم على Ctrl+C، يتم التقاط الاستثناء KeyboardInterrupt.
    • observer.stop(): يتم إيقاف المراقبة.
    • observer.join(): ينتظر البرنامج الرئيسي حتى ينتهي خيط المراقبة تمامًا قبل الخروج.

التجربة والتشغيل

عند تشغيل السكربت، ستبدأ المراقبة فوراً. لنقم بتجربة بعض العمليات داخل المجلد K:\rakoo ونلاحظ ما يحدث في الطرفية.

إضافة الإشعارات المرئية

الاعتماد على الطرفية فقط ليس عملياً دائماً. قد يكون المحرر مصغراً أو قد تتصفح الإنترنت. لذلك، أضفنا وظيفة لإظهار إشعار مرئي (صندوق رسائل) عند حدوث أي تغيير.

لقد استخدمنا مكتبة ctypes المدمجة في بايثون لاستدعاء دالة MessageBoxW من user32.dll في ويندوز.

ctypes.windll.user32.MessageBoxW(0, message, title, 0)

الآن، عند حدوث أي تغيير، بالإضافة إلى طباعة الرسالة في الطرفية، سيظهر صندوق رسائل تحذيري بعنوان Warning يحتوي على تفاصيل التغيير. هذا يضمن أنك ستلاحظ أي نشاط مشبوه على الفور، حتى لو لم تكن تتابع الطرفية بشكل مباشر.

الخاتمة

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

شارك المقال

أحدث المقالات

CONNECTED
ONLINE: ...
SECURE
00:00:00