ในทางระบบเครือข่าย (Network) ... Port คือ ประตู หรือ ช่องทางของการไหลเข้าออกของข้อมูล มีจำนวนขนาด 2 ยกกำลัง 16 หรือเท่ากับ 65536 Port (มีค่าระหว่าง 0 - 65535 น่ะครับ) โดยค่าตัวเลขเหล่านี้ก็จะเป็นค่าโดยเฉพาะ หรือ ถูกกำหนดไว้แล้วของแต่ละ Port ว่ามันต้องทำงานอะไร เช่น Port 20/21 สำหรับ FTP (File Transfer Protocal) เพื่อใช้ในการโอนถ่ายไฟล์ หรือ Port 80 สำหรับ HTTP (Hyper Text Transfer Protocol) เป็นการเข้าใช้งาน Web Browser นั่นเองครับ ... ซึ่งไม่แต่เฉพาะระบบเครือข่ายเท่านั้น อุปกรณ์ที่ต่อพ่วงคอมพิวเตอร์ มันก็ต้องมี Port เพื่อรับส่งข้อมูลเหมือนกัน เช่น COM Port หรือ Paralell Port นั่นยังไงล่ะครับ ... เอาหลักการเบื้องต้นแค่นี้พอ ที่เหลือหาข้อมูลเพิ่มเติมเอาเองอีกน่ะครับ
ประโยชน์ของการเขียนโปรแกรมตรวจสอบ หรือ Scan หา Port มาใช้งานเอง
- สำหรับผู้ดูแลระบบเครือข่าย สามารถตรวจสอบเครื่องคอมพิวเตอร์ (Client) ในระบบ LAN ว่าเครื่องไหนที่เปิด Port สำคัญ หรือ อันตรายเอาไว้ โดยที่ไม่ต้องเข้าไปนั่งอยู่หน้าจอของเครื่องนั้นๆเลย เช่น Port TCP และ UDP 135 ของ DCOM RPC (Windows Distributed Component Object Model Remote Procedure Call) เพราะ Port นี้เป็นรูโหว่ให้หนอนน้อย W32.Blaster.Worm เข้ามารุกราน โจมตีได้ ... จึงทำให้ผู้ดูแลระบบสามารถเข้าไปจัดการแก้ไขในเครื่อง Client ได้ทันท่วงที ก่อนที่จะลุกลามไปก่อกวนระบบเครือข่ายทั้งหมดได้
- เป็นผลงานของผู้ดูแลระบบเองนั่นแหละ ซึ่งส่วนใหญ่ก็มักจะเอาของฟรีจากต่างประเทศมาใช้งาน แต่ก็นั่นแหละครับ บางองค์กรก็ค่อนข้างที่จะเข้มงวด ในการนำ Software จากภายนอกมาใช้งาน ... มันก็เลยเป็นช่องทางเปิดโล่งให้ตัวเรานำเสนองานในแนวคิดริเริ่มสร้างสรรค์ได้ยังไงล่ะครับ (เหมือนเช่นในอดีตที่ผมเคยทำมาแล้วครับ)
- ได้เรียนรู้ ฝึกฝน จากของจริง ประสบการณ์จริง ... จะทำให้มีการพัฒนาขีดความสามารถของตนเองออกไปได้อีก ... ค่าตัวก็เพิ่มขึ้นตามไปแหละครับ (Value Add) ... อิอิอิอิอิ
|
 |
 ใช้ Component เพิ่มมาอีก 2 ตัว โดยเลือกจากเมนู Project --> Components ...
 Design Time
 Run Time
มาดูโค้ดกันเถอะ ...
Option Explicit
' นับจำนวน Port ที่ตรวจพบ
Dim CountPort As Long
' เก็บค่า Port เริ่มต้น และ ค่านี้จะเพิ่มขึ้นทีละ 1 ไปเรื่อยๆจนกว่าจะครบ
Dim PortToScan As Integer
' เก็บค่า IP Address เพื่อกำหนดให้กับ Winsock
Dim strIP As String
' ตัวแปรเก็บค่าสถานะของการ Scan หา Port
' หากเป็นจริง สถานะกำลัง Scan
' หากเป็นเท็จ สถานะหยุดการ Scan ไว้ชั่วคราว
Dim blnScan As Boolean
' กรณีสั่งหยุดการ Scan ชั่วคราว
Private Sub cmdStop_Click()
' กำหนด False เพื่อหยุดการ Scan Port
blnScan = False
End Sub
Private Sub Form_Load()
' ตั้งฟอร์มอยู่กึ่งกลาง
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
' ปิด Timer เอาไว้ก่อน เพราะยังไม่ได้สั่งให้มันทำงาน
Timer1.Enabled = False
' ตัวอย่างน่ะครับ
txtStartIP(0).Text = "192"
txtStartIP(1).Text = "168"
txtStartIP(2).Text = "0"
txtStartIP(3).Text = "1"
' Port เริ่มต้น
txtPort(0).Text = "1"
' Port สิ้นสุด
txtPort(1).Text = "8000"
txtScanResult.Text = ""
cmdStop.Enabled = False
End Sub
' ###################################################
' การกดปุ่มให้เริ่มต้น Scan หา Port
' ###################################################
Private Sub cmdScan_Click()
On Error GoTo ErrorHandler
Dim Count As Integer
' ตรวจสอบว่า IP ในการค้นหา ทั้ง 4 ชุด เป็นค่าว่างหรือไม่
For Count = 0 To 3
If Trim(txtStartIP(Count).Text) = "" Or Len(Trim(txtStartIP(Count).Text)) = 0 Then
MsgBox "กรุณาป้อนหมายเลข IP Address ให้ถูกต้องด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
Exit Sub
End If
Next Count
' ตรวจสอบว่าป้อนหมายเลข Port ทั้งเริ่มต้น และ สิ้นสุดหรือไม่
If Trim(txtPort(0).Text) = "" Or Len(Trim$(txtPort(0).Text)) = 0 Then
MsgBox "กรุณาป้อนหมายเลข Port เริ่มต้นก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
txtPort(0).SetFocus
Exit Sub
ElseIf Trim(txtPort(1).Text) = "" Or Len(Trim$(txtPort(1).Text)) = 0 Then
MsgBox "กรุณาป้อนหมายเลข Port สิ้นสุดก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานสถานะ"
txtPort(1).SetFocus
Exit Sub
' Port สิ้นสุด ต้องมีค่ามากกว่า Port เริ่มต้น
ElseIf Val(txtPort(0).Text) > Val(txtPort(1).Text) Then
MsgBox "กรุณาป้อนหมายเลข Port สิ้นสุดให้มากกว่าหมายเลข Port เริ่มต้นก่อนด้วย.", _
vbOKOnly + vbExclamation, "รายงานสถานะ"
txtPort(1).SetFocus
Exit Sub
End If
' เคลียร์ข้อมูล Status Bar Panel แรก
sbMain.Panels(1).Text = ""
' เคลียร์ค่า TextBox ในการแสดงผลหมายเลข Port
txtScanResult.Text = ""
' เคลียร์ค่าการนับจำนวน Port
CountPort = 0
' กำหนดช่วงเวลาในการ Scan หา Port มีหน่วยเป็นมิลลิวินาที โดย 1000 ms = 1 วินาที
' บางครั้งก็อาจจะต้องกำหนดให้ใช้เวลานาน เพราะมันขึ้นกับสายและระยะทาง หรืออื่นๆ ด้วยน่ะครับ
Timer1.Interval = 100
cmdScan.Enabled = False
cmdStop.Enabled = True
' เก็บค่า IP Address ไว้ในตัวแปร เพื่อความสะดวกในการเรียกใช้งาน
strIP = txtStartIP(0).Text & "." & txtStartIP(1).Text & "." & txtStartIP(2).Text & "." & txtStartIP(3).Text
' แจ้งหมายเลข Port ที่กำลัง Scan Port
txtScanResult.Text = txtScanResult.Text & "ตรวจสอบหมายเลข Port ของ IP Address: " & strIP & vbCrLf
' กำหนดหมายเลข Port เริ่มต้นให้กับตัวแปร เพราะค่านี้ต้องเพิ่มค่าขึ้นทีละ 1 จนกว่าจะครบ
PortToScan = txtPort(0).Text
' ขณะนี้กำลังทำการ Scan เมื่อไรก็ตามที่ค่านี้มีค่าเป็น False ก็จะหยุดการทำงานลงทันที
blnScan = True
' กระตุ้นนาฬิกาให้ทำงานต่อไป
Timer1.Enabled = True
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
Resume ExitProc
End Sub
' ###################################################
' โปรแกรมย่อยในการ Scan หา Port ตามช่วงที่กำหนดเอาไว้
' ###################################################
Private Sub ScanPort
On Error GoTo ErrorHandler
' เงื่อนไขให้ Scan Port เริ่มจาก Port เริ่มต้นที่กำหนด และ นับขึ้นทีละ 1 ไปเรื่อยๆจนกว่าจะครบ
' และ ยังไม่มีการกดปุ่ม cmdStop ให้หยุดการทำงาน
If PortToScan <= Val(txtPort(1).Text) And blnScan = True Then
' ให้ CPU ไปทำงานอย่างอื่นได้เลย (คืน CPU กลับไปให้กับระบบปฏิบัติการ - OS)
DoEvents
' หาก Winsock ยังมีการ Connect กับ IP ใดๆอยู่ ต้องสั่งให้ Disconnect ออกไปก่อน
If wsIP.State <> sckClosed Then wsIP.Close
' ###################################################
' ส่วนสำคัญที่กำหนดค่าเพื่อทำการทดสอบ
' กำหนด IP Address ให้กับ Winsock
wsIP.RemoteHost = strIP
' กำหนดหมายเลข Port ในการติดต่อกับ Remote IP
wsIP.RemotePort = PortToScan
' Winsock ติดต่อหมายเลข IP Address และ หมายเลข Port ตามที่กำหนด
' หวกสามารถติดต่อ IP Address และ Port ที่กำหนดได้ ก็จะกระโดดไปเหตุการณ์ wsIP_Connect()
' จากนั้นเราก็ให้มันแสดงผลตามหมายเลข Port ที่ Connect ออกมายังไงล่ะครับ
' จะเห็นการทำงานในส่วนนี้ได้ คุณต้องทำการ Debug ดูด้วยน่ะครับ ...
wsIP.Connect
' ###################################################
' เพิ่มค่า Port ในการ Scan ขึ้นอีก 1
PortToScan = PortToScan + 1
' Scan หา Port ครบแล้ว หรือ สั่งให้หยุดการ Scan
Else
cmdScan.Enabled = True
cmdStop.Enabled = False
' สั่งให้ Timer1 หยุดการทำงานด้วย
Timer1.Enabled = False
' รายงานผลการ Scan Port ใน StatusBar
If PortToScan <= Val(txtPort(1).Text) Then
sbMain.Panels(1).Text = "หยุดการทำงานที่ Port: " & PortToScan
' กำหนดค่า Port เริ่มต้นใหม่ เพื่อจะได้ทำการ Scan ต่อไปได้เลย
txtPort(0).Text = PortToScan
' กรณี Scan Port เสร็จสมบูรณ์หมดแล้ว
Else
sbMain.Panels(1).Text = "การทำงานเสร็จสมบูรณ์ - " & CountPort & " Port"
MsgBox "Scan หา Port ของหมายเลข IP Address " & strIP & " ได้ " & CountPort & " Port"
End If
End If
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
Resume ExitProc
End Sub
' ###################################################
' ตราบใดที่ Timer1.Enabled = True มันก็จะเข้ามาทำงานที่นี่ ตามค่า Interval ที่ตั้งเอาไว้
' ###################################################
Private Sub Timer1_Timer()
' หาก Timer1 มีค่า Enabled ก็จะสั่งให้ไปทำงานที่โปรแกรมย่อย ScanPort ตามเวลาที่กำหนด
sbMain.Panels(1).Text = "กำลังประมวลผล IP: " & strIP & "." & IPStartScan
' ไป Scan หา Port หรือ
' ตรวจสอบการ Connect IP Address/Port กับ Winsock Control นั่นแหละครับ
Call ScanPort
End Sub
' ###################################################
' กรณีที่ Winsock สามารถ Connect ด้วยคำสั่ง wsIP.Connect
' หากมีการ Connect กับ IP ที่ทดสอบอยู่ให้ทำการแจ้งผลใน TextBox
Private Sub wsIP_Connect()
' ###################################################
On Error GoTo ErrorHandler
' แสดงผลหมายเลข Port ใน TextBox
txtScanResult.Text = txtScanResult.Text & "Port : " & wsIP.RemotePort & vbCrLf
' นับจำนวน Port ที่ตรวจพบ
CountPort = CountPort + 1
ExitProc:
Exit Sub
ErrorHandler:
' ขณะโปรแกรมกำลังทำงาน (Run Time) ดัก Error จาก On Error GoTo ErrorHandler
If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
Resume ExitProc
End Sub
Private Sub cmdExit_Click()
Set frmPortScan = Nothing
End
End Sub
|
Conclusion: ข้อคิดเห็นในการพัฒนาต่อไป .... จากโค้ดนี้ ผมไม่ได้จัดเก็บเป็น Logging File เอาไว้ให้ แต่คุณก็สามารถหาดูตัวอย่างการ Save เป็น Text File ได้ทั้งจากเว็บไซต์ของผม หรือ ที่อื่นๆก็มีเพียบครับ ... อีกทั้งผมไม่ได้เขียนโค้ดตรวจสอบว่ามันมีการเชื่อมต่อ (Connect) กับเครื่องปลายทางอยู่หรือไม่ด้วยน่ะครับ ก็ลองปรับ ลองแก้ไขเพิ่มเติมดู เพื่อเป็นการพัฒนาต่อ-ยอดออกไปได้อีกครับ ... พี่น้อง
|