Implementación de monitoreo de registro usando Delphi5.0Zhu Hongtao, Centro de Información, Segundo Hospital Xiangya, Universidad Central Sur Con la continua popularidad de Internet, la seguridad de la red ha atraído cada vez más atención. Además de los virus informáticos, constantemente aparecen en Internet diversos programas de piratas informáticos, programas de control remoto, etc., lo que hace que la gente se preocupe cada vez más por sus máquinas. La diversidad y las constantes actualizaciones de este tipo de software hacen imposible proteger completamente su máquina confiando únicamente en algún software antivirus. |
¿Existe alguna buena manera de evitar que se instale software de fuentes desconocidas en mi máquina? La respuesta es prestar mucha atención a los cambios en los archivos clave del sistema. Como todos sabemos, si un programa quiere ejecutarse automáticamente cuando se inicia Windows, generalmente existen tres métodos: |
1. Agregue un acceso directo al grupo [Inicio] del menú Inicio |
2. Agregar elementos relacionados a Win.ini |
3. Agregue un valor de clave que apunte a usted mismo en la clave principal HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run en el registro. |
El primer método es demasiado obvio y fácil de detectar. Por lo tanto, los programas de hackers generales utilizan los dos últimos métodos para iniciarse. El autor aquí presenta un monitor de registro simple escrito por mí mismo, que se utiliza para monitorear los cambios en los valores clave en el registro en tiempo real para descubrir programas de origen desconocido. Los lectores interesados pueden mejorar aún más sobre esta base. |
Ideas de programación |
Este programa está desarrollado utilizando Delphi5.0. Delphi es una rápida herramienta visual de desarrollo de programas de Windows producida por Borland Company. Es potente y fácil de usar. El programa utiliza un temporizador para comparar el registro cada cierto tiempo. Cuando se inicia el programa, conserva una copia de seguridad de los datos de los valores de las claves de registro originales y luego los compara con los valores de las claves actuales periódicamente. Si se encuentra algún cambio, se le solicita al usuario que lo verifique. |
Implementación del programa |
1. Cree un nuevo Proyecto en Delphi y cambie el nombre de Form1 a FormMain |
2. Coloque un control de temporizador TTimer en FormMain y guarde el proyecto como PiRegWatch.Dpr |
3. Modifique el código en PiRegWatch.Dpr: |
aplicación.Inicializar; |
Aplicación.CreateForm(TFormMain, FormMain); |
//No mostrar la ventana principal cuando se inicia |
Aplicación.ShowMainForm:=Falso; |
Aplicación.Ejecutar; |
Agregue varios objetos a FormMain. |
ObjetoTipoDescripción |
RegTregistry se utiliza para acceder al registro |
IniFileTiniFile se utiliza para guardar los datos de registro originales. |
RegistroTstringListRegistro utilizado para registrar cambios |
RegKeysTstringList se utiliza para almacenar el nombre de la clave principal en la rama Ejecutar. |
4. Conserve los datos de registro originales en el evento FormMain:OnCreate. El código principal es el siguiente: |
… |
self.Reg:=TRegistry.Create; |
con self.Reg hacer |
comenzar |
Clave raíz:=HKEY_Local_Machine; |
Si OpenKey('Software/Microsoft/Windows/Versión actual/Ejecutar',falso) |
entonces |
comenzar |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //Obtener todos los nombres de claves principales en Ejecutar |
si no es self.IniFile.SectionExists('RunList') entonces //Si no se han guardado datos |
comenzar |
para i:=0 a Regkeys.Count-1 hacer //Guardar los datos originales |
si (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
o (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
entonces comienza |
valor:=self.Reg.ReadString(RegKeys.Strings[i]); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],valor); |
fin; |
fin; |
fin; |
fin; |
… |
5. Agregue el código para comparar el registro en el evento TTimer1.OnTmer. El código principal es el siguiente: |
procedimiento TFormMain.Timer1Timer(Remitente: TObject); |
var i: entero; |
RegVal,IniVal:cadena; |
comenzar |
self.Timer1.Enabled:=Falso; |
self.Reg.GetValueNames(RegKeys); |
para i:=0 a RegKeys.Count-1 hacer //Verificar los valores de clave recién agregados y modificados |
si (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
o (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
entonces comienza |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
si RegVal<>IniVal entonces |
comenzar |
self.LogMsg('Agregar elemento:'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); |
intentar |
//avisar usuario |
SendMsg('ABC','','El registro ha sido cambiado: nuevos elementos'+RegKeys.Strings[i]+'='+RegVal); |
finalmente |
fin; |
fin; |
fin; |
self.IniFile.ReadSection('RunList',RegKeys); |
para i:=0 a RegKeys.Count-1 hacer //Verificar los valores de clave eliminados |
comenzar |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
si self.Reg.ValueExists(RegKeys.Strings[i]) y |
((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
o (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString)) |
entonces |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
demás |
ValorReg:=''; |
si (IniVal<>'') y (RegVal='') entonces |
comenzar |
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
intentar |
SendMsg('ABC','','Registro cambiado: elemento eliminado'+RegKeys.Strings[i]+'='+IniVal); |
finalmente |
fin; |
fin; |
fin; |
self.IniFile.UpdateFile; |
self.Timer1.Enabled:=Verdadero; |
fin; |
6. Realice la liberación de objetos y el trabajo de limpieza necesario en el evento FormMain:OnClose |
procedimiento TFormMain.FormClose(Remitente: TObject; var Acción:TCloseAction); |
comenzar |
si está asignado (self.Reg), entonces self.Reg.Free; |
si está asignado (self.IniFile), entonces self.IniFile.Free; |
si está asignado (self.LogFile), entonces self.LogFile.Free; |
si está asignado (self.RegKeys), entonces self.RegKeys.Free; |
fin; |
Después de la operación real, este programa puede desempeñar un cierto papel en el descubrimiento de programas de origen desconocido. Por supuesto, su función también es muy única, si se mejora aún más y se agregan cambios en otros archivos clave del sistema de monitoreo, el efecto será mejor. Espero comunicarme con lectores interesados. |