用Delphi5.0完成注冊(cè)表監(jiān)視
發(fā)表時(shí)間:2023-07-29 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]中南大學(xué)湘雅二醫(yī)院信息中心 朱洪濤隨著Internet的不斷普及,網(wǎng)絡(luò)安全越來(lái)越受到人們的重視。除了計(jì)算機(jī)病毒以外,網(wǎng)上不斷出現(xiàn)的的各類黑客軟件、遠(yuǎn)程控制軟件等,更讓人們對(duì)自己的機(jī)器越來(lái)越不放心。而...
中南大學(xué)湘雅二醫(yī)院信息中心 朱洪濤
隨著Internet的不斷普及,網(wǎng)絡(luò)安全越來(lái)越受到人們的重視。除了計(jì)算機(jī)病毒以外,網(wǎng)上不斷出現(xiàn)的的各類黑客軟件、遠(yuǎn)程控制軟件等,更讓人們對(duì)自己的機(jī)器越來(lái)越不放心。而這類軟件的多樣性及不斷更新等,使得單靠一些防病毒軟件已不能完全保護(hù)自己的機(jī)器。
有沒有什么好的方法防止來(lái)歷不明的軟件安裝在自己的機(jī)器上呢?答案就是密切注意系統(tǒng)關(guān)鍵文件的變化。大家都知道,一個(gè)程序如果要在Windows啟動(dòng)時(shí)自動(dòng)運(yùn)行,一般有三種方法:
1.在開始菜單的[啟動(dòng)]組中加入快捷方式
2.在Win.ini中加入相關(guān)項(xiàng)目
3.在注冊(cè)表的 HKEY_Local_Machine\SoftWare\Microsoft\Windows\CurrentVersion\Run主鍵下加入指向自己的鍵值。
而第一種方法太明顯,很容易發(fā)現(xiàn)。所以一般的黑客程序使用后兩種方法啟動(dòng)自己。筆者在此介紹一個(gè)自己編寫的簡(jiǎn)單的注冊(cè)表監(jiān)視器,用于實(shí)時(shí)監(jiān)視注冊(cè)表中鍵值的變化,以發(fā)現(xiàn)不明來(lái)歷的程序。讀者有興趣的可以在此基礎(chǔ)上進(jìn)一步完善。
程序設(shè)計(jì)思路
本程序用Delphi5.0開發(fā)。Delphi是Borland公司出品的快速可視化Windows程序開發(fā)工具,功能強(qiáng)大,易于使用。程序中通過一個(gè)定時(shí)器來(lái)實(shí)現(xiàn)每隔一定時(shí)間對(duì)注冊(cè)表比較一次。程序在啟動(dòng)時(shí)保留一份原始的注冊(cè)表相關(guān)鍵值的數(shù)據(jù)備份,然后定時(shí)和當(dāng)前的鍵值進(jìn)行比較,如果發(fā)現(xiàn)變化,則提示用戶查看。
程序?qū)崿F(xiàn)
1、在Delphi中建立一個(gè)新的Project,將Form1改名為FormMain
2、在FormMain上放置一個(gè)定時(shí)器控件TTimer,將Project保存為PiRegWatch.Dpr
3、修改PiRegWatch.Dpr中的代碼:
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
//使主窗口啟動(dòng)時(shí)不顯示
Application.ShowMainForm:=False;
Application.Run;
在FormMain中增加幾個(gè)對(duì)象。
對(duì)象類型說(shuō)明
RegTregistry用于注冊(cè)表的訪問
IniFileTiniFile用于保存原始注冊(cè)表數(shù)據(jù)
LogTstringList用于記錄變化的日志
RegKeysTstringList用于存放Run分支下的主鍵名
4、在FormMain:OnCreate事件中保留原始注冊(cè)表數(shù)據(jù),主要代碼如下:
……
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 //如果沒有保存過數(shù)據(jù)
begin
for i:=0 to Regkeys.Count-1 do //保存原始數(shù)據(jù)
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事件中加入比較注冊(cè)表的代碼。主要代碼如下:
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','','注冊(cè)表被改變:新增項(xiàng)目'+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','','注冊(cè)表被改變:項(xiàng)目刪除'+RegKeys.Strings[i]+'='+IniVal);
finally
end;
end;
end;
self.IniFile.UpdateFile;
self.Timer1.Enabled:=True;
end;
6、在FormMain:OnClose事件中進(jìn)行對(duì)象釋放及必要的清理工作
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;
經(jīng)過實(shí)際運(yùn)行,該程序在發(fā)現(xiàn)來(lái)歷不明的程序方面確實(shí)能起到一定的作用。當(dāng)然,它的功能也很單一,如果要進(jìn)一步完善,增加監(jiān)視系統(tǒng)其他關(guān)鍵文件的變化,則效果會(huì)更好。希望能與有興趣的讀者交流。