Реализация мониторинга реестра с помощью 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; |
конец; |
После реальной работы эта программа действительно может сыграть определенную роль в обнаружении программ неизвестного происхождения. Конечно, его функция тоже очень едина. Если его еще улучшить и добавить изменения в другие ключевые файлы системы мониторинга, эффект будет лучше. Надеюсь на общение с заинтересованными читателями. |