Реализация мониторинга реестра с помощью Delphi5.0Чжу Хунтао, Информационный центр, Вторая больница Сянъя, Центральный Южный университет С ростом популярности Интернета сетевая безопасность привлекает все больше и больше внимания. Помимо компьютерных вирусов, в Интернете постоянно появляются различные хакерские программы, программы удаленного управления и т. д., заставляющие людей все больше беспокоиться о своих машинах. Разнообразие и постоянные обновления этого типа программного обеспечения не позволяют полностью защитить вашу машину, полагаясь только на какое-то антивирусное программное обеспечение. |
| Есть ли хороший способ предотвратить установку программного обеспечения из неизвестных источников на мой компьютер? Ответ — обратить пристальное внимание на изменения в ключевых системных файлах. Как мы все знаем, если программа хочет запускаться автоматически при запуске Windows, обычно существует три метода: |
| 1. Добавьте ярлык в группу [Автозагрузка] меню «Пуск». |
| 2. Добавьте связанные элементы в Win.ini |
| 3. Добавьте значение ключа, указывающее на себя, под первичным ключом HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run в реестре. |
| Первый метод слишком очевиден и его легко заметить. Поэтому обычные хакерские программы используют последние два метода для запуска. Здесь автор представляет простой монитор реестра, написанный мной, который используется для отслеживания изменений значений ключей в реестре в режиме реального времени для обнаружения программ неизвестного происхождения. Заинтересованные читатели могут улучшить эту информацию. |
| Идеи программирования |
| Эта программа разработана с использованием Delphi5.0. Delphi — это быстрый визуальный инструмент разработки программ для Windows, разработанный компанией Borland. Он мощный и простой в использовании. Программа использует таймер для сравнения реестра каждый определенный момент времени. При запуске программы она сохраняет резервную копию данных исходных значений ключей реестра, а затем регулярно сравнивает ее с текущими значениями ключей. При обнаружении каких-либо изменений пользователю предлагается проверить. |
| Реализация программы |
| 1. Создайте новый проект в Delphi и переименуйте Form1 в FormMain. |
| 2. Поместите элемент управления таймером TTimer на FormMain и сохраните проект как PiRegWatch.Dpr. |
| 3. Измените код в PiRegWatch.Dpr: |
| приложение.Инициализировать; |
| Application.CreateForm(TFormMain, FormMain); |
| //Не отображать главное окно при его запуске |
| Application.ShowMainForm:=False; |
| Приложение.Выполнить; |
| Добавьте несколько объектов в FormMain. |
| ОбъектТипОписание |
| RegTregistry используется для доступа к реестру |
| IniFileTiniFile используется для сохранения исходных данных реестра. |
| ЖурналTstringListЖурнал, используемый для записи изменений |
| RegKeysTstringList используется для хранения имени первичного ключа в ветке «Выполнить». |
| 4. Сохраните исходные данные реестра в событии FormMain:OnCreate. Основной код выглядит следующим образом: |
| … |
| self.Reg:=TRegistry.Create; |
| с себя.Рег сделать |
| начинать |
| RootKey:=HKEY_Local_Machine; |
| Если OpenKey('Программное обеспечение/Microsoft/Windows/CurrentVersion/Run', false) |
| затем |
| начинать |
| RegKeys:=TStringList.Create; |
| GetValueNames(RegKeys); //Получаем все имена первичных ключей в разделе «Выполнить» |
| if not self.IniFile.SectionExists('RunList') then //Если данные не были сохранены |
| начинать |
| for i:=0 to Regkeys.Count-1 do //Сохраняем исходные данные |
| если (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) |
| или(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) |
| тогда начни |
| значение:=self.Reg.ReadString(RegKeys.Strings[i]); |
| self.IniFile.WriteString('RunList',RegKeys.Strings[i],value); |
| конец; |
| конец; |
| конец; |
| конец; |
| … |
| 5. Добавьте код для сравнения реестра в событие TTimer1.OnTmer. Основной код выглядит следующим образом: |
| процедура TFormMain.Timer1Timer(Отправитель: TObject); |
| вар я: целое число; |
| RegVal,IniVal:строка; |
| начинать |
| self.Timer1.Enabled:=False; |
| self.Reg.GetValueNames(RegKeys); |
| for i:=0 to RegKeys.Count-1 do //Проверяем вновь добавленные и измененные значения ключей |
| если (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],''); |
| если RegVal<>IniVal, то |
| начинать |
| 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]) |
| еще |
| РегВал:=''; |
| если (IniVal<>'') и (RegVal=''), то |
| начинать |
| self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); |
| self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
| пытаться |
| SendMsg('ABC','','Реестр изменен: элемент удален'+RegKeys.Strings[i]+'='+IniVal); |
| окончательно |
| конец; |
| конец; |
| конец; |
| self.IniFile.UpdateFile; |
| self.Timer1.Enabled:=True; |
| конец; |
| 6. Выполните освобождение объекта и необходимые работы по очистке в событии FormMain:OnClose. |
| процедура TFormMain.FormClose(Отправитель: TObject; var Action:TCloseAction); |
| начинать |
| если Назначено(self.Reg), то self.Reg.Free; |
| если Назначено(self.IniFile), то self.IniFile.Free; |
| если Назначено(self.LogFile), то self.LogFile.Free; |
| если Назначено(self.RegKeys), то self.RegKeys.Free; |
| конец; |
| После реальной работы эта программа действительно может сыграть определенную роль в обнаружении программ неизвестного происхождения. Конечно, его функция тоже очень едина. Если его еще улучшить и добавить изменения в другие ключевые файлы системы мониторинга, эффект будет лучше. Надеюсь на общение с заинтересованными читателями. |