จุดประสงค์หลักๆที่จะนำเสนอในครั้งนี้คือ การป้องกันไม่ให้เกิดการคัดลอกข้อมูล (Copy) จากเครื่องคอมพิวเตอร์ของเรา เข้าไปยัง USB Flash Drive ได้ พร้อมทั้งยัง ไม่อนุญาตให้ใช้งาน Registry Tools หรือ RegEdit เพื่อเข้าไปแก้ไขข้อมูล Registry ระบบได้นั่นเองครับ แม้ว่ามันอาจจะไม่ได้มีผลอะไรมากมาย แต่ก็คง ป้องกันผู้ใช้คนอื่นที่ไม่ค่อยมีความรู้คอมฯมากนัก (ที่ชอบแอบมาจิ๊กคลิปลับๆของเราไป 55555+) ... ดังนั้นผมก็เลยมีจุดประสงค์รองคือ ในบางครั้งเครื่องเราอาจจะโดนไวรัส ทั้งที่เจตนา หรือไม่ได้เจตนาสร้างให้เป็นไวรัส (โดยเฉพาะพวก 3 กอ คือ เกรียน กาก กวน) โดยมีเป้าหมายเข้าไปทำลายข้อมูลบางอย่างใน Registry ของระบบ ซึ่งพวก Anti Virus มันก็มักไม่ได้มาคอยช่วยในส่วนนี้มากนัก ทำให้เราต้องมาแก้ไขเอาเอง ... บทความนี้จะเป็นการเรียกใช้งาน Script ผ่านทาง Visual Basic 6 โดยตรง ซึ่งคำว่า Script นี่เองแหละที่เป็นรูโหว่ให้กับเหล่าไวรัส หรือ หนอนน้อย (Worm) ต่างๆเข้ามาโจมตีระบบได้ เมื่อป้องกันได้ยาก เราก็ควรศึกษาเรียนรู้ถึงการแก้ปัญหาก็แล้วกันครับ ... พี่น้อง
Script Object หลักๆที่ใช้งานบน MS Windows
- Scripting.FileSystemObject (FSO) พวกนี้เป็น Object ที่เกี่ยวข้องกับไฟล์ โฟลเดอร์ต่างๆ (อ่านรายละเอียดเพิ่มเติมที่นี่)
- Wscript.Network Object เป็น Object ที่เกี่ยวข้องกับการเชื่อมต่อระบบ Network เช่น การ Mapped Network Drive ... โอกาสหน้าจะนำมาเสนออีกทีครับ
- WScript.Shell Object คือ Object ที่เกี่ยวข้องกับ Registry ของระบบ ซึ่งผมนำมาเสนอในบทความนี้
หลักการทำงานของโปรแกรม
- ปกติเราสามารถเข้าไปแก้ไข Registry ของระบบโดยตรงผ่านทาง Registry Tools คือ คำสั่ง RegEdit ดังนี้
การล็อค USB Flash Drive HKLM\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\WriteProtect
 เมื่อ WriteProtect = 0 คือ สามารถใช้งาน USB Flash Drive ได้ตามปกติ (Enable) เมื่อ WriteProtect = 1 คือ ไม่สามารถเขียนข้อมูล ลบข้อมูลออกจาก USB Flash Drive ได้ (Disable)
การล็อคไม่ให้ใช้งาน Registry Tools ได้ (ป้องกันไม่ให้ผู้ใช้เข้าไปแก้ไขใน RegEdit เอง) HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools เมื่อ DisableRegistryTools = 0 คือ สามารถใช้งาน Registry Tools ได้ตามปกติ (Enable) เมื่อ DisableRegistryTools = 1 คือ ไม่สามารถใช้งาน Registry Tools ได้ (Disable)
นั่นคือเราใช้วิธีการแบบ Manual หรือ เข้าไปแก้ไขเอาเอง (หรืออาจจะเขียนเป็น Script ที่มีนามสกุล VBS ก็ได้) ... ดังนั้นก่อนที่เขียนโปรแกรมขึ้นมาเพื่อ Interface กับผู้ใช้งาน เราก็ต้องรู้ทั้งตำแหน่ง และ Key ต่างๆที่ใช้ด้วยว่า มันมีค่าอะไรอยู่บ้างน่ะครับ
- มาว่าถึงตัวโปรแกรม ... เริ่มต้นด้วยการสร้าง Object ขึ้นมาเพื่อทำการทดสอบด้วย RegRead Method เพื่ออ่านค่าก่อนว่า Key ที่ต้องการนั้น มีค่าเป็น 0 หรือ 1 แล้วให้ปรากฏผลอยู่ที่ Option Control เพื่อแสดงหน้าจอติดต่อกับผู้ใช้งาน (GUI)
- เมื่อเลือกปรับค่าทั้ง 2 ตัวว่าจะให้ทำงาน หรือ ไม่ทำงานเสร็จเรียบร้อยแล้ว ก็จะให้ Object ทำงานด้วย RegWrite Method เพื่อเขียนข้อมูลกลับเข้าไปที่ Registry ระบบ
|
 การออกแบบหน้าจอ (Design Time) ประกอบด้วย Control หลักดังนี้
