只要掌握了原理,你也能寫(xiě)出一個(gè)所謂的“黑客”程序。下面筆者帶領(lǐng)大家用VB親自編寫(xiě)一個(gè)遠(yuǎn)程控制程序。從而揭開(kāi)它的神秘面紗。
一、所用控件
在程序中將使用Winsock控件。Winsock控件是一個(gè)ActiveX控件,使用TCP協(xié)議或UDP協(xié)
議連接到遠(yuǎn)程計(jì)算機(jī)上并與之交換數(shù)據(jù)。和定時(shí)器控件一樣,Winsock控件在運(yùn)行時(shí)是不可見(jiàn)的。Winsock的工作原理是:客戶端向服務(wù)器端發(fā)出連接請(qǐng)求,服務(wù)器端則不停地監(jiān)聽(tīng)客戶端的請(qǐng)求,當(dāng)兩者的協(xié)議溝通時(shí),客戶端和服務(wù)器端之間就建立了連接,這時(shí)客戶端和服務(wù)器端就可以實(shí)現(xiàn)雙向數(shù)據(jù)傳輸。實(shí)際編程中,必須分別建立一個(gè)服務(wù)器端應(yīng)用程序和一個(gè)客戶端應(yīng)用程序,兩個(gè)應(yīng)用程序中分別有自己的Winsock控件。首先設(shè)置Winsock控件使用的協(xié)議,這里我們使用TCP協(xié)議,F(xiàn)在,讓我們開(kāi)始用VB建立兩個(gè)程序,一個(gè)是客戶端程序myclient,另一個(gè)是服務(wù)器端程序myserver。
二、編寫(xiě)客戶端程序
首先來(lái)建客戶端程序myclient。在myclient程序中建立一個(gè)窗體,加載Winsock控件,稱為tcpclient,表示使用的是TCP協(xié)議,再加入兩個(gè)文本框(text1和text2),用來(lái)輸入服務(wù)器的IP地址和端口號(hào),然后建立一個(gè)按鈕(cd1),用來(lái)建立連接,按下之后就可以對(duì)連接進(jìn)行初始化了,代碼如下:
private sub cd1_click()
tcpclient.romotehost=text1.text
tcpclient.romoteport=val(text2.text)'端口號(hào),缺省為1001
tcpclient.connect '調(diào)用connect方法,與指定IP地址的計(jì)算機(jī)進(jìn)行連接
cd1.enabled=false
end sub
連接之后就是如何處理所收到的數(shù)據(jù)的問(wèn)題了?蛻舳撕头⻊(wù)器端建立連接后,如果有任何一端接收到新的數(shù)據(jù),就會(huì)觸發(fā)該端winsock控件的dataarrival事件,在響應(yīng)這個(gè)事件時(shí),可以使用getdata方法獲得發(fā)送來(lái)的數(shù)據(jù)。比如可以在tcpclient的dataarrival事件中編寫(xiě)代碼如下:
private sub tcpclient_dataarrival(byval bytestotal as long)
dim x as string
tcpclient.getdata x '使用getdata獲得發(fā)送來(lái)的數(shù)據(jù)
.......
End sub
后面的省略部分表示對(duì)接收到的數(shù)據(jù)進(jìn)行的具體處理,讀者可以根據(jù)實(shí)際情況編寫(xiě)。
三、編寫(xiě)服務(wù)器端程序
先建立一個(gè)窗體,加載Winsock控件,名稱為tcpserver。另外在窗體上加入一個(gè)文本框text1用來(lái)顯示客戶機(jī)的IP地址和客戶機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)信息。
當(dāng)客戶端程序運(yùn)行時(shí),在客戶端程序按下連接按鈕后,客戶端向服務(wù)器端程序請(qǐng)求連接,這時(shí)服務(wù)器端的connectionrequest事件被觸發(fā),所以服務(wù)器端程序要解決連接問(wèn)題,可以使用connectionrequest事件完成此功能。代碼如下:
'在窗體的load事件中對(duì)tcpserver控件進(jìn)行初始化
private sub form_load()
tcpserver.localport=1001
tcpserver.listen '把服務(wù)器置于監(jiān)聽(tīng)檢測(cè)狀態(tài)
end sub
'服務(wù)器端接收到客戶端的連接請(qǐng)求,首先檢查當(dāng)前狀態(tài)是否處于連接關(guān)閉狀態(tài)
Private sub tcpclient_connectionrequest(Byval requestID as long)
If tcpserver.state<>sckclosed then '檢查控件的state屬性是否為關(guān)閉
Tcpserver.close '
Tcpserver.accept requestID '
End if
End sub
現(xiàn)在我們?cè)诜⻊?wù)器端程序tcpserver的dataarrival事件中添加以下代碼,以便讓服務(wù)器端程序可以接收客戶機(jī)端的指令,并運(yùn)行相應(yīng)的程序。
四、測(cè)試遠(yuǎn)程控制程序
現(xiàn)在,你就可以將這兩個(gè)程序分別運(yùn)行于兩臺(tái)使用TCP/IP協(xié)議聯(lián)網(wǎng)的機(jī)器了。在客戶機(jī)端你按下連接按鈕,再輸入“c:mmand.com”,可以看到在服務(wù)器端立刻打開(kāi)一個(gè)DOS窗口,設(shè)想一下,如果它運(yùn)行一些破壞性的命令會(huì)發(fā)生什么事情?這就是一個(gè)最基本的遠(yuǎn)程控制程序。當(dāng)然,真正的黑客程序要復(fù)雜得多,但基本原理是相同的,F(xiàn)在你該恍然大悟了吧?