用Delphi5.0实现注册表监视

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

Delphi5.0实现注册表监视


中南大学湘雅二医院信息中心 朱洪涛

 

随着Internet的不断普及,网络安全越来越受到人们的重视。除了计算机病毒以外,网上不断出现的的各类黑客软件、远程控制软件等,更让人们对自己的机器越来越不放心。而这类软件的多样性及不断更新等,使得单靠一些防病毒软件已不能完全保护自己的机器。

有没有什么好的方法防止来历不明的软件安装在自己的机器上呢?答案就是密切注意系统关键文件的变化。大家都知道,一个程序如果要在Windows启动时自动运行,一般有三种方法:1.在开始菜单的[启动]组中加入快捷方式2.在Win.ini中加入相关项目3.在注册表的 HKEY_Local_MachineSoftWareMicrosoftWindowsCurrentVersionRun主键下加入指向自己的键值。而第一种方法太明显,很容易发现。所以一般的黑客程序使用后两种方法启动自己。笔者在此介绍一个自己编写的简单的注册表监视器,用于实时监视注册表中键值的变化,以发现不明来历的程序。读者有兴趣的可以在此基础上进一步完善。程序设计思路本程序用 Delphi5.0开发。 Delphi是Borland公司出品的快速可视化Windows程序开发工具,功能强大,易于使用。程序中通过一个定时器来实现每隔一定时间对注册表比较一次。程序在启动时保留一份原始的注册表相关键值的数据备份,然后定时和当前的键值进行比较,如果发现变化,则提示用户查看。程序实现1、在 Delphi中建立一个新的Project,将Form1改名为FormMain2、在FormMain上放置一个定时器控件TTimer,将Project保存为PiRegWatch.Dpr3、修改PiRegWatch.Dpr中的代码: Application.Initialize;Application.CreateForm(TFormMain, FormMain);//使主窗口启动时不显示Application.ShowMainForm:=False;Application.Run;在FormMain中增加几个对象。对象类型说明RegTregistry用于注册表的访问IniFileTiniFile用于保存原始注册表数据LogTstringList用于记录变化的日志RegKeysTstringList用于存放Run分支下的主键名4、在FormMain:OnCreate事件中保留原始注册表数据,主要代码如下:……self.Reg:=TRegistry.Create;with self.Reg dobeginRootKey:=HKEY_Local_Machine;If OpenKey('SoftwareMicrosoftWindowsCurrentVersionRun',false) thenbeginRegKeys:=TStringList.Create;GetValueNames(RegKeys); //取得Run下面的所有主键名if not self.IniFile.SectionExists('RunList') then //如果没有保存过数据beginfor i:=0 to Regkeys.Count-1 do //保存原始数据if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString)or(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString)then beginvalue:=self.Reg.ReadString(RegKeys.Strings[i]);self.IniFile.WriteString('RunList',RegKeys.Strings[i],value);end;end;end;end;……5、在TTimer1.OnTmer事件中加入比较注册表的代码。主要代码如下:procedure TFormMain.Timer1Timer(Sender: TObject);var i:integer;RegVal,IniVal:string;beginself.Timer1.Enabled:=False;self.Reg.GetValueNames(RegKeys);for i:=0 to RegKeys.Count-1 do //检查新加的和已修改了的键值if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString)or (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString)then beginRegVal:=self.Reg.ReadString(RegKeys.Strings[i]);IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],'');if RegVal<>IniVal thenbeginself.LogMsg('Item Add:'+RegKeys.Strings[i]+'='+RegVal);self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal);try//提示用户SendMsg('ABC','','注册表被改变:新增项目'+RegKeys.Strings[i]+'='+RegVal);finallyend;end;end;self.IniFile.ReadSection('RunList',RegKeys);for i:=0 to RegKeys.Count-1 do //检查已被删除的键值beginIniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],'');if self.Reg.ValueExists(RegKeys.Strings[i]) and((self.Reg.GetDataType(RegKeys.Strings[i])=rdString)or (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) )thenRegVal:=self.Reg.ReadString(RegKeys.Strings[i])elseRegVal:='';if (IniVal<>'') and (RegVal='') thenbeginself.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal);self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]);trySendMsg('ABC','','注册表被改变:项目删除'+RegKeys.Strings[i]+'='+IniVal);finallyend;end;end;self.IniFile.UpdateFile;self.Timer1.Enabled:=True;end;6、在FormMain:OnClose事件中进行对象释放及必要的清理工作procedure TFormMain.FormClose(Sender: TObject; var Action:TCloseAction);beginif 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;end;经过实际运行,该程序在发现来历不明的程序方面确实能起到一定的作用。当然,它的功能也很单一,如果要进一步完善,增加监视系统其他关键文件的变化,则效果会更好。希望能与有兴趣的读者交流。 下载源代码。 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值