Delphi5.0を使用したレジストリ監視の実装
著者:Eve Cole
更新時間:2025-02-01 12:12:02
Delphi5.0を使用したレジストリ監視の実装中南大学第二襄雅病院情報センター 朱紅涛氏 インターネットの継続的な人気に伴い、ネットワーク セキュリティへの注目がますます高まっています。コンピュータ ウイルスに加えて、さまざまなハッカー ソフトウェア、遠隔制御ソフトウェアなどがインターネット上に常に出現しており、人々は自分のマシンに対する不安をますます高めています。この種のソフトウェアは多様性があり、常に更新されているため、一部のウイルス対策ソフトウェアのみに依存してマシンを完全に保護することは不可能です。 |
| 不明なソースからのソフトウェアがマシンにインストールされるのを防ぐ良い方法はありますか?答えは、主要なシステム ファイルの変更に細心の注意を払うことです。ご存知のとおり、Windows の起動時にプログラムを自動的に実行したい場合は、通常、次の 3 つの方法があります。 |
| 1.スタートメニューの[スタートアップ]グループにショートカットを追加します。 |
| 3.レジストリの HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run 主キーの下に自分自身を指すキー値を追加します。 |
| 最初の方法はあまりにも明白なので、簡単に見つけられます。したがって、一般的なハッカー プログラムは後者の 2 つの方法を使用して自身を起動します。ここで著者は、レジストリ内のキー値の変化をリアルタイムで監視して、出所不明のプログラムを検出するために使用される、私が作成した簡単なレジストリ モニターを紹介します。興味のある読者は、これに基づいてさらに改善することができます。 |
| このプログラムは Delphi5.0 を使用して開発されています。 Delphi は、Borland 社が開発した高速ビジュアル Windows プログラム開発ツールです。強力で使いやすいです。プログラムはタイマーを使用して、一定時間ごとにレジストリを比較します。プログラムが起動すると、元のレジストリ キー値のデータ バックアップが保持され、それを現在のキー値と定期的に比較し、変更が見つかった場合は、ユーザーに確認を求めるメッセージが表示されます。 |
| 1. Delphi で新しいプロジェクトを作成し、Form1 の名前を FormMain に変更します。 |
| 2. タイマー コントロール TTimer を FormMain に配置し、プロジェクトを PiRegWatch.Dpr として保存します。 |
| 3. PiRegWatch.Dpr のコードを変更します。 |
| Application.CreateForm(TFormMain, FormMain); |
| Application.ShowMainForm:=False; |
| FormMain にいくつかのオブジェクトを追加します。 |
| RegTregistryは、レジストリにアクセスするために使用されます |
| IniFileTiniFileは、元のレジストリ データを保存するために使用されます |
| LogTstringList変更の記録に使用されるログ |
| RegKeysTstringListは、Run ブランチの下に主キー名を格納するために使用されます。 |
| 4. FormMain:OnCreate イベントで元のレジストリ データを保持します。メイン コードは次のとおりです。 |
| self.Reg:=TRegistry.Create; |
| ルートキー:=HKEY_Local_Machine; |
| If OpenKey('ソフトウェア/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 イベントにレジストリを比較するコードを追加します。メインのコードは次のとおりです。 |
| プロシージャ TFormMain.Timer1Timer(送信者: 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) |
| または (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
| RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); |
| IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); |
| self.LogMsg('アイテムの追加:'+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],''); |
| self.Reg.ValueExists(RegKeys.Strings[i]) および |
| ((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
| または (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) ) |
| RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) |
| if (IniVal<>'') および (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 イベントでオブジェクトの解放と必要なクリーンアップ作業を実行します。 |
| プロシージャ TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); |
| Assigned(self.Reg) の場合は self.Reg.Free; |
| Assigned(self.IniFile) の場合、self.IniFile.Free; |
| Assigned(self.LogFile) の場合、self.LogFile.Free; |
| Assigned(self.RegKeys) の場合、self.RegKeys.Free; |
| 実際に動作させてみると、このプログラムは確かに、出所不明のプログラムを発見する上で一定の役割を果たすことができます。もちろん、その機能も非常に単一であり、さらに改良し、監視システムの他の主要なファイルの変更を追加すると、効果はさらに向上します。興味のある読者とコミュニケーションがとれることを願っています。 |