唐 磊,宋宇波,藍(lán)智靈
(東南大學(xué)信息科學(xué)與工程學(xué)院,南京 210096)
近年來,隨著計算機(jī)技術(shù)的不斷發(fā)展,通過網(wǎng)絡(luò)遠(yuǎn)程交互以運行各種應(yīng)用或服務(wù)程序,人們可以更方便安全地實現(xiàn)遠(yuǎn)程辦公等工作[1],具有巨大的市場前景。在現(xiàn)有計算機(jī)操作系統(tǒng)中,Microsoft公司的Windows系統(tǒng)因其卓越的易用性和絢麗的視覺效果成為計算機(jī)系統(tǒng)中大眾用戶的首選。Windows系統(tǒng)主要提供了2種與系統(tǒng)交互的方式:可視化操作和命令行操作。
基于可視化操作,Windows系統(tǒng)提供了如遠(yuǎn)程桌面連接等途徑[2],遠(yuǎn)程桌面連接基于遠(yuǎn)程桌面協(xié)議(Remote Desktop Protocol, RDP)[3]。為了保障通信數(shù)據(jù)的安全,可以采用SSL-VPN進(jìn)行加密處理[4-5]。
而在命令行操作方面,現(xiàn)有的實現(xiàn)命令行操作的常規(guī)方法主要是將控制臺程序窗口的標(biāo)準(zhǔn)輸入輸出重定向到其父進(jìn)程的發(fā)送/接收管道上[6],或者是重定向到用于遠(yuǎn)程通信的基于TCP/IP協(xié)議的套接字上[7]。由于一些系統(tǒng)安防軟件會對系統(tǒng)中程序標(biāo)準(zhǔn)輸入輸出的重定向進(jìn)行審核,因此該方法與這些安防軟件的兼容性較差,會使其產(chǎn)生誤報或者誤刪等錯誤操作,從而影響整個系統(tǒng)的穩(wěn)定性。于此同時,由于系統(tǒng)自帶的常用控制臺程序只能用于本機(jī)操作,沒有添加遠(yuǎn)程通信的模塊,為了將控制臺程序用于遠(yuǎn)程交互,需要修改程序源代碼,在程序中添加與遠(yuǎn)程通信的接口。該方法無法適用于已經(jīng)成型的控制臺程序,即對于控制臺程序的向下兼容性較差。
針對以上問題,本文提出一種控制臺遠(yuǎn)程交互模型,并設(shè)計一種控制臺程序加載器。
控制臺程序是Windows為了兼容DOS程序而設(shè)立的沒有獨立窗口的程序,一般在命令行下(cmd.exe)運行??刂婆_程序的輸入輸出是通過標(biāo)準(zhǔn)I/O進(jìn)行的,不像界面程序可以通過鼠標(biāo)點擊進(jìn)行操作。一般后臺運行的程序可作為控制臺程序。
控制臺I/O緩沖區(qū)包括輸入緩沖區(qū)和輸出緩沖區(qū)(屏幕緩沖區(qū))。輸入緩沖區(qū)能夠存儲輸入記錄序列,該序列中包含了各種輸入事件的信息,如鍵盤事件和鼠標(biāo)事件等;輸出緩沖區(qū)是控制臺窗口的一個二維的字符數(shù)組和彩色數(shù)據(jù),即屏幕中的文本和背景顏色屬性等信息。
所謂遠(yuǎn)程交互,是指用戶在異地通過網(wǎng)絡(luò)與本地計算機(jī)通信[8]。隨著網(wǎng)絡(luò)的高速發(fā)展,電腦遠(yuǎn)程交互技術(shù)越來越引起人們的關(guān)注。目前遠(yuǎn)程交互的主要應(yīng)用包括遠(yuǎn)程辦公、遠(yuǎn)程教育、遠(yuǎn)程維護(hù)和遠(yuǎn)程協(xié)助等。
為了更好地實現(xiàn)對系統(tǒng)安防軟件的兼容性,以及實現(xiàn)對控制臺程序良好的兼容性,本文提出一種新型的基于I/O緩沖區(qū)讀寫的控制臺程序遠(yuǎn)程交互模型。該模型克服現(xiàn)有解決方案中容易與系統(tǒng)軟件沖突導(dǎo)致系統(tǒng)不穩(wěn)定的不足,并且為了增強(qiáng)對控制臺程序的兼容性,提出了一種全新的架構(gòu)。在保證控制臺程序完整性的前提下,為控制臺程序提供了一個加載器,如圖1所示。
圖1 遠(yuǎn)程交互模型拓?fù)鋱D
該加載器作為控制臺程序的父進(jìn)程,采用模擬鍵盤輸入到窗口輸入緩沖區(qū)的方式作為控制臺窗口的輸入,并通過獲取控制臺窗口的輸出緩沖區(qū)數(shù)據(jù)得到輸出。由加載該控制臺程序的父進(jìn)程與其進(jìn)行交互,父進(jìn)程通過 Windows套接字(Winsock)與遠(yuǎn)程用戶進(jìn)行命令和數(shù)據(jù)的傳輸,從而實現(xiàn)對控制臺程序的遠(yuǎn)程交互。
該模型的遠(yuǎn)程交互包括以下組件:遠(yuǎn)程主機(jī)接入端和本地控制臺程序加載器;遠(yuǎn)程主機(jī)接入端與本地控制臺程序加載器通過互聯(lián)網(wǎng)或局域網(wǎng)(有線或者無線)相互通信。
遠(yuǎn)程主機(jī)接入端具體包括人機(jī)交互模塊和遠(yuǎn)程通信模塊;2個功能模塊在遠(yuǎn)程主機(jī)系統(tǒng)中運行。當(dāng)人機(jī)交互模塊接收到用戶的命令時,將命令轉(zhuǎn)發(fā)給遠(yuǎn)程通信模塊,遠(yuǎn)程通信模塊將命令通過網(wǎng)絡(luò)發(fā)送給本地控制臺程序加載器;當(dāng)遠(yuǎn)程通信模塊收到本地控制臺程序加載器發(fā)送的回顯數(shù)據(jù)時,將數(shù)據(jù)轉(zhuǎn)發(fā)給人機(jī)交互模塊,人機(jī)交互模塊再將數(shù)據(jù)顯示給用戶。
本地控制臺程序加載器具體包括本地通信模塊和控制臺交互模塊;2個功能模塊在本地主機(jī)系統(tǒng)中運行。當(dāng)本地通信模塊收到命令后,將命令轉(zhuǎn)發(fā)給控制臺交互模塊,控制臺交互模塊將命令作為控制臺程序命令行窗口的輸入傳遞給控制臺程序;當(dāng)控制臺交互模塊獲取到控制臺程序命令行窗口的回顯數(shù)據(jù)時,將數(shù)據(jù)轉(zhuǎn)發(fā)給本地通信模塊,本地通信模塊再將回顯數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送給遠(yuǎn)程主機(jī)接入端。圖2為該模型結(jié)構(gòu)及模塊間連接關(guān)系示意圖。
圖2 遠(yuǎn)程交互模型結(jié)構(gòu)及模塊間連接關(guān)系示意圖
如圖2所示,該模型遠(yuǎn)程交互流程如下:
(1)本地控制臺程序加載器初始化,等待遠(yuǎn)程主機(jī)接入端的連接。
(2)遠(yuǎn)程主機(jī)接入端初始化,與本地控制臺程序加載器建立連接,做好通信準(zhǔn)備。
(3)用戶對遠(yuǎn)程主機(jī)接入端進(jìn)行配置,輸入控制命令。
(4)遠(yuǎn)程主機(jī)接入端接收到用戶命令,將命令通過網(wǎng)絡(luò)發(fā)送給本地控制臺程序加載器。
(5)本地控制臺程序加載器接收到命令數(shù)據(jù),將命令通過模擬鍵盤輸入的方式作為控制臺程序命令行窗口的輸入數(shù)據(jù)傳遞給控制臺程序。
(6)當(dāng)控制臺程序處理完命令輸出回顯數(shù)據(jù)時,本地控制臺程序加載器從控制臺程序命令行窗口的輸出緩沖區(qū)獲取到回顯數(shù)據(jù),并將數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送給遠(yuǎn)程主機(jī)接入端。
遠(yuǎn)程主機(jī)接入端接收到回顯數(shù)據(jù),通過人機(jī)交互模塊顯示給用戶。
圖3為加載器中控制臺交互模塊流程。
圖3 加載器交互模塊流程
如圖3所示,在與控制臺程序的命令行窗口交互前,加載器的控制臺交互模塊先進(jìn)行初始化,創(chuàng)建用于處理控制臺程序命令行窗口輸入輸出的2個線程。成功創(chuàng)建線程后,創(chuàng)建控制臺程序子進(jìn)程。創(chuàng)建成功后,將本地控制臺程序加載器(父進(jìn)程)的命令行窗口附著到控制臺程序的命令行窗口上。加載器接收到命令后,輸入線程通過模擬鍵盤輸入到窗口輸入緩沖區(qū)的方式將命令輸入到控制臺程序的命令行窗口,控制臺程序處理完命令后,加載器的輸出線程從命令行窗口輸出緩沖區(qū)中獲取到回顯數(shù)據(jù),再將數(shù)據(jù)發(fā)送給遠(yuǎn)程主機(jī)接入端。當(dāng)加載器的輸入線程收到的是終止命令時,本地控制臺程序加載器終止輸入輸出雙線程,然后結(jié)束控制臺程序子進(jìn)程和自身進(jìn)程。
結(jié)合圖2對該模型中的關(guān)鍵技術(shù)進(jìn)行詳細(xì)實例說明。網(wǎng)絡(luò)環(huán)境:互聯(lián)網(wǎng)/局域網(wǎng);硬件設(shè)備:2臺 PC機(jī);運行平臺:Windows XP;控制臺程序:cmd.exe。
如圖2所示,模型中的遠(yuǎn)程主機(jī)接入端運行在一臺遠(yuǎn)程PC機(jī)上,它的作用是通過人機(jī)交互模塊接收用戶輸入的命令,使用遠(yuǎn)程通信模塊,將命令經(jīng)由網(wǎng)絡(luò)發(fā)送給本地控制臺程序加載器。本地控制臺程序加載器通過本地通信模塊接收遠(yuǎn)程主機(jī)接入端發(fā)送的命令,將命令由控制臺交互模塊作為命令行窗口的輸入傳給控制臺程序;控制臺程序處理完相應(yīng)命令后,向命令行窗口輸出回顯數(shù)據(jù),本地控制臺程序加載器的控制臺交互模塊從控制臺程序的命令行窗口輸出緩沖區(qū)中獲取回顯數(shù)據(jù),再將回顯數(shù)據(jù)通過本地通信模塊由網(wǎng)絡(luò)發(fā)送給遠(yuǎn)程主機(jī)接入端。遠(yuǎn)程主機(jī)接入端通過遠(yuǎn)程通信模塊接收回顯數(shù)據(jù),再將回顯數(shù)據(jù)通過人機(jī)交互模塊顯示給用戶。
下面介紹在 Windows環(huán)境下加載器控制臺交互模塊的具體實施方法。Microsoft的 Windows系統(tǒng)提供一整套API函數(shù)庫方便編程人員進(jìn)行二次開發(fā)。如圖3所示,具體步驟如下:
(1)加載器控制臺交互模塊先進(jìn)行初始化,并調(diào)用函數(shù)創(chuàng)建用于傳遞命令行窗口輸入輸出數(shù)據(jù)的I/O雙線程。
(2)調(diào)用函數(shù),創(chuàng)建控制臺程序進(jìn)程(cmd子進(jìn)程)。
(3)調(diào)用函數(shù),將本地控制臺程序加載器的命令行窗口附著在cmd子進(jìn)程的命令行窗口上。這樣做的結(jié)果是本地控制臺程序加載器的命令行窗口的輸入會成為cmd子進(jìn)程窗口的輸入,cmd子進(jìn)程窗口的輸出會成為本地控制臺程序加載器的命令行窗口的輸出。因此,只需要操作本地控制臺程序加載器的命令行窗口,就可以實現(xiàn)與cmd子進(jìn)程命令行窗口的交互。
(4)當(dāng)加載器控制臺交互模塊收到遠(yuǎn)程發(fā)送來的用戶命令時,如果是退出命令,則控制臺交互模塊終止I/O雙線程,然后退出自身程序。
(5)如果不是退出命令,輸入線程調(diào)用函數(shù),打開“CONIN$”,即 cmd子進(jìn)程命令行窗口的輸入緩沖區(qū),結(jié)構(gòu)INPUT_RECORD描述了命令行窗口輸入緩沖區(qū)的一個輸入事件[9],鍵盤的一次按鍵的事件可以存儲的一個INPUT_RECORD結(jié)構(gòu)中,因此,將輸入命令的字符存儲在INPUT_RECORD結(jié)構(gòu)數(shù)組中,調(diào)用函數(shù)將命令輸入到命令行窗口中,即模擬鍵盤輸入的技術(shù)。
(6)當(dāng) cmd子進(jìn)程命令行窗口產(chǎn)生回顯數(shù)據(jù)時,輸出線程調(diào)用函數(shù),打開“CONOUT$”,即 cmd子進(jìn)程命令行窗口的輸出緩沖區(qū),調(diào)用函數(shù),獲取cmd子進(jìn)程命令行窗口的大小(寬高)[10],根據(jù)大小確定一次從輸出緩沖區(qū)中讀取的字符數(shù),再調(diào)用函數(shù),從輸出緩沖區(qū)中讀取相應(yīng)的字符。
為了測試該模型對系統(tǒng)安防軟件的兼容性,針對目前主流的安防軟件分別搭建了相應(yīng)的測試平臺,包括 360殺毒/安全衛(wèi)士、卡巴斯基 2011Kav、NOD32和諾頓2011。測試結(jié)果如表1所示。
表1 系統(tǒng)安防軟件兼容性測試結(jié)果
從表1可以看出,基于控制臺程序窗口標(biāo)準(zhǔn)輸入輸出重定向的方式會使安防軟件產(chǎn)生誤報或者誤刪等錯誤操作,兼容性較差,影響系統(tǒng)的穩(wěn)定性;基于控制臺程序窗口I/O緩沖區(qū)讀寫的方式能夠有效避免安防軟件的誤報和誤刪,提高了系統(tǒng)的穩(wěn)定性,保證了與系統(tǒng)安防軟件的兼容性。
為了測試該模型對控制臺程序的兼容性,針對目前常用的控制臺程序搭建了相應(yīng)的測試平臺,包括cmd.exe、ipconfig.exe、telnet.exe、ftp.exe、nslookup.exe、NetCapture.exe和 ping.exe。測試結(jié)果如表 2所示。
表2 控制臺程序兼容性測試結(jié)果
從表2可以看出,由于常用的系統(tǒng)提供的控制臺程序中沒有提供用于對外通信的模塊,因此無法與其他程序通信。而NetCapture.exe是第三方的控制臺程序,自身帶有通信模塊,所以能夠兼容?;诳刂婆_程序窗口標(biāo)準(zhǔn)輸入輸出重定向的方式在不修改控制臺程序的前提下,無法用于常用的系統(tǒng)控制臺程序;基于控制臺程序窗口I/O緩沖區(qū)讀寫的方式能夠?qū)⒖刂婆_程序作為單獨模塊,保證其完整性,因此,可以很好地用于常用的各種控制臺程序,保證該模型對控制臺程序的兼容性。
由于現(xiàn)有方案中需要對控制臺程序的標(biāo)準(zhǔn)輸入輸出進(jìn)行重定向,容易與系統(tǒng)軟件發(fā)生沖突,并導(dǎo)致系統(tǒng)不穩(wěn)定;同時為了支持遠(yuǎn)程交互,需要對控制臺程序進(jìn)行修改,添加遠(yuǎn)程通信模塊,因此對控制臺程序的兼容性較差。
本文提出了一種基于I/O緩沖區(qū)讀寫的控制臺遠(yuǎn)程交互模型,將控制臺程序作為獨立模塊,并設(shè)計了用于擴(kuò)展其功能的加載器,無需對控制臺程序進(jìn)行修改。該加載器采用模擬鍵盤輸入到控制臺窗口輸入緩沖區(qū)的方式實現(xiàn)控制臺程序命令行窗口的輸入,從控制臺窗口的輸出緩沖區(qū)中獲取回顯數(shù)據(jù),并通過網(wǎng)絡(luò)使本地控制臺程序與遠(yuǎn)程主機(jī)接入端進(jìn)行遠(yuǎn)程數(shù)據(jù)通信,從而實現(xiàn)非重定向條件下與控制臺程序的交互,增強(qiáng)了對不同類型控制臺程序的兼容性。
[1]Kara A.Secure Remote Access from Office to Home[J].IEEE Communications Magazine, 2001, 39(10): 68-72.
[2]Richardson T.Virtual Network Computing[J].IEEE Internet Computing, 1998, 2(1): 33-38.
[3]Microsoft White Paper.Remote Desktop Protocol(RDP)Features and Performance[EB/OL].(2007-01-20).http://www.microsoft.com/technet/prodtechnol/Win2KTS/evaluate/featfunc/rdpfperf.mspx.
[4]Stallings W.Network Security Essentials: Applications and Standards[M].[S.l.]: Prentice-Hall, Inc., 2000.
[5]Cai Longzheng, Yu Shengsheng, Zhou Jingli.Research and Implementation of Remote Desktop Protocol Service over SSL VPN[C]//Proc.of IEEE International Conference on Service Computing.[S.l.]: IEEE Computer Society, 2004:502-505.
[6]Kernighan B W.The Unix System and Software Reusability[J]. IEEE Transactions on Software Engineering, 1984, 10(5): 513-518.
[7]Gao Xiaoan, Wang Lina.Networked Control and Monitoring System Based on Industrial Ethernet[C]//Proc.of the 6th IEEE Conference on Industrial Electronics and Applications.[S.l.]: IEEE Press, 2011: 1337-1341.
[8]Bellucci A, Malizia A, Diaz P, et al.Human-display Interaction Technology: Emerging Remote Interfaces for Pervasive Display Environments[J].IEEE Pervasive Computing, 2010, 9(2): 72-76.
[9]Richter J, Nasarre C.Windows via C/C++[M].Redmond,USA: Microsoft Press, 2008.
[10]范文慶, 周彬彬, 安 靖.Windows API 開發(fā)詳解——函數(shù)、接口、編程實例[M].北京: 人民郵電出版社,2011.