Delphi5.0을 사용하여 레지스트리 모니터링 구현Zhu Hongtao, 중남대학교 제2 Xiangya 병원 정보센터 인터넷의 지속적인 인기로 인해 네트워크 보안에 대한 관심이 더욱 높아지고 있습니다. 컴퓨터 바이러스 외에도 다양한 해커 소프트웨어, 원격 제어 소프트웨어 등이 인터넷에 끊임없이 등장하여 사람들이 자신의 컴퓨터에 대해 점점 더 걱정하게 만들고 있습니다. 이러한 유형의 소프트웨어는 다양성과 지속적인 업데이트로 인해 일부 바이러스 백신 소프트웨어에만 의존하여 컴퓨터를 완전히 보호하는 것은 불가능합니다. |
출처를 알 수 없는 소프트웨어가 내 컴퓨터에 설치되는 것을 방지할 수 있는 좋은 방법이 있습니까? 대답은 주요 시스템 파일의 변경 사항에 세심한 주의를 기울이는 것입니다. 우리 모두 알고 있듯이 Windows가 시작될 때 프로그램이 자동으로 실행되기를 원하는 경우 일반적으로 세 가지 방법이 있습니다. |
1. 시작 메뉴의 [시작] 그룹에 바로가기 추가 |
2. Win.ini에 관련 항목 추가 |
3. 레지스트리의 HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run 기본 키 아래에 자신을 가리키는 키 값을 추가합니다. |
첫 번째 방법은 너무 명확하고 알아보기 쉽습니다. 따라서 일반적인 해커 프로그램은 후자의 두 가지 방법을 사용하여 스스로를 시작합니다. 여기에서 저자는 레지스트리의 키 값 변화를 실시간으로 모니터링하여 출처를 알 수 없는 프로그램을 찾아내는 데 사용되는 간단한 레지스트리 모니터를 직접 작성한 방법을 소개합니다. 관심 있는 독자들은 이를 바탕으로 더욱 발전할 수 있습니다. |
프로그래밍 아이디어 |
본 프로그램은 Delphi5.0을 사용하여 개발되었습니다. Delphi는 Borland Company에서 제작한 빠른 시각적 Windows 프로그램 개발 도구로 강력하고 사용하기 쉽습니다. 이 프로그램은 타이머를 사용하여 특정 시간마다 레지스트리를 비교합니다. 프로그램이 시작되면 원래 레지스트리 키 값의 데이터 백업을 유지한 다음 이를 현재 키 값과 정기적으로 비교하여 변경 사항이 발견되면 사용자에게 확인하라는 메시지가 표시됩니다. |
프로그램 구현 |
1. Delphi에서 새 프로젝트를 생성하고 Form1의 이름을 FormMain으로 바꿉니다. |
2. FormMain에 타이머 컨트롤 TTimer를 배치하고 프로젝트를 PiRegWatch.Dpr로 저장합니다. |
3. PiRegWatch.Dpr에서 코드를 수정합니다. |
응용 프로그램.초기화; |
Application.CreateForm(TFormMain, FormMain); |
//시작 시 메인 창을 표시하지 않음 |
Application.ShowMainForm:=거짓; |
응용 프로그램.실행; |
FormMain에 여러 개체를 추가합니다. |
개체유형설명 |
RegTregistry는 레지스트리에 액세스하는 데 사용됩니다. |
IniFileTiniFile은 원본 레지스트리 데이터를 저장하는 데 사용됩니다. |
로그TstringList변경 사항을 기록하는 데 사용되는 로그 |
RegKeysTstringList는 Run 분기 아래에 기본 키 이름을 저장하는 데 사용됩니다. |
4. FormMain:OnCreate 이벤트에 원래 레지스트리 데이터를 유지합니다. 주요 코드는 다음과 같습니다. |
… |
self.Reg:=TRegistry.Create; |
self.Reg do와 함께 |
시작하다 |
루트키:=HKEY_Local_Machine; |
OpenKey('소프트웨어/Microsoft/Windows/CurrentVersion/Run',false)인 경우 |
그 다음에 |
시작하다 |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //실행에서 모든 기본 키 이름을 가져옵니다. |
self.IniFile.SectionExists('RunList')가 아닌 경우 //데이터가 저장되지 않은 경우 |
시작하다 |
for i:=0 to Regkeys.Count-1 do //원본 데이터 저장 |
if (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(Sender: TObject); |
var i:정수; |
RegVal,IniVal:문자열; |
시작하다 |
self.Timer1.Enabled:=거짓; |
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],''); |
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]) |
또 다른 |
RegVal:=''; |
if (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(Sender: TObject; var Action:TCloseAction); |
시작하다 |
할당된 경우(self.Reg) 그러면 self.Reg.Free; |
할당된 경우(self.IniFile) 그러면 self.IniFile.Free; |
할당된 경우(self.LogFile) self.LogFile.Free; |
할당된 경우(self.RegKeys) self.RegKeys.Free; |
끝; |
실제 작동 후에 이 프로그램은 실제로 출처를 알 수 없는 프로그램을 발견하는 데 특정 역할을 할 수 있습니다. 물론 그 기능도 매우 단일하며, 모니터링 시스템의 다른 주요 파일에 변경 사항을 추가하면 효과가 더 좋아질 것입니다. 관심 있는 독자들과 소통하길 바랍니다. |