类型:原创 作者:中关村在线 netdream 日期:2005-08-15 08:43:52
真正的黑客是那些具有开源思想的程序员(不知我这么讲会不会有鸡蛋扔过来),现在网上的黑客工具多了,黑别人与被黑的几率就大了。黑客工具始终是一把双刃剑,他们可以是检测网络漏洞的助手,也可以是黑别人的工具。喜欢黑客技术的网友一定用过网络扫描器,这是入侵之前踩点儿的好工具,大家一定对他们是怎么做出来的很感兴趣,好,下面我就带大家一起来了解一下一个简单的端口扫描器是如何做出来的。
"端口扫描"通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。"端口扫描"行为的一个重要特征是:在短时期内有很多来自相同的信源地址传向不同的目的地端口的包。
端口扫描器通过选用远程TCP/IP协议不同端口的服务,记录目标计算机端口给予的回答的方法,可以搜集到很多关于目标计算机的各种有用信息(比如:是否有端口在侦听?是否允许匿名登陆?是否有可写的FTP目录,是否能用TELNET等 )。
端口扫描的基本原理图
好了,下面我们就用VB6.0打造一个属于自己的端口扫描器吧。
首先新建工程,准备好以下控件:SSTab、Label、Textbox、Commandbutton、Progressbar、PictureBox、Winsock、Flatscrollbar、Optionbutton.
添加两个窗体和一个模块,分别命名为Frmscaner、OpenPortDlg、Module1。Frmscaner为扫描器的主窗体,OpenPortDlg为扫描结束后的弹出结果窗口,Module1当然就是我们所要添加的模块了,如下图拖放好控件,准备添加代码。
设计界面
在通用声明部分添加如下代码:
Option Explicit
Dim countline As Integer
Dim nowport As Integer
Dim lognum As Integer
Dim fso As New FileSystemObject
Dim flag As Boolean
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
Const EM_GETLINECOUNT = &HBA
Const EM_GETLINE = &HC4
在Command1中,即开始按钮中添加如下代码:
Private Sub Command1_Click()
Dim i
If Command1.Caption = "开始" Then
GoOnFlag = True
Command1.Caption = "停止"
WckNum = ThreadNUM.Value
StartPort = PORTSTART.Text
EndPort = PORTEND.Text
RemoteIP = IPADDRESS.Text
Fengzi = 0
Fengmu = EndPort - StartPort + 1
portscan StartPort, EndPort, WckNum
Else
Command1.Enabled = False
GoOnFlag = False
DoEvents
On Error Resume Next
For i = 1 To WckNum
Winsock(i).Close
Next i
End If
End Sub
在退出按钮中只需写一句Unload Me就可以了:
Private Sub Command2_Click()
Unload Me
End Sub
在Form Load中添加:
Private Sub Form_Load()
WckNum = ThreadNUM.Value
StartPort = PORTSTART.Text
EndPort = PORTEND.Text
PgBar.Value = 0
Call paintstatus
flag = True
End Sub
在Form Resize中添加:
Private Sub Form_Resize()
STATUS.Width = Me.Width - 4830
End Sub
在通用 Frame1_DblClick中添加:
Private Sub Frame1_DblClick(Cancel As MSForms.ReturnBoolean)
If flag Then
Me.WindowState = 2
Else
Me.WindowState = 0
End If
End Sub
在Option1 Click中添加:
Private Sub Option1_Click()
ThreadNUM.Enabled = True
End Sub
在Option2 Click中添加:
Private Sub Option2_Click()
ThreadNUM.Value = 500
End Sub
在Option3 Click中添加:
Private Sub Option3_Click()
ThreadNUM.Value = 100
End Sub
在STATUS Change中添加:
Private Sub STATUS_Change()
countline = SendMessage(STATUS.hwnd, EM_GETLINECOUNT, 0, 0)
If countline > 26 Then
STATUS.Text = ""
End If
End Sub
在ThreadNUM Change中添加:
Private Sub ThreadNUM_Change()
WckNum = ThreadNUM.Value
labelnumber.Caption = Str(WckNum)
End Sub
在Winsock Connect中添加:
Private Sub Winsock_Connect(Index As Integer)
STATUS.Text = STATUS.Text & "(端口" & Str(Winsock(Index).RemotePort) & "开放)" & vbCrLf & vbCrLf
Addtolist Winsock(Index).RemotePort
End Sub
在通用 Addtolist中添加:
Sub Addtolist(port As Integer)
Dim addstr, plus As String
addstr = "发现端口" & Str(port) & "打开" & Space(5)
Select Case port
Case 7
plus = "ECHO服务"
Case 21
plus = "FTP服务★★★★★"
Case 25
plus = "SMTP服务★★"
Case 43
plus = "Whois服务"
Case 53
plus = "DNS服务☆"
Case 80
plus = "HTTP服务★★★★★"
Case 81
plus = "HOSTS2名称服务"
Case 99
plus = "NCX99后门★★★★★"
Case 110
plus = "POP3服务★★★★★"
Case 111
plus = "Sun RPC服务★★"
Case 135
plus = "本地服务"
Case 137
plus = "NETBIOS 名称服务/流影POP"
Case 138
plus = "NETBIOS 数据存储服务"
Case 139
plus = "NETBIOS 会议服务★★★"
Case 119
plus = "NNTP虚拟服务"
Case 163
plus = "SNMP服务"
Case 443
plus = "https服务"
Case 512
plus = "远程执行服务"
Case 513
plus = "login, remote login"
Case 514
plus = "cmd, exec with auto auth."
Case 600
plus = "Sun IPC服务器"
Case 1080
plus = "SOCKS代理服务★★★"
Case 1433
plus = "SQL服务器★★★"
Case 3128
plus = "HTTP代理服务"
Case 7626
plus = "木马冰河★★★★★"
Case 8080
plus = "HTTP代理服务"
Case Else
plus = "未知服务!"
End Select
OpenPortDlg.List1.AddItem (addstr & plus)
End Sub
在通用 paintstatus中你看到的代码是个版权信息,可以根据自己的需要去改:)
Sub paintstatus()
STATUS.Text = "========================================" & vbCrLf _
& " PortScanner 1.0 " & vbCrLf _
& " by netdream " & vbCrLf _
& vbCrLf _
& " Net.zol.com.cn " & vbCrLf _
& "========================================" & vbCrLf
End Sub
下面是模块中的代码,分了两部分:
Public WckNum As Integer
Public StartPort As Integer
Public EndPort As Integer
Public RemoteIP As String
Public WCKcount As Integer
Public GoOnFlag As Boolean
Public Fengzi As Integer
Public Fengmu As Integer
Public Sub portscan(startpt As Integer, endpt As Integer, wck As Integer)
On Error Resume Next
Dim n, nowport, nextstart As Integer
portnum = endpt - startpt + 1
nextstart = nextstart + startpt
If portnum <> 0 Then
If Not GoOnFlag Then
OpenPortDlg.Show 1
FrmScaner.Command1.Enabled = True
FrmScaner.Command1.Caption = "开始"
Exit Sub
End If
If portnum <= wck And GoOnFlag Then
FrmScaner.PgBar.Max = portnum
nowport = startpt
For n = 1 To portnum
Load FrmScaner.Winsock(n)
FrmScaner.Winsock(n).RemoteHost = RemoteIP
FrmScaner.Winsock(n).RemotePort = nowport
FrmScaner.STATUS.Text = FrmScaner.STATUS.Text + "线程" & Str(n) & "启动:连接远程端口:" & Str(nowport) & vbCrLf & vbCrLf
FrmScaner.Winsock(n).Connect
DoEvents
FrmScaner.PgBar.Value = FrmScaner.PgBar.Value + 1
Fengzi = Fengzi + 1
FrmScaner.AllPg.Caption = Trim(Str(CInt(Fengzi / Fengmu * 100)))
nowport = nowport + 1
Next n
Do While FrmScaner.Winsock(nowport - 1).State <> 7
DoEvents
Exit Do
Loop
For n = 1 To portnum
FrmScaner.Winsock(n).Close
Unload FrmScaner.Winsock(n)
Next n
FrmScaner.Command1.Caption = "开始"
OpenPortDlg.Show 1
FrmScaner.PgBar.Value = 0
Call FrmScaner.paintstatus
Exit Sub
Else
If GoOnFlag Then
nowport = startpt
FrmScaner.PgBar.Max = wck
For n = 1 To wck
Load FrmScaner.Winsock(n)
FrmScaner.Winsock(n).RemoteHost = RemoteIP
FrmScaner.Winsock(n).RemotePort = nowport
FrmScaner.STATUS.Text = FrmScaner.STATUS.Text + "线程" & Str(n) & "启动:连接远程端口:" & Str(nowport) & vbCrLf & vbCrLf
FrmScaner.Winsock(n).Connect
DoEvents
Fengzi = Fengzi + 1
FrmScaner.AllPg.Caption = Trim(Str(CInt(Fengzi / Fengmu * 100)))
FrmScaner.PgBar.Value = FrmScaner.PgBar.Value + 1
nowport = nowport + 1
Next n
Do While FrmScaner.Winsock(nowport - 1).State <> 7
DoEvents
Exit Do
Loop
For n = 1 To wck
FrmScaner.Winsock(n).Close
Unload FrmScaner.Winsock(n)
Next n
nextstart = nextstart + wck
FrmScaner.PgBar.Value = 0
portscan nextstart, EndPort, WckNum
End If
End If
End If
Exit Sub
msgboxerr:
MsgBox "有错误了!请告诉我,我会在后续版本中改正的!" & vbCrLf & "Mail:netdream@zol.com", 16, "错误"
End Sub
下面是编译好后运行时的界面
运行界面
至此我已经把所有的代码交待了一遍,大家可以好好研究研究,这只是一种思路,希望大家如果有更好的代码能共享出来,做个真正的黑客。下载本文