📄 remotescan.bas
字号:
Attribute VB_Name = "RemoteScan"
'========================================================================
'作者:jhk
'E-Mail:jhkdiy_gzb@21cn.net
'日期:2004年1月11日
'声明:
' 如果大家要转贴或修改的话,请保留作者信息,如果要修改源程序的话请先
' 备份一份原稿(源代码),以便其他朋友可以看到原汁原味的代码,而且他
' 也有机会思考更好的算法,到时别忘了发一份给我喔,谢谢!
'========================================================================
Public bCanScan As Boolean '能否进行扫描的变量,做开关作用
Public PauseTime As Single
Public Sub Pause(Interval)
'延迟一定时间
Dim Current
Current = Timer '获取当前时间
'当前时间减去已定下的时间,如果小于设置值则循环
Do While Timer - Current < Val(Interval)
DoEvents
Loop
End Sub
Public Function RemoteScanIP(ByVal StartIP As String, ByVal EndIP As String, ByVal StartPort As String, ByVal EndPort As String)
On Error GoTo ScanError
'在这里假设开始IP地址为(61.145.44.12),终止IP地址为(61.145.46.100)
'在下面的注释为上面的IP为代表
ReDim numStartIP(0 To 3) As String '开始IP数组
ReDim numEndIP(0 To 3) As String '终止IP数组
Dim ConnectRemoteIP As String '正式连接的IP地址
Dim IPScan As Integer '循环多少个254的变量
Dim IPS0 As Integer '开始IP中的(61)
Dim IPS1 As Integer '开始IP中的(145)
Dim IPS2 As Integer '开始IP中的(44)
Dim IPS3 As Integer '开始IP中的(12)
Dim IPE0 As Integer '终止IP中的(61)
Dim IPE1 As Integer '终止IP中的(145)
Dim IPE2 As Integer '终止IP中的(46)
Dim IPE3 As Integer '终止IP中的(100)
Dim i As Integer, k As Integer, j As Integer '循环变量
'-----------------------------------------------------------
'进行IP地址的分解,如将(61.145.44.12)的IP地址分解为
'四组数字,分别为(61)、(145)、(44)、(12),分解
'后保存在数组中,如(numStartIP())数组就保存了开始IP的四组数字
IPstrTOnum StartIP, numStartIP()
IPstrTOnum EndIP, numEndIP()
'-----------------------------------------------------------
'将四组字符型的数字正式转换为整型
IPS0 = Int(numStartIP(0)): IPS1 = Int(numStartIP(1)): IPS2 = Int(numStartIP(2)): IPS3 = Int(numStartIP(3))
IPE0 = Int(numEndIP(0)): IPE1 = Int(numEndIP(1)): IPE2 = Int(numEndIP(2)): IPE3 = Int(numEndIP(3)):
'如果IP地址不符合程序要求,则要重新输入
If IPS0 <> IPE0 Or IPS1 <> IPE1 Then
MsgBox "IP地址范围太大,程序无法扫描,请重新输入!", vbOKOnly + vbInformation, "警告"
Form1.txtRemoteStartIP.SelLength = Len(Form1.txtRemoteStartIP.Text)
Form1.txtRemoteStartIP.SetFocus
Exit Function
End If
IPScan = IPE2 - IPS2 '在(61.145.44.12-61.145.46.100)中将46-44。
bCanScan = True
'如果IP地址情况为(61.145.44.12-61.145.46.100),即C类的44和46不同
'此时应循环N(N=46-44)个254的循环。
If IPS2 < IPE2 Then '如果情况是(44和46)IP情况
For k = 1 To IPScan 'k代表循环多少个254
DoEvents
For i = IPS3 To 254 'i从开始ips3到254,即(61.145.44.1--61.145.44.254)
Debug.Print "当前PauseTime值为:" & PauseTime
Pause PauseTime
DoEvents
ConnectRemoteIP = Trim$(Str$(IPS0)) + "." + Trim$(Str$(IPS1)) + "." + Trim$(Str$(IPS2)) + "." + Trim$(Str$(i))
Debug.Print "连接IP为:" & ConnectRemoteIP
Form1.SBScanStatus.Panels(1).Text = "扫描对象:" & ConnectRemoteIP
'正式连接IP进行端口扫描
RemoteScanPort ConnectRemoteIP, StartPort, EndPort
'如果用户在中途终止扫描,就退出函数
If bCanScan = False Then Exit Function
Next i
IPS2 = IPS2 + 1 '使44加1,IP即为(61.145.45.1)
IPS3 = 1 '最后IP恢复为1
'如果用户在中途终止扫描,就退出函数
If bCanScan = False Then Exit Function
Next k
'循环后IP情况为(61.145.46.1--61.145.46.254)
'则只要最后一组IP进行循环即可
For j = IPS3 To IPE3
Debug.Print "当前PauseTime值为:" & PauseTime
Pause PauseTime
ConnectRemoteIP = Trim$(Str$(IPS0)) + "." + Trim$(Str$(IPS1)) + "." + Trim$(Str$(IPS2)) + "." + Trim$(Str$(j))
Debug.Print "连接IP为:" & ConnectRemoteIP
Debug.Print "IP长度为:" & Len(ConnectRemoteIP)
Form1.SBScanStatus.Panels(1).Text = "扫描对象:" & ConnectRemoteIP
'正式连接IP进行端口扫描
RemoteScanPort ConnectRemoteIP, StartPort, EndPort
'如果用户在中途终止扫描,就退出函数
If bCanScan = False Then Exit Function
Next j
ElseIf IPS2 = IPE2 Then
'如果IP情况为(61.145.44.1--61.145.44.254)
'则只要最后一组IP进行循环即可
For j = IPS3 To IPE3
Debug.Print "当前PauseTime值为:" & PauseTime
Pause PauseTime
ConnectRemoteIP = Trim$(Str$(IPS0)) + "." + Trim$(Str$(IPS1)) + "." + Trim$(Str$(IPS2)) + "." + Trim$(Str$(j))
Form1.SBScanStatus.Panels(1).Text = "扫描对象:" & ConnectRemoteIP
Debug.Print "连接IP为:" & ConnectRemoteIP
'正式连接IP进行端口扫描
RemoteScanPort ConnectRemoteIP, StartPort, EndPort
'如果用户在中途终止扫描,就退出函数
If bCanScan = False Then Exit Function
Next j
Else
RemoteScanIP = False: Exit Function
End If
'一切正常,程序返回true
RemoteScanIP = True: Exit Function
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ScanError:
RemoteScanIP = False
End Function
Function IPstrTOnum(ByVal strIP As String, ip() As String)
'此函数的功能是将任意一组IP地址分解为四分数字,
'即将(61.145.45.89)分解成61、145、45、89四组数字
'去除IP中的点,结果保存到数组中。
Dim PosStart As Integer
Dim PosEnd As Integer
Dim IPadd(3) As String
PosStart = InStr(1, strIP, ".")
IPadd(0) = Mid$(strIP, 1, PosStart - 1)
'Debug.Print "第0组IP是:" & IPadd(0)
PosStart = 0
For i = 1 To 2
PosStart = InStr(PosStart + 1, strIP, ".")
PosEnd = InStr(PosStart + 1, strIP, ".")
IPadd(i) = Mid$(strIP, PosStart + 1, PosEnd - PosStart - 1)
'Debug.Print "第" & i & "组IP是:" & IPadd(i)
Next i
'InStrRev函数从字符串的结尾开始搜索要找的字符的位置
'但结果还是从左边第一个字符算起
PosEnd = InStrRev(strIP, ".")
IPadd(3) = Mid$(strIP, PosEnd + 1, Len(strIP))
'Debug.Print "第4组IP是:" & IPadd(3)
For i = 0 To 3
ip(i) = IPadd(i)
Next i
End Function
Public Sub RemoteScanPort(ByVal ConnectIP As String, ByVal StartPort2 As String, ByVal EndPort2 As String)
'-------------------------------------------------------------------------------
'对一个IP的端口进行扫描
Debug.Print "能否扫描:" & Form1.cmdEndScan.Enabled
If StartPort2 = EndPort2 Then '如果开始端口和终止端口一样
If bCanScan = True Then
DoEvents
Form1.SBScanStatus.Panels(2).Text = "当前扫描端口:" & StartPort2
'利用WinSock控件进行连接试验,如果连接成功
'则WinSock控件会产生Connect事件,在事件中
'获取远程连接的IP和端口即可实现远程端口扫描
Form1.WS1.Connect ConnectIP, StartPort2
Debug.Print "当前PauseTime值为:" & PauseTime
Pause PauseTime
Form1.WS1.Close
Else
Form1.WS1.Close
Exit Sub
End If
End If
'当开始端口小于结束端口的时候:
While Int(StartPort2) < Int(EndPort2)
Debug.Print "能否扫描:" & Form1.cmdEndScan.Enabled
If bCanScan = True Then
DoEvents
'在状态栏显示当前扫描端口:
Form1.SBScanStatus.Panels(2).Text = "当前扫描端口:" & StartPort2
'真正对IP地址和指定端口进行连接:
Form1.WS1.Connect ConnectIP, StartPort2
Debug.Print "当前PauseTime值为:" & PauseTime
Pause PauseTime
Form1.WS1.Close
StartPort2 = StartPort2 + 1 '下一个端口
Form1.SBScanStatus.Panels(2).Text = "当前扫描端口:" & StartPort2
Debug.Print StartPort2 & "---" & EndPort2
Else
Form1.WS1.Close
Exit Sub
End If
Wend
'---------------------------------------------------------------------------------
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -