介紹一種通過套接字網路程式設計和螢幕捕獲技術實現的對遠端計算機螢幕進行監視的方法。
在實際工程中,經常有施工現場和控制中心不在一起的情況,在這種情況一般多由工程技術人員往返穿梭其間來實現對遠端施工現場的情況了解和對控制中心的矯正控制。顯然這種工作方式的效率是很低下的,沒有充分發揮計算機網路的強大優勢,其實通過網路程式設計完全可以使技術人員在控制中心對位於工程現場的遠端計算機實施監視和控制。雖然網際網路上有不少遠端終端控制軟體如"超級間諜"、"冰河"等,但由於其帶有黑軟的性質,不能保證其在程式設計時沒有留有其他後門,因此從計算機安全的角度出發應當自行開發此類軟體。為避免本文所述技術被用於製造黑客類軟體,本文將不準備對遠端終端的控制部分做進一步的介紹,而將重點放在對遠端計算機螢幕介面的監視上。 1 資料資訊在網路上的傳送
至於用流式套接字對網路進行程式設計的主要過程可用下圖來表示。伺服器方在使用套接字之前,首先必須擁有乙個socket,可用socket()函式建立之:
sock=socket(af_inet,sock_stream,0);
[圖見文末]
其中af_inet 和sock_stream指定了建立的是採用了tcp/ip位址族的流式套接字。該套接字實際上是提供了乙個通訊埠,通過這個埠可與任何乙個具有套接字埠的計算機實施通訊。一旦獲×誦碌奶捉幼鄭 α⒓賜ü齜ind()將該套接字與本機上的乙個埠建立關聯。需要預先對乙個指向包含有本機ip位址和埠資訊的sockaddr_in結構填充一些必要的資訊,如本地埠號和本地主機位址等,並通過bind()將伺服器程序在網路上標識出來:
sockin_s.sin_family=af_inet;
sockin_s.sin_addr.s_addr=0;
sockin_s.sin_port=htons(port);
bind(sock,(lpsockaddr)&sockin_s,sizeof(sockin_s));
在完成接下來的listen()偵聽後,需要用accept()等待接收客戶端的連線,由於該函式在沒有客戶端進行申請連線之前會處於阻塞狀態,因此需要為其單獨開闢乙個執行緒,以免影響到程式整體:
在這裡通過wsaasyncselect()非同步選擇函式來以非同步的形式響應關心的網路事件fd_close,並在該事件發生時發出自定義wm_msg 訊息,通過響應這個訊息可以得之當前與伺服器聯絡的客戶機程式已關閉退出,由於伺服器部分是執行於遠端工程現場的,為了使控制中心的監控程式(客戶)在下次發出監控請求時能為其提供服務需要在wm_msg的訊息響應函式裡關閉由accept() 所產生的新的套接字newskt_s,並重新啟動該執行緒等待監控程式的再次連線。在accept()函式成功返回後,就可以在定時器響應函式裡用send () 函式與之建立了連線的監控主機定時傳送捕獲的遠端螢幕資訊了。
作為客戶的監控程式,其實現過程要比伺服器簡單許多。由於需要接收資料,因此在非同步選擇函式中需要設定待監測的網路事件為fd_close和fd_read。在訊息響應函式中可以通過對訊息引數的低位位元組進行判斷而區分出具體發生是何種網路事件,並對其做出響應的反應。下面是監控端程式網路部分的主要**: ……
ipaddr=inet_addr(strip);
sock=socket(af_inet,sock_stream,0); //建立套接字
sockin_c.sin_family=af_inet;
sockin_c.sin_addr.s_un.s_addr=ipaddr;
sockin_c.sin_port=m_port;
connect(sock,(lpsockaddr)&sockin_c,sizeof(sockin_c));//連線伺服器
……wsaasyncselect(sock,m_hwnd,wm_msg,fd_read|fd_close);……
對遠端計算機螢幕的捕捉和顯示
char dot[1572864]; //1024*768*2
cbitmap bmp; //記憶體位圖
cdc wdc; //裝置環境
cdc* pdc; //指向桌面視窗的裝置環境指標
……static cwindowdc ddc(getdesktopwindow()); //引用桌面視窗指標定義物件ddc
pdc=&ddc; //將指標pdc指向ddc
wdc.createcompatibledc(pdc); //建立與ddc相容的裝置環境
bmp.createcompatiblebitmap(pdc,1024,768); //建立與ddc相容的點陣圖
wdc.selectobject(&bmp); //選擇bmp
……wdc.bitblt(0,0,1024,768,pdc,0,0,srccopy); //把桌面影象複製到wdc的bmp中
這時雖以獲取到了螢幕的資訊,並將其複製到記憶體位圖之中,但此時還不能直接將其傳送出去,需要呼叫cbitmap 類的成員函式getbitmapbits()來將影象資訊從記憶體位圖拷貝到快取,並通過套接字的send()函式將快取中存放的螢幕資訊通過網路從現場主機傳送到控制中心。
現場主機的螢幕資訊在控制中心的再現,基本上是螢幕擷取的逆過程:先建立乙個同客戶區相關的裝置環境並建立乙個與之相容的裝置環境,然後按位圖格式在記憶體中建立乙個與之相容的記憶體位圖。在從網路接收完一屏資訊後,通過cbitmap的成員函式 setbitmapbits()把快取中的螢幕資訊按位圖格式拷貝到記憶體位圖,最後完成對記憶體點陣圖的顯示。其主要過程如下:
cdc* pdc=getdc(); //引用使用者視窗指標定義物件pdc
wdc.createcompatibledc(pdc); //建立與pdc相容的device context
bmp.createcompatiblebitmap(pdc,1024,768); //建立與pdc相容的點陣圖
wdc.selectobject(&bmp);
……ireadlen = recv(sock,buffer,60000,0); //從網路接收資料
for(i=0;istretchblt(0,0,rect.width(),rect.height(),&wdc,0,0,1024,768,srccopy);
pointer=0; //接收完一屏後指標復位,準備接收下一屏}}
服務程式的自動載入及擴充套件
從功能上看,服務端程式只負責為遠端客戶提供服務,在全部執行期間根本不需要人為的外來干預,因此可以隱藏其介面並將其作成後台服務程式:
bool cmainframe::precreatewindow(createstruct& cs)
另外,由於現在計算機多具有通過modem實現遠端喚醒的功能,因此如能使服務程式具備自啟動功能將實現遠端現場主機的無人值守。自啟動有多種方式:在 autoexec.bat、win.ini等檔案中加入啟動命令、在"啟動"選單裡加入指向程式的快捷方式、修改登錄檔等。其中由於登錄檔通常被人為改動的機會要小的多,因此通過修改登錄檔實現自啟動是一種比較安全的方法。本文採取的方法是:先通過api函式copyfile()將服務程式複製到系統目錄,然後對hkey_local_machine 的software/microsoft/windows/currentversion/run寫入乙個字串鍵值,該鍵值的內容是服務程式在系統目錄下的全路徑:
dword type=reg_sz;
dword size=max_path;
lpctstr rgspath="software/microsoft/windows/currentversion/run" ;
……getsystemdirectory(syspath,size); //獲取系統目錄
getmodulefilename(null,currentpath,size); //獲取程式路徑
filecurrentname = currentpath;
filenewname = lstrcat(syspath,"/surveillant.exe");
ret = copyfile(filecurrentname,filenewname,true); //拷貝程式到系統目錄
……//開啟登錄檔
ret=regopenkeyex(hkey_local_machine,rgspath,0,key_write, &hkey);
……//寫入登錄檔
ret=regsetvalueex(hkey,"surveillant",null,type, filenewname,size);
……//關閉登錄檔
regclosekey(hkey);
至於監控中心對現場主機的遠端控制,則主要是通過向對方程式傳送用以標識訊息的資料並在遠端主機接收完畢後用sendmessage()向指定視窗傳送訊息來完成的,可用createprocess();來啟動現場主機的程式以響應訊息。由於該部分技術亦可用來編寫黑客軟體,故本文在此不便作進一步的描述。
小結:
VC 實現對遠端計算機螢幕的監視
vc 實現對遠端計算機螢幕的監視 其中af inet 和sock stream指定了建立的是採用了tcp ip位址族的流式套接字。該套接字實際上是提供了乙個通訊埠,通過這個埠可與任何乙個具有套接字埠的計算機實施通訊。一旦獲取了新的套接字,應立即通過bind 將該套接字與本機上的乙個埠建立關聯。需要預...
VC 實現對遠端計算機螢幕的監視
摘要 本文介紹了一種通過套接字網路程式設計和螢幕捕獲技術實現的對遠端計算機螢幕進行監視的方法。函式建立之 sock socket af inet,sock stream,0 其中af inet 和sock stream指定了建立的是採用了tcp ip位址族的流式套接字。該套接字實際上是提供了乙個通訊...
通過Socket套接字實現對計算機的遠端監控
一 引言 二 socket網路程式的一般思路 windows sockets 規範定義了乙個基於 microsoft windows 的網路程式設計介面,它源於加里弗尼亞大學伯克利分校的伯克利軟體發布 bsd 它既包括熟悉的伯克利 socket 風格的例程,也包括了一組 windows 特有的擴充套...