สืบเนื่องจาก [You must be registered and logged in to see this link.] ขอให้คนที่จะเข้าแข่งเขียนโปรแกรม ลงชื่อที่กระทู้นี้ครับ (เห็นคำว่าแข่งแต่ไม่มีรางวัลนะครับ แข่งเล่นๆ เท่านั้น)
จุดประสงค์โปรแกรม
เขียนคำสั่งบันทึกและตรวจค่าที่เพิ่มเข้ามาใน Registry ที่คีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run เพื่อใช้ในการป้องกันไวรัสเข้ามาฝังคำสั่งเรียกเปิดไฟล์ไวรัสเมื่อตอนบูตเครื่อง
ลักษณะการทำงานของโปรแกรม
1. เมื่อคลิกที่ปุ่ม Button1 โปรแกรมจะบันทึกค่าทั้งหมดในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run เก็บเป็นข้อมูลเอาไว้เปรียบเทียบ โดยจะเขียนให้เก็บไว้ที่ไฟล์ข้อความหรือเก็บไว้ที่ไหนก็ได้ตามถนัด (เก็บเอาไว้เป็นข้อมูลที่ใช้นำมาเปรียบเทียบ)
2. เมื่อคลิกปุ่ม Button2 โปรแกรมจะดึงเอาข้อมูลที่เคยบันทึกไว้ (จากการคลิกปุ่ม Button1) มาเปรียบเทียบกับข้อมูลที่อยู่ในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ณ เวลาปัจจุบัน
3. หากนำค่าทั้งสองมาเปรียบเทียบข้อมูลกันแล้ว พบว่ามีการใส่ค่าเพิ่มเข้ามาในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (ในกรณีนี้สมมุติว่าเป็นไวรัสเขียนคำสั่งเพิ่มเข้าไป) ก็นำเอาค่าดังกล่าวมาแสดงที่ช่อง Edit1
อย่างไรก็ตามในสภาพปกติการเปรียบเทียบจะไม่มีผลอะไรเนื่องจากระหว่างการเขียนโปรแกรมและทดสอบคงไม่มีไวรัสมาฝังตัวเองให้เห็น ดังนั้นระหว่างที่ทำขั้นตอนที่ 1 เสร็จ ก่อนเขียนคำสั่งทำขั้นตอนที่ 2 คุณต้องสร้างค่าอะไรก็ได้เพิ่มเข้าไปใน Regsitry เพื่อให้เกิดความแตกต่างระหว่างข้อมูลที่บันทึกไปแล้ว กับข้อมูลที่เพิ่มเข้าไปใหม่
[You must be registered and logged in to see this image.]
ผมจะทดสอบโปรแกรมว่าทำงานได้จริงดังนี้
1. คลิกปุ่ม Button1 แล้วมีการบันทึกข้อมูลในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ทั้งหมดเก็บเอาไว้
2. จะสร้างค่าเพิ่มในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run จำนวน 1 ค่า เพื่อจำลองสถานการณ์ว่ามีไวรัสเขียนคำสั่งเพิ่มเข้ามา
3. คลิกปุ่ม Button2 เพื่อให้โปรแกรมนำเอาข้อมูลที่สำรองไว้มาเปรียบเทียบกับข้อมูลในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (ตอนนี้มีค่าแปลกปลอมเพิ่มขึ้น 1 ค่า) ถ้าโปรแกรมทำงานถูกต้องจะแสดงค่าที่แปลกปลอม 1 ค่านั้นออกมาให้เห็นทันที่ช่อง Edit1
หมายเหตุ
ผมจะทดสอบโปรแกรม 3 รอบ โดยเพิ่มค่าในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ทีละ 1 เพื่อดูโปรแกรมสามารถตรวจหาค่าที่เพิ่มเข้ามาครบทุกรอบหรือไม่
แนวคิดการเขียนคำสั่ง
- คำสั่งในการอ่านค่า Regsitry มี RegRead, RegEnumVal, RegEnumKey แต่ละคำสั่งใช้ไม่เหมือนกันลองประยุกต์ดู
- คำสั่งในการอ่านค่า Registry เอื้อต่อการใช้ลูปอยู่แล้วลองอ่าน Help ดูครับ
- ใช้คำสั่งลูปอะไรก็ได้ตามถนัด แต่ขอให้สามารถทำงานได้ตามที่ต้องการก็พอ
ข้อสรุป
ให้ระยะเวลาในการเขียนโปรแกรม 1 วัน ส่งก่อนวันพรุ่งนี้ 9 โมงเช้า เขียนได้แค่ไหนก็เอาแค่นั้น การส่งคลิกที่ชื่อผมแล้ว PM โค้ดมา อย่านำโค้ดมาแปะในกระทู้ เพื่อป้องกันการนำโค้ดของผู้แข่งที่ส่งก่อนมาดัดแปลง (หลังจาก 9 โมงเช้าพรุ่งนี้ ผมจะนำโค้ดมาแปะให้เอง)
เพื่อความสะดวกรวดเร็วผมได้ทำ GUI ให้แล้วดังนี้ การแข่งครั้งนี้เน้นที่การใช้ชุดคำสั่ง ที่มีการใช้ลูป และความเร็วในการเขียน(ใครเขียนเสร็จก่อน) ดังนั้นเรื่องหน้าตาโปรแกรมไม่มีผลใดๆ ทั้งสิ้น แค่เอาชุดคำสั่งหรือการเรียกฟังก์ชั่นมาใส่ที่ Case $Button1 และ Case $Button2 ก็พอ
โจทย์เดียวกัน และระยะกำหนดไว้ 1 วัน พรุ่งนี้จะมาประกาศผล
จุดประสงค์โปรแกรม
เขียนคำสั่งบันทึกและตรวจค่าที่เพิ่มเข้ามาใน Registry ที่คีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run เพื่อใช้ในการป้องกันไวรัสเข้ามาฝังคำสั่งเรียกเปิดไฟล์ไวรัสเมื่อตอนบูตเครื่อง
ลักษณะการทำงานของโปรแกรม
1. เมื่อคลิกที่ปุ่ม Button1 โปรแกรมจะบันทึกค่าทั้งหมดในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run เก็บเป็นข้อมูลเอาไว้เปรียบเทียบ โดยจะเขียนให้เก็บไว้ที่ไฟล์ข้อความหรือเก็บไว้ที่ไหนก็ได้ตามถนัด (เก็บเอาไว้เป็นข้อมูลที่ใช้นำมาเปรียบเทียบ)
2. เมื่อคลิกปุ่ม Button2 โปรแกรมจะดึงเอาข้อมูลที่เคยบันทึกไว้ (จากการคลิกปุ่ม Button1) มาเปรียบเทียบกับข้อมูลที่อยู่ในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ณ เวลาปัจจุบัน
3. หากนำค่าทั้งสองมาเปรียบเทียบข้อมูลกันแล้ว พบว่ามีการใส่ค่าเพิ่มเข้ามาในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (ในกรณีนี้สมมุติว่าเป็นไวรัสเขียนคำสั่งเพิ่มเข้าไป) ก็นำเอาค่าดังกล่าวมาแสดงที่ช่อง Edit1
อย่างไรก็ตามในสภาพปกติการเปรียบเทียบจะไม่มีผลอะไรเนื่องจากระหว่างการเขียนโปรแกรมและทดสอบคงไม่มีไวรัสมาฝังตัวเองให้เห็น ดังนั้นระหว่างที่ทำขั้นตอนที่ 1 เสร็จ ก่อนเขียนคำสั่งทำขั้นตอนที่ 2 คุณต้องสร้างค่าอะไรก็ได้เพิ่มเข้าไปใน Regsitry เพื่อให้เกิดความแตกต่างระหว่างข้อมูลที่บันทึกไปแล้ว กับข้อมูลที่เพิ่มเข้าไปใหม่
[You must be registered and logged in to see this image.]
ผมจะทดสอบโปรแกรมว่าทำงานได้จริงดังนี้
1. คลิกปุ่ม Button1 แล้วมีการบันทึกข้อมูลในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ทั้งหมดเก็บเอาไว้
2. จะสร้างค่าเพิ่มในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run จำนวน 1 ค่า เพื่อจำลองสถานการณ์ว่ามีไวรัสเขียนคำสั่งเพิ่มเข้ามา
3. คลิกปุ่ม Button2 เพื่อให้โปรแกรมนำเอาข้อมูลที่สำรองไว้มาเปรียบเทียบกับข้อมูลในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (ตอนนี้มีค่าแปลกปลอมเพิ่มขึ้น 1 ค่า) ถ้าโปรแกรมทำงานถูกต้องจะแสดงค่าที่แปลกปลอม 1 ค่านั้นออกมาให้เห็นทันที่ช่อง Edit1
หมายเหตุ
ผมจะทดสอบโปรแกรม 3 รอบ โดยเพิ่มค่าในคีย์ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run ทีละ 1 เพื่อดูโปรแกรมสามารถตรวจหาค่าที่เพิ่มเข้ามาครบทุกรอบหรือไม่
แนวคิดการเขียนคำสั่ง
- คำสั่งในการอ่านค่า Regsitry มี RegRead, RegEnumVal, RegEnumKey แต่ละคำสั่งใช้ไม่เหมือนกันลองประยุกต์ดู
- คำสั่งในการอ่านค่า Registry เอื้อต่อการใช้ลูปอยู่แล้วลองอ่าน Help ดูครับ
- ใช้คำสั่งลูปอะไรก็ได้ตามถนัด แต่ขอให้สามารถทำงานได้ตามที่ต้องการก็พอ
ข้อสรุป
ให้ระยะเวลาในการเขียนโปรแกรม 1 วัน ส่งก่อนวันพรุ่งนี้ 9 โมงเช้า เขียนได้แค่ไหนก็เอาแค่นั้น การส่งคลิกที่ชื่อผมแล้ว PM โค้ดมา อย่านำโค้ดมาแปะในกระทู้ เพื่อป้องกันการนำโค้ดของผู้แข่งที่ส่งก่อนมาดัดแปลง (หลังจาก 9 โมงเช้าพรุ่งนี้ ผมจะนำโค้ดมาแปะให้เอง)
เพื่อความสะดวกรวดเร็วผมได้ทำ GUI ให้แล้วดังนี้ การแข่งครั้งนี้เน้นที่การใช้ชุดคำสั่ง ที่มีการใช้ลูป และความเร็วในการเขียน(ใครเขียนเสร็จก่อน) ดังนั้นเรื่องหน้าตาโปรแกรมไม่มีผลใดๆ ทั้งสิ้น แค่เอาชุดคำสั่งหรือการเรียกฟังก์ชั่นมาใส่ที่ Case $Button1 และ Case $Button2 ก็พอ
- Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 496, 314, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 16, 8, 465, 257)
GUICtrlSetData(-1, "Edit1")
$Button1 = GUICtrlCreateButton("Button1", 16, 280, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Button2", 392, 280, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Case $Button2
EndSwitch
WEnd
โจทย์เดียวกัน และระยะกำหนดไว้ 1 วัน พรุ่งนี้จะมาประกาศผล
แก้ไขล่าสุดโดย POS เมื่อ 21/04/11, 09:31 am, ทั้งหมด 1 ครั้ง