Implementando monitoramento de registro usando Delphi5.0Zhu Hongtao, Centro de Informações, Segundo Hospital Xiangya, Universidade Central Sul Com a contínua popularidade da Internet, a segurança da rede tem atraído cada vez mais atenção. Além dos vírus de computador, diversos softwares hackers, softwares de controle remoto, etc. aparecem constantemente na Internet, deixando as pessoas cada vez mais preocupadas com suas máquinas. A diversidade e as constantes atualizações deste tipo de software impossibilitam proteger completamente a sua máquina contando apenas com algum software antivírus. |
Existe alguma boa maneira de impedir que softwares de fontes desconhecidas sejam instalados em minha máquina? A resposta é prestar muita atenção às alterações nos principais arquivos do sistema. Como todos sabemos, se um programa deseja ser executado automaticamente quando o Windows é iniciado, geralmente existem três métodos: |
1. Adicione um atalho ao grupo [Inicializar] do menu Iniciar |
2. Adicione itens relacionados ao Win.ini |
3. Adicione um valor de chave apontando para você mesmo na chave primária HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run no registro. |
O primeiro método é muito óbvio e fácil de detectar. Portanto, os programas hackers em geral usam os dois últimos métodos para serem iniciados. O autor apresenta aqui um monitor de registro simples escrito por mim, que é usado para monitorar alterações nos valores-chave do registro em tempo real para descobrir programas de origem desconhecida. Os leitores interessados podem melhorar ainda mais nesta base. |
Ideias de programação |
Este programa foi desenvolvido em Delphi5.0. Delphi é uma ferramenta visual rápida de desenvolvimento de programas para Windows produzida pela Borland Company. É poderosa e fácil de usar. O programa usa um cronômetro para comparar o registro a cada determinado momento. Quando o programa é iniciado, ele mantém um backup dos dados dos valores originais da chave do registro e, em seguida, compara-os regularmente com os valores da chave atual. Se alguma alteração for encontrada, o usuário será solicitado a verificar. |
Implementação do programa |
1. Crie um novo PRoject em Delphi e renomeie Form1 para FormMain |
2. Coloque um controle de timer TTimer no FormMain e salve o projeto como PiRegWatch.Dpr |
3. Modifique o código em PiRegWatch.Dpr: |
aplicativo.Inicializar; |
Application.CreateForm(TFormMain, FormMain); |
//Não exibe a janela principal quando ela inicia |
Application.ShowMainForm:=Falso; |
Aplicativo.Executar; |
Adicione vários objetos ao FormMain. |
ObjetoTipoDescrição |
RegTregistry é usado para acessar o registro |
IniFileTiniFile é usado para salvar os dados originais do registro |
LogTstringListLog usado para registrar alterações |
RegKeysTstringList é usado para armazenar o nome da chave primária na ramificação Run |
4. Retenha os dados originais do registro no evento FormMain:OnCreate O código principal é o seguinte: |
… |
self.Reg:=TRegistry.Create; |
com self.Reg do |
começar |
RootKey:=HKEY_Local_Máquina; |
If OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',falso) |
então |
começar |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //Obtém todos os nomes de chaves primárias em Executar |
se não for self.IniFile.SectionExists('RunList') então //Se nenhum dado foi salvo |
começar |
para i:=0 para Regkeys.Count-1 do //Salve os dados originais |
if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
ou(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
então comece |
valor:=self.Reg.ReadString(RegKeys.Strings[i]); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],valor); |
fim; |
fim; |
fim; |
fim; |
… |
5. Adicione o código para comparar o registro no evento TTimer1.OnTmer. O código principal é o seguinte: |
procedimento TFormMain.Timer1Timer(Remetente: TObject); |
var i:inteiro; |
RegVal,IniVal:string; |
começar |
self.Timer1.Enabled:=Falso; |
self.Reg.GetValueNames(RegKeys); |
for i:=0 to RegKeys.Count-1 do //Verifica os valores-chave recém-adicionados e modificados |
if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
ou (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
então comece |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
se RegVal<>IniVal então |
começar |
self.LogMsg('Adicionar item:'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); |
tentar |
//avisa ao usuário |
SendMsg('ABC','','O registro foi alterado: novos itens'+RegKeys.Strings[i]+'='+RegVal); |
finalmente |
fim; |
fim; |
fim; |
self.IniFile.ReadSection('RunList',RegKeys); |
for i:=0 to RegKeys.Count-1 do //Verifique os valores-chave excluídos |
começar |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
se self.Reg.ValueExists(RegKeys.Strings[i]) e |
((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
ou (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) ) |
então |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
outro |
ValorReg:=''; |
se (IniVal<>'') e (RegVal='') então |
começar |
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
tentar |
SendMsg('ABC','','Registro alterado: item excluído'+RegKeys.Strings[i]+'='+IniVal); |
finalmente |
fim; |
fim; |
fim; |
self.IniFile.UpdateFile; |
self.Timer1.Enabled:=Verdadeiro; |
fim; |
6. Execute a liberação do objeto e o trabalho de limpeza necessário no evento FormMain:OnClose |
procedimento TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); |
começar |
se atribuído (self.Reg) então self.Reg.Free; |
se atribuído (self.IniFile) então self.IniFile.Free; |
se atribuído (self.LogFile) então self.LogFile.Free; |
se atribuído (self.RegKeys) então self.RegKeys.Free; |
fim; |
Após a operação real, este programa pode realmente desempenhar um certo papel na descoberta de programas de origem desconhecida. Claro, sua função também é muito única. Se for melhorado ainda mais e as alterações em outros arquivos importantes do sistema de monitoramento forem adicionadas, o efeito será melhor. Espero me comunicar com leitores interessados. |