用Delphi5.0實作登錄機碼監視
作者:Eve Cole
更新時間:2025-02-01 12:12:02
用Delphi5.0實作登錄機碼監視中南大學湘雅二醫院資訊中心朱洪濤 隨著Internet的不斷普及,網路安全越來越受到人們的重視。除了電腦病毒以外,網路上不斷出現的各類駭客軟體、遠端控制軟體等,更讓人們對自己的機器越來越不放心。而這類軟體的多樣性及不斷更新等,使得單靠一些防毒軟體已無法完全保護自己的機器。 |
有沒有什麼好的方法可以防止來歷不明的軟體安裝在自己的機器上呢?答案就是密切注意系統關鍵檔案的變化。大家都知道,一個程式如果要在Windows啟動時自動執行,一般有三種方法: |
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 |
Application.CreateForm(TFormMain, FormMain); |
Application.ShowMainForm:=False; |
RegTregistry用於註冊表的訪問 |
IniFileTiniFile用於保存原始註冊表數據 |
LogTstringList用於記錄變化的日誌 |
RegKeysTstringList用於存放Run分支下的主鍵名 |
4.在FormMain:OnCreate事件中保留原始註冊表數據,主要程式碼如下: |
self.Reg:=TRegistry.Create; |
RootKey:=HKEY_Local_Machine; |
If OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false) |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //取得Run下面的所有主鍵名 |
if not self.IniFile.SectionExists('RunList') then //如果沒有儲存過數據 |
for i:=0 to Regkeys.Count-1 do //儲存原始數據 |
if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
or(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
value:=self.Reg.ReadString(RegKeys.Strings[i]); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],value); |
5.在TTimer1.OnTmer事件中加入比較註冊表的程式碼。主要程式碼如下: |
procedure TFormMain.Timer1Timer(Sender: TObject); |
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) |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
self.LogMsg('Item Add:'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); |
SendMsg('ABC','','註冊表改變:新增項目'+RegKeys.Strings[i]+'='+RegVal); |
self.IniFile.ReadSection('RunList',RegKeys); |
for i:=0 to RegKeys.Count-1 do //檢查已刪除的鍵值 |
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) ) |
RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
if (IniVal<>'') and (RegVal='') then |
self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
SendMsg('ABC','','註冊表被改變:項目刪除'+RegKeys.Strings[i]+'='+IniVal); |
self.Timer1.Enabled:=True; |
6.在FormMain:OnClose事件中進行物件釋放及必要的清理工作 |
procedure TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); |
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; |
經過實際運行,該程式在發現來歷不明的程式方面確實能起到一定的作用。當然,它的功能也很單一,如果要進一步完善,增加監視系統其他關鍵文件的變化,則效果會更好。希望能與有興趣的讀者交流。 |