Implementierung der Registrierungsüberwachung mit Delphi5.0Zhu Hongtao, Informationszentrum, Zweites Xiangya-Krankenhaus, Central South University Mit der anhaltenden Beliebtheit des Internets hat die Netzwerksicherheit immer mehr Aufmerksamkeit auf sich gezogen. Neben Computerviren tauchen im Internet immer wieder verschiedene Hacker-Software, Fernsteuerungssoftware etc. auf, die den Menschen immer mehr Sorgen um ihre Maschinen machen. Die Vielfalt und die ständigen Aktualisierungen dieser Art von Software machen es unmöglich, Ihren Computer vollständig zu schützen, indem Sie sich allein auf eine Antivirensoftware verlassen. |
Gibt es eine gute Möglichkeit, die Installation von Software aus unbekannten Quellen auf meinem Computer zu verhindern? Die Antwort besteht darin, genau auf Änderungen in wichtigen Systemdateien zu achten. Wie wir alle wissen, gibt es im Allgemeinen drei Methoden, wenn ein Programm beim Start von Windows automatisch ausgeführt werden soll: |
1. Fügen Sie eine Verknüpfung zur Gruppe [Startup] des Startmenüs hinzu |
2. Fügen Sie verwandte Elemente zu Win.ini hinzu |
3. Fügen Sie unter dem Primärschlüssel HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run in der Registrierung einen Schlüsselwert hinzu, der auf sich selbst verweist. |
Die erste Methode ist zu offensichtlich und leicht zu erkennen. Daher nutzen allgemeine Hackerprogramme die beiden letztgenannten Methoden, um sich selbst zu starten. Der Autor stellt hier einen einfachen, von mir geschriebenen Registrierungsmonitor vor, mit dem Änderungen an Schlüsselwerten in der Registrierung in Echtzeit überwacht werden, um Programme unbekannter Herkunft zu erkennen. Interessierte Leser können sich auf dieser Basis weiter verbessern. |
Programmierideen |
Dieses Programm wurde mit Delphi5.0 entwickelt. Delphi ist ein schnelles visuelles Windows-Programmentwicklungstool der Firma Borland. Es ist leistungsstark und einfach zu verwenden. Das Programm verwendet einen Timer, um die Registrierung zu einem bestimmten Zeitpunkt zu vergleichen. Wenn das Programm startet, speichert es eine Datensicherung der ursprünglichen Registrierungsschlüsselwerte und vergleicht diese dann regelmäßig mit den aktuellen Schlüsselwerten. Wenn Änderungen festgestellt werden, wird der Benutzer zur Überprüfung aufgefordert. |
Programmumsetzung |
1. Erstellen Sie ein neues PRoject in Delphi und benennen Sie Form1 in FormMain um |
2. Platzieren Sie ein Timer-Steuerelement TTimer auf FormMain und speichern Sie das Projekt als PiRegWatch.Dpr |
3. Ändern Sie den Code in PiRegWatch.Dpr: |
application.Initialize; |
Application.CreateForm(TFormMain, FormMain); |
//Das Hauptfenster beim Start nicht anzeigen |
Application.ShowMainForm:=False; |
Application.Run; |
Fügen Sie FormMain mehrere Objekte hinzu. |
ObjektTypBeschreibung |
RegTregistry wird für den Zugriff auf die Registrierung verwendet |
IniFileTiniFile wird zum Speichern der ursprünglichen Registrierungsdaten verwendet |
ProtokollTstringListProtokoll zum Aufzeichnen von Änderungen |
RegKeysTstringList wird verwendet, um den Primärschlüsselnamen unter dem Run-Zweig zu speichern |
4. Behalten Sie die ursprünglichen Registrierungsdaten im FormMain:OnCreate-Ereignis bei. Der Hauptcode lautet wie folgt: |
… |
self.Reg:=TRegistry.Create; |
mit self.Reg do |
beginnen |
RootKey:=HKEY_Local_Machine; |
Wenn OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false) |
Dann |
beginnen |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //Alle Primärschlüsselnamen unter Ausführen abrufen |
if not self.IniFile.SectionExists('RunList') then //Wenn keine Daten gespeichert wurden |
beginnen |
for i:=0 to Regkeys.Count-1 do //Speichern Sie die Originaldaten |
if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
oder(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
dann fang an |
value:=self.Reg.ReadString(RegKeys.Strings[i]); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],value); |
Ende; |
Ende; |
Ende; |
Ende; |
… |
5. Fügen Sie den Code zum Vergleichen der Registrierung im TTimer1.OnTmer-Ereignis hinzu. Der Hauptcode lautet wie folgt: |
procedure TFormMain.Timer1Timer(Sender: TObject); |
var i:integer; |
RegVal,IniVal:string; |
beginnen |
self.Timer1.Enabled:=False; |
self.Reg.GetValueNames(RegKeys); |
for i:=0 to RegKeys.Count-1 do //Neu hinzugefügte und geänderte Schlüsselwerte prüfen |
if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
oder (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
dann fang an |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
wenn RegVal<>IniVal dann |
beginnen |
self.LogMsg('Item Add:'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); |
versuchen |
//prompter Benutzer |
SendMsg('ABC','','Die Registrierung wurde geändert: neue Elemente'+RegKeys.Strings[i]+'='+RegVal); |
Endlich |
Ende; |
Ende; |
Ende; |
self.IniFile.ReadSection('RunList',RegKeys); |
for i:=0 to RegKeys.Count-1 do //Überprüfen Sie die gelöschten Schlüsselwerte |
beginnen |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
if self.Reg.ValueExists(RegKeys.Strings[i]) und |
((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
oder (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) ) |
Dann |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
anders |
RegVal:=''; |
if (IniVal<>'') und (RegVal='') then |
beginnen |
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
versuchen |
SendMsg('ABC','','Registrierung geändert: Element gelöscht'+RegKeys.Strings[i]+'='+IniVal); |
Endlich |
Ende; |
Ende; |
Ende; |
self.IniFile.UpdateFile; |
self.Timer1.Enabled:=True; |
Ende; |
6. Führen Sie die Objektfreigabe und notwendige Bereinigungsarbeiten im FormMain:OnClose-Ereignis durch |
procedure TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); |
beginnen |
if Assigned(self.Reg) then self.Reg.Free; |
if Assigned(self.IniFile) then self.IniFile.Free; |
if Assigned(self.LogFile) then self.LogFile.Free; |
if Assigned(self.RegKeys) then self.RegKeys.Free; |
Ende; |
Nach dem tatsächlichen Betrieb kann dieses Programm tatsächlich eine gewisse Rolle bei der Entdeckung von Programmen unbekannter Herkunft spielen. Natürlich ist seine Funktion auch sehr einfach, wenn es weiter verbessert wird und die Änderungen in anderen Schlüsseldateien des Überwachungssystems hinzugefügt werden, wird der Effekt besser sein. Ich hoffe, mit interessierten Lesern kommunizieren zu können. |