CommandButton Control 2 ตัว
Option Control 4 ตัว (ใช้ Index เข้าช่วย)
 เมื่อสั่งให้โปรแกรมทำงาน (Run Time)
 แจ้งผลที่ได้ออกมา
 เมื่อล็อคแล้ว ก็จะไม่สามารถคัดลอกข้อมูล เข้าไปสู่ USB Flash Drive ได้ (แต่สามารถคัดลอกข้อมูลออกมาจาก Flash Drive ได้)
 เมื่อล็อคแล้ว ก็จะไม่สามารถลบข้อมูลออกจากตัว USB Flash Drive ได้
 สำหรับการล็อค Registry Tools (ลักษณะแบบนี้พวกเกรียนชอบมากครับ ... พี่น้อง)
รายการหมกเม็ด ... ให้เกรียนไปหาเอาเอง
 ในกรณีที่ Key ที่ต้องการจะอ่าน มันไม่มีอยู่ใน Registry ... จะเกิด Error ขึ้นทันที
มาดูโค้ดกันเถอะ ...
Option Explicit
'---------------------------------------------------------------------------------------------------------
Private Sub Form_Load()
'---------------------------------------------------------------------------------------------------------
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Dim strKey As String
' กำหนดค่าที่ใช้ในการทำ Registry Edit เพื่อทดสอบว่ามีการเปิด หรือ ปิดการใช้งาน Registry Tool หรือไม่
strKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _
"Policies\System\DisableRegistryTools"
' ผมใช้การเขียนเป็นฟังค์ชั่นเพื่อลดจำนวนโค้ดลงไป หากเรามีการปรับค่าใน Registry จำนวนมากๆ
' ส่งค่า Key ที่เราต้องการทดสอบไป โดยพิจารณาจากค่า DisableRegistryTools
' หากคืนค่ากลับมาเป็น 0 แสดงว่าสามารถใช้งาน Registry Tools ได้
' หากคืนค่ากลับมาเป็น 1 แสดงว่าปิดการใช้งาน Registry Tools เอาไว้
If RegRead(strKey) = 0 Then
optRegistryTool(0).Value = True
Else
optRegistryTool(1).Value = True
End If
' กำหนดค่าที่ใช้ในการทำ Registry Edit เพื่อทดสอบว่ามีการป้องกันการเขียนข้อมูลลงไปที่ USB Flsh Drive หรือไม่
strKey = "HKLM\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\WriteProtect"
' ส่งค่า Key ที่เราต้องการทดสอบไป โดยพิจารณาจาก WriteProtect
' หากคืนค่ากลับมาเป็น 0 (Enable) แสดงว่าเปิดใช้งาน USB Flash Drive
' หากคืนค่ากลับมาเป็น 1 (Disable) แสดงว่าล็อคการใช้งาน USB Flash Drive
If RegRead(strKey) = 0 Then
optWriteProtect(0).Value = True
Else
optWriteProtect(1).Value = True
End If
End Sub
'---------------------------------------------------------------------------------------------------------
' โปรแกรมย่อยที่รับค่า Key ในการทดสอบเข้ามา และคืนค่ากลับเป็น 0 หากเปิดใช้งาน (Enable)
' คืนค่ากลับเป็น 1 หากปิดการใช้งาน (Disable)
Public Function RegRead(strKey As String) As Byte
' จะคืนค่ากลับเป็น Boolean (True/False) ก็ได้น่ะครับ ... ลองเล่นดู
'---------------------------------------------------------------------------------------------------------
' ประกาศตัวแปรแบบ Object
Dim Obj As Object
' เรียกใช้งาน WScript Object
Set Obj = CreateObject("WScript.Shell")
If Obj.RegRead(strKey) = 0 Then
RegRead = 0
Else
RegRead = 1
End If
Set Obj = Nothing
End Function
'---------------------------------------------------------------------------------------------------------
' เหตุการณ์ (Events) ที่ต้องการปรับเปลี่ยนค่าใน Registry Edit
Private Sub cmdOK_Click()
'---------------------------------------------------------------------------------------------------------
Dim Msg As String
Msg = ""
' โจทย์ให้ไปคิดแก้ไขเพิ่มเติมเอาเองครับ ... นั่นคือ WriteProtectFlashDrive กับ RegistryTools
' เราสามารถลดโค้ดโดยการใช้งานโปรแกรมย่อยร่วมกันตัวเดียวก็ได้ ดูตัวอย่างจากฟังค์ชั่น RegRead
' เลือก Option (Index = 0) แสดงว่าไม่ได้ล็อคการใช้งาน USB Flash Drive
If optWriteProtect(0).Value Then
Call WriteProtectFlashDrive(True)
Msg = Msg & "คุณอนุญาตให้สามารถเขียนข้อมูลลงใน USB Flash Drive ได้" & vbCrLf
' เลือก Option (Index = 1) แสดงว่าล็อคการใช้งาน USB Flash Drive
Else
Call WriteProtectFlashDrive(False)
Msg = Msg & "คุณไม่อนุญาตให้สามารถเขียนข้อมูลลงใน USB Flash Drive ได้" & vbCrLf
End If
' เลือก Option (Index = 0) แสดงว่าไม่ได้ล็อคการใช้งาน Registry Tools
If optRegistryTool(0).Value Then
Call RegistryTools(True)
Msg = Msg & "คุณอนุญาตให้สามารถใช้งาน Registry Tool ได้"
' เลือก Option (Index = 1) แสดงว่าล็อคการใช้งาน Registry Tools เอาไว้
Else
Call RegistryTools(False)
Msg = Msg & "คุณไม่อนุญาตให้สามารถใช้งาน Registry Tool ได้"
End If
' รายงานผล
MsgBox Msg, vbOKOnly + vbInformation, "รายงานสถานะ"
End Sub
'---------------------------------------------------------------------------------------------------------
' Tips:
' โปรแกรมย่อย WriteProtectFlashDrive และ RegistryTools
' สามารถลดคำสั่งให้เป็นโปรแกรมย่อยตัวเดียวกัน เพื่อให้ใช้งานร่วมกันได้
'---------------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------
' การรับค่าของฟังค์ชั่นตัวนี้ หากเราไม่ส่งค่าอะไรมาเลย ก็ให้ถือว่า blnEnable เป็นจริง
Public Sub WriteProtectFlashDrive(Optional ByVal blnEnable As Boolean = True)
'---------------------------------------------------------------------------------------------------------
' ประกาศตัวแปรแบบ Object
Dim Obj As Object
' เรียกใช้งาน WScript Object
Set Obj = CreateObject("WScript.Shell")
' หากเลือก Option Control ตัวแรก นั่นคือเรากำหนดให้สามารถเขียนข้อมูลลงใน USB Flash Drive ได้
If blnEnable Then
Obj.Regwrite "HKLM\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\" & _
"WriteProtect", 0, "REG_DWORD"
Else
Obj.Regwrite "HKLM\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\" & _
"WriteProtect", 1, "REG_DWORD"
End If
Set Obj = Nothing
End Sub
'---------------------------------------------------------------------------------------------------------
' การรับค่าของฟังค์ชั่นตัวนี้ หากเราไม่ส่งค่าอะไรมาเลย ก็ให้ถือว่า blnEnable เป็นจริง
Public Sub RegistryTools(Optional ByVal blnEnable As Boolean = True)
'---------------------------------------------------------------------------------------------------------
' ประกาศตัวแปรแบบ Object
Dim Obj As Object
' เรียกใช้งาน WScript Object
Set Obj = CreateObject("WScript.Shell")
' หากเลือก Option Control ตัวแรก นั่นคือเรากำหนดให้สามารถใช้งาน Registry Tools ได้
If blnEnable Then
Obj.Regwrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _
"Policies\System\DisableRegistryTools", 0, "REG_DWORD"
Else
Obj.Regwrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _
"Policies\System\DisableRegistryTools", 1, "REG_DWORD"
End If
Set Obj = Nothing
End Sub
'---------------------------------------------------------------------------------------------------------
Private Sub cmdExit_Click()
'---------------------------------------------------------------------------------------------------------
Set frmWriteProtectUSBFlash = Nothing
End
End Sub
|
Conclusion: การเรียนรู้ ฝึกฝน การเขียนโปรแกรมนั้น มันก็คงไม่ได้หมายความว่า จะต้องมาทำงานสายโปรแกรมเมอร์แต่เพียงอย่างเดียวหรอกน่ะครับ เหมือนที่หลายๆคนกลัว หรือ ไม่ชอบ (ทั้งๆที่จบด้านคอมพิวเตอร์มาโดยตรง) ส่วนสายงานทางด้าน IT Support หรือ Technical ก็ยังสามารถนำไปประยุกต์ใช้งานในองค์กรที่สังกัดได้ เพราะนอกจากจะได้พัฒนาเพิ่มพูนขีดความสามารถ แล้วก็ยังได้เป็นผลงานของตัวเองอีกด้วย ... จากนั้นก็ค่อยรวบรวมเอา Registry ระบบที่สำคัญๆ เก็บเอาไว้ใช้งานให้อยู่ในโปรแกรมตัวเดียวกัน จะได้ไม่ต้องมานั่งจดจำ หรือ นำไฟล์ Visual Basic Script (VBS) ติดตัวไปเพียบให้เกะกะเอาเปล่าๆครับ ... พี่น้อง
|