用Delphi5.0实现注册表监视

原创 2002年02月04日 08:40:00

用Delphi5.0实现注册表监视


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

 

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

有没有什么好的方法防止来历不明的软件安装在自己的机器上呢?答案就是密切注意系统关键文件的变化。大家都知道,一个程序如果要在Windows启动时自动运行,一般有三种方法:
1.在开始菜单的[启动]组中加入快捷方式
2.在Win.ini中加入相关项目
3.在注册表的 HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run主键下加入指向自己的键值。
而第一种方法太明显,很容易发现。所以一般的黑客程序使用后两种方法启动自己。笔者在此介绍一个自己编写的简单的注册表监视器,用于实时监视注册表中键值的变化,以发现不明来历的程序。读者有兴趣的可以在此基础上进一步完善。
程序设计思路
本程序用Delphi5.0开发。Delphi是Borland公司出品的快速可视化Windows程序开发工具,功能强大,易于使用。程序中通过一个定时器来实现每隔一定时间对注册表比较一次。程序在启动时保留一份原始的注册表相关键值的数据备份,然后定时和当前的键值进行比较,如果发现变化,则提示用户查看。
程序实现
1、在Delphi中建立一个新的Project,将Form1改名为FormMain
2、在FormMain上放置一个定时器控件TTimer,将Project保存为PiRegWatch.Dpr
3、修改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 do
begin
RootKey:=HKEY_Local_Machine;
If OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false)
then
begin
RegKeys:=TStringList.Create;
GetValueNames(RegKeys); //取得Run下面的所有主键名
if not self.IniFile.SectionExists('RunList') then //如果没有保存过数据
begin
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 begin
value:=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;
begin
self.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 begin
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]);
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],'');
if RegVal<>IniVal then
begin
self.LogMsg('Item Add:'+RegKeys.Strings[i]+'='+RegVal);
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal);
try
//提示用户
SendMsg('ABC','','注册表被改变:新增项目'+RegKeys.Strings[i]+'='+RegVal);
finally
end;
end;
end;
self.IniFile.ReadSection('RunList',RegKeys);
for i:=0 to RegKeys.Count-1 do //检查已被删除的键值
begin
IniVal:=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) )
then
RegVal:=self.Reg.ReadString(RegKeys.Strings[i])
else
RegVal:='';
if (IniVal<>'') and (RegVal='') then
begin
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal);
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]);
try
SendMsg('ABC','','注册表被改变:项目删除'+RegKeys.Strings[i]+'='+IniVal);
finally
end;
end;
end;
self.IniFile.UpdateFile;
self.Timer1.Enabled:=True;
end;
6、在FormMain:OnClose事件中进行对象释放及必要的清理工作
procedure TFormMain.FormClose(Sender: TObject; var Action:TCloseAction);
begin
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;
end;
经过实际运行,该程序在发现来历不明的程序方面确实能起到一定的作用。当然,它的功能也很单一,如果要进一步完善,增加监视系统其他关键文件的变化,则效果会更好。希望能与有兴趣的读者交流。
下载源代码

分析Zookeeper不提供永久Watcher的原因并如何保证获取最新数据

(1)在使用ZooKeeper的过程中,相信很多人都有这样的疑问,为什么不提供一个持久的Watcher注册机制呢? 不支持用持久Watcher的原因很简单,如果Watcher的注册是持久的,那...
  • hongshun0651140
  • hongshun0651140
  • 2015年11月07日 21:23
  • 3025

java实验六 组件与事件处理 (无脑实验系列)

1.算术测试。 ²  实验要求: 编写一个算书测试小软件,用来训练小学生的算术能力。程序由3个类组成,其中Teacher类对象负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame类...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年05月23日 09:34
  • 1335

使用win10性能监视器获得系统性能数据

可以使用 Windows 性能监视器实时检查运行程序影响计算机性能的方式并通过收集日志数据供以后分析使用。 Windows 性能监视器使用可合并进数据收集器集的性能计数器、事件跟踪数据和配置信息。 ...
  • qq_27792379
  • qq_27792379
  • 2016年08月14日 21:45
  • 4516

Hive注册表那点事(5.0 VS 6.0)

Hive 注册表那点事( 5.0 VS 6.0 ) 现象        5.0 移置到 6.0 上的时候,发现 Hive-Registry 无效,具体的现象是在控制面板中屏幕校准后 Cold Boot...
  • zmq5411
  • zmq5411
  • 2011年03月24日 13:40
  • 459

delphi注册表操作(读取、添加、删除、修改)

32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。 一、创建和释放TRegistry对象   1.创建TRegistry对象。为了操作注册表,要创建一个TRegistr...
  • sushengmiyan
  • sushengmiyan
  • 2012年09月20日 15:31
  • 1355

Delphi操作注册表TRegistry类

Delphi操作注册表TRegistry类 在应用程序中,经常需要对注册表进行操作,如将程序名称、安装路径等等信息保存到注册表中。Delphi对相应API函数做了进一步封装,使操作注册表更加简单。 ...
  • daiswy
  • daiswy
  • 2017年02月22日 12:03
  • 105

delphi操作注册表最简单的方法TRegIniFile 对象

操作注册表实例   Delphi 3.0中的registry.dcu文件定义注册表的数据结构,并提供了TRegIniFile 这个不可视的控件。在程序中可通过该控件来操作注册表。 下面的例子描...
  • easyboot
  • easyboot
  • 2011年12月16日 11:56
  • 1453

delphi 注册表操作(读取、添加、删除、修改)完全手册

32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。    一、创建和释放TRegistry对象    1.创建TRegistry对象。为了操作注册表,要创建一个...
  • yanjiaye520
  • yanjiaye520
  • 2012年07月16日 16:14
  • 23156

delphi修改注册表那些常用操作(续)

添加环境变量: procedure InstallPath(path: string); var r: TRegistry; sysPath: string; dwReturnV...
  • jackalfly
  • jackalfly
  • 2012年08月15日 11:10
  • 1110

[转]Delphi 几个读写注册表的函数

转自: http://topic.csdn.net/t/20031117/10/2464684.html {*************************************...
  • warrially
  • warrially
  • 2012年09月20日 10:25
  • 1846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Delphi5.0实现注册表监视
举报原因:
原因补充:

(最多只允许输入30个字)