การดำเนินการตรวจสอบรีจิสทรีโดยใช้ 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; |
| จบ; |
| หลังจากการทำงานจริง โปรแกรมนี้สามารถมีบทบาทในการค้นหาโปรแกรมที่ไม่ทราบที่มาได้อย่างแน่นอน แน่นอนว่าฟังก์ชั่นของมันก็ยังเป็นเอกเทศเช่นกัน หากต้องได้รับการปรับปรุงเพิ่มเติมและเพิ่มการเปลี่ยนแปลงในไฟล์สำคัญอื่น ๆ ของระบบการตรวจสอบผลที่ได้ก็จะดีขึ้น หวังว่าจะสื่อสารกับผู้อ่านที่สนใจ |