تنفيذ مراقبة التسجيل باستخدام Delphi5.0تشو هونغتاو، مركز المعلومات، مستشفى شيانغيا الثاني، جامعة الجنوب المركزي مع الشعبية المستمرة للإنترنت، اجتذب أمن الشبكات المزيد والمزيد من الاهتمام. بالإضافة إلى فيروسات الكمبيوتر، تظهر باستمرار على الإنترنت برامج قرصنة مختلفة وبرامج التحكم عن بعد وما إلى ذلك، مما يجعل الناس يشعرون بالقلق أكثر فأكثر بشأن أجهزتهم. إن التنوع والتحديثات المستمرة لهذا النوع من البرامج تجعل من المستحيل حماية جهازك بشكل كامل من خلال الاعتماد على بعض برامج مكافحة الفيروسات وحدها. |
هل هناك أي طريقة جيدة لمنع تثبيت البرامج من مصادر غير معروفة على جهازي؟ الجواب هو إيلاء اهتمام وثيق للتغييرات في ملفات النظام الرئيسية. كما نعلم جميعًا، إذا أراد برنامج ما أن يعمل تلقائيًا عند بدء تشغيل Windows، فهناك ثلاث طرق بشكل عام: |
1. أضف اختصارًا إلى مجموعة [بدء التشغيل] في قائمة ابدأ |
2. إضافة العناصر ذات الصلة إلى Win.ini |
3. أضف قيمة مفتاح تشير إلى نفسك ضمن المفتاح الأساسي HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run في السجل. |
الطريقة الأولى واضحة جدًا ويسهل اكتشافها. لذلك، تستخدم برامج القرصنة العامة الطريقتين الأخيرتين لبدء نفسها. يقدم المؤلف هنا مراقب تسجيل بسيط كتبته بنفسي، والذي يستخدم لمراقبة التغييرات في القيم الأساسية في السجل في الوقت الفعلي لاكتشاف البرامج غير المعروفة المصدر. يمكن للقراء المهتمين مواصلة التحسين على هذا الأساس. |
أفكار برمجية |
تم تطوير هذا البرنامج باستخدام دلفي 5.0. دلفي هي أداة تطوير برامج Windows مرئية سريعة من إنتاج شركة بورلاند، وهي قوية وسهلة الاستخدام. يستخدم البرنامج مؤقتًا لمقارنة السجل في كل وقت معين. عند بدء تشغيل البرنامج، فإنه يحتفظ بنسخة احتياطية من بيانات قيم مفتاح التسجيل الأصلية، ثم يقارنها بقيم المفتاح الحالية بانتظام، وفي حالة العثور على أي تغييرات، تتم مطالبة المستخدم بالتحقق. |
تنفيذ البرنامج |
1. قم بإنشاء مشروع PROject جديد في دلفي وأعد تسمية Form1 إلى FormMain |
2. ضع مؤقت التحكم TTimer على FormMain واحفظ المشروع باسم PiRegWatch.Dpr |
3. قم بتعديل الكود في PiRegWatch.Dpr: |
application.Initialize; |
Application.CreateForm(TFormMain, FormMain); |
// لا تعرض النافذة الرئيسية عند بدء التشغيل |
Application.ShowMainForm:=False; |
Application.Run; |
إضافة عدة كائنات إلى FormMain. |
الكائنالنوعالوصف |
يتم استخدام RegTregistry للوصول إلى السجل |
IniFileTiniFile يستخدم لحفظ بيانات التسجيل الأصلية |
السجلTstringListالسجل المستخدم لتسجيل التغييرات |
يتم استخدام RegKeysTstringList لتخزين اسم المفتاح الأساسي ضمن فرع التشغيل |
4. احتفظ ببيانات التسجيل الأصلية في حدث FormMain:OnCreate، ويكون الرمز الرئيسي كما يلي: |
… |
self.Reg:=TRegistry.Create; |
مع self.Reg تفعل |
يبدأ |
RootKey:=HKEY_Local_Machine; |
إذا كان OpenKey('Software/Microsoft/Windows/CurrentVersion/Run'، خطأ) |
ثم |
يبدأ |
RegKeys:=TSTringList.Create; |
GetValueNames(RegKeys); // احصل على جميع أسماء المفاتيح الأساسية ضمن Run |
إذا لم يكن self.IniFile.SectionExists('RunList') ثم // إذا لم يتم حفظ أي بيانات |
يبدأ |
for i:=0 to Regkeys.Count-1 do // احفظ البيانات الأصلية |
إذا (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
أو (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
ثم ابدأ |
value:=self.Reg.ReadString(RegKeys.Strings[i]); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],value); |
نهاية؛ |
نهاية؛ |
نهاية؛ |
نهاية؛ |
… |
5. قم بإضافة التعليمات البرمجية لمقارنة التسجيل في الحدث TTimer1.OnTmer. الرمز الرئيسي هو كما يلي: |
الإجراء TFormMain.Timer1Timer(Sender: TObject); |
فار ط:عدد صحيح؛ |
RegVal,IniVal:string; |
يبدأ |
self.Timer1.Enabled:=False; |
self.Reg.GetValueNames(RegKeys); |
for i:=0 to RegKeys.Count-1 do //تحقق من قيم المفاتيح المضافة والمعدلة حديثًا |
إذا (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
أو (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
ثم ابدأ |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
إذا RegVal<>IniVal ثم |
يبدأ |
self.LogMsg('إضافة عنصر:'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); |
يحاول |
//مستخدم موجه |
SendMsg('ABC','','تم تغيير السجل: عناصر جديدة'+RegKeys.Strings[i]+'='+RegVal); |
أخيراً |
نهاية؛ |
نهاية؛ |
نهاية؛ |
self.IniFile.ReadSection('RunList',RegKeys); |
for i:=0 to RegKeys.Count-1 do //تحقق من قيم المفاتيح المحذوفة |
يبدأ |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
إذا self.Reg.ValueExists(RegKeys.Strings[i]) و |
((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
أو (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString)) |
ثم |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
آخر |
RegVal:=''; |
إذا (IniVal<>'') و (RegVal='') إذن |
يبدأ |
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
يحاول |
SendMsg('ABC','','تم تغيير السجل: تم حذف العنصر'+RegKeys.Strings[i]+'='+IniVal); |
أخيراً |
نهاية؛ |
نهاية؛ |
نهاية؛ |
self.IniFile.UpdateFile; |
self.Timer1.Enabled:=True; |
نهاية؛ |
6. تنفيذ تحرير الكائن وأعمال التنظيف الضرورية في الحدث FormMain:OnClose |
الإجراء TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); |
يبدأ |
إذا تم تعيينه (self.Reg) ثم self.Reg.Free؛ |
إذا تم تعيينه (self.IniFile) ثم self.IniFile.Free؛ |
إذا تم تعيينه (self.LogFile) ثم self.LogFile.Free؛ |
إذا تم تعيينه (self.RegKeys) ثم self.RegKeys.Free؛ |
نهاية؛ |
بعد التشغيل الفعلي، يمكن لهذا البرنامج بالفعل أن يلعب دورًا معينًا في اكتشاف البرامج غير المعروفة المصدر. وبطبيعة الحال، فإن وظيفتها أيضًا فردية جدًا، وإذا تم تحسينها بشكل أكبر وإضافة التغييرات في الملفات الرئيسية الأخرى لنظام المراقبة، فسيكون التأثير أفضل. نأمل التواصل مع القراء المهتمين. |