การดำเนินการตรวจสอบรีจิสทรีโดยใช้ Delphi5.0Zhu Hongtao ศูนย์ข้อมูล โรงพยาบาล Second Xiangya มหาวิทยาลัย Central South ด้วยความนิยมอย่างต่อเนื่องของอินเทอร์เน็ต ความปลอดภัยของเครือข่ายจึงได้รับความสนใจมากขึ้นเรื่อยๆ นอกจากไวรัสคอมพิวเตอร์แล้ว ซอฟต์แวร์แฮ็กเกอร์ ซอฟต์แวร์ควบคุมระยะไกล ฯลฯ ยังปรากฏบนอินเทอร์เน็ตอย่างต่อเนื่อง ทำให้ผู้คนกังวลเกี่ยวกับเครื่องของพวกเขามากขึ้นเรื่อยๆ ความหลากหลายและการอัพเดตซอฟต์แวร์ประเภทนี้อย่างต่อเนื่องทำให้ไม่สามารถปกป้องเครื่องของคุณได้อย่างสมบูรณ์โดยอาศัยซอฟต์แวร์ป้องกันไวรัสบางตัวเพียงอย่างเดียว |
มีวิธีที่ดีในการป้องกันไม่ให้ซอฟต์แวร์จากแหล่งที่ไม่รู้จักถูกติดตั้งบนเครื่องของฉันหรือไม่? คำตอบคือต้องใส่ใจกับการเปลี่ยนแปลงในไฟล์ระบบคีย์อย่างใกล้ชิด ดังที่เราทราบกันดีว่า หากโปรแกรมต้องการทำงานอัตโนมัติเมื่อ Windows เริ่มทำงาน โดยทั่วไปจะมีสามวิธี: |
1. เพิ่มทางลัดไปยังกลุ่ม [Startup] ของเมนู Start |
2. เพิ่มรายการที่เกี่ยวข้องลงใน Win.ini |
3. เพิ่มค่าคีย์ที่ชี้ไปที่ตัวคุณเองภายใต้คีย์หลัก HKEY_Local_Machine/SoftWare/Microsoft/Windows/CurrentVersion/Run ในรีจิสทรี |
วิธีแรกชัดเจนเกินไปและสังเกตได้ง่าย ดังนั้นโปรแกรมแฮ็กเกอร์ทั่วไปจึงใช้สองวิธีหลังเพื่อเริ่มต้นตัวเอง ผู้เขียนที่นี่แนะนำการตรวจสอบรีจิสทรีแบบง่าย ๆ ที่เขียนโดยฉันเองซึ่งใช้ในการตรวจสอบการเปลี่ยนแปลงค่าคีย์ในรีจิสทรีแบบเรียลไทม์เพื่อค้นหาโปรแกรมที่ไม่ทราบที่มา ผู้อ่านที่สนใจสามารถปรับปรุงเพิ่มเติมบนพื้นฐานนี้ได้ |
แนวคิดการเขียนโปรแกรม |
โปรแกรมนี้ได้รับการพัฒนาโดยใช้ Delphi5.0 Delphi เป็นเครื่องมือพัฒนาโปรแกรม Windows แบบเห็นภาพที่รวดเร็วซึ่งผลิตโดย Borland Company มีประสิทธิภาพและใช้งานง่าย โปรแกรมใช้ตัวจับเวลาเพื่อเปรียบเทียบรีจิสทรีทุกครั้ง เมื่อโปรแกรมเริ่มทำงาน โปรแกรมจะเก็บข้อมูลสำรองของค่าคีย์รีจิสทรีดั้งเดิมไว้ จากนั้นจึงเปรียบเทียบกับค่าคีย์ปัจจุบันเป็นประจำ หากพบการเปลี่ยนแปลงใด ๆ ผู้ใช้จะได้รับแจ้งให้ตรวจสอบ |
การนำโปรแกรมไปใช้ |
1. สร้าง PRoject ใหม่ใน Delphi และเปลี่ยนชื่อ Form1 เป็น FormMain |
2. วางตัวควบคุมตัวจับเวลา TTimer บน FormMain และบันทึกโครงการเป็น 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 ทำ |
เริ่ม |
RootKey:=HKEY_Local_Machine; |
ถ้า OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false) |
แล้ว |
เริ่ม |
RegKeys:=TStringList.Create; |
GetValueNames(RegKeys); //รับชื่อคีย์หลักทั้งหมดภายใต้ Run |
ถ้าไม่ใช่ self.IniFile.SectionExists('RunList') ดังนั้น //หากไม่มีการบันทึกข้อมูล |
เริ่ม |
สำหรับ i:=0 ถึง 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]ค่า); |
จบ; |
จบ; |
จบ; |
จบ; |
- |
5. เพิ่มโค้ดเพื่อเปรียบเทียบรีจิสทรีในเหตุการณ์ TTimer1.OnTmer รหัสหลักมีดังนี้: |
ขั้นตอน TFormMain.Timer1Timer (ผู้ส่ง: TObject); |
var i: จำนวนเต็ม; |
RegVal,IniVal:สตริง; |
เริ่ม |
self.Timer1.Enabled:=เท็จ; |
self.Reg.GetValueNames (RegKeys); |
สำหรับ i:=0 ถึง 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); |
สำหรับ i:=0 ถึง 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:=''; |
ถ้า (IniVal<>'') และ (RegVal='') แล้ว |
เริ่ม |
self.LogMsg('รายการเดล:'+RegKeys.Strings[i]+'='+IniVal); |
self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); |
พยายาม |
SendMsg('ABC','','การเปลี่ยนแปลงรีจิสทรี: รายการถูกลบ'+RegKeys.Strings[i]+'='+IniVal); |
ในที่สุด |
จบ; |
จบ; |
จบ; |
self.IniFile.UpdateFile; |
self.Timer1.Enabled:=จริง; |
จบ; |
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; |
จบ; |
หลังจากการทำงานจริง โปรแกรมนี้สามารถมีบทบาทในการค้นหาโปรแกรมที่ไม่ทราบที่มาได้อย่างแน่นอน แน่นอนว่าฟังก์ชั่นของมันก็ยังเป็นเอกเทศเช่นกัน หากต้องได้รับการปรับปรุงเพิ่มเติมและเพิ่มการเปลี่ยนแปลงในไฟล์สำคัญอื่น ๆ ของระบบการตรวจสอบผลที่ได้ก็จะดีขึ้น หวังว่าจะสื่อสารกับผู้อ่านที่สนใจ |