唐 磊,宋宇波,藍智靈
(東南大學信息科學與工程學院,南京 210096)
近年來,隨著計算機技術的不斷發展,通過網絡遠程交互以運行各種應用或服務程序,人們可以更方便安全地實現遠程辦公等工作[1],具有巨大的市場前景。在現有計算機操作系統中,Microsoft公司的Windows系統因其卓越的易用性和絢麗的視覺效果成為計算機系統中大眾用戶的首選。Windows系統主要提供了2種與系統交互的方式:可視化操作和命令行操作。
基于可視化操作,Windows系統提供了如遠程桌面連接等途徑[2],遠程桌面連接基于遠程桌面協議(Remote Desktop Protocol, RDP)[3]。為了保障通信數據的安全,可以采用SSL-VPN進行加密處理[4-5]。
而在命令行操作方面,現有的實現命令行操作的常規方法主要是將控制臺程序窗口的標準輸入輸出重定向到其父進程的發送/接收管道上[6],或者是重定向到用于遠程通信的基于TCP/IP協議的套接字上[7]。由于一些系統安防軟件會對系統中程序標準輸入輸出的重定向進行審核,因此該方法與這些安防軟件的兼容性較差,會使其產生誤報或者誤刪等錯誤操作,從而影響整個系統的穩定性。于此同時,由于系統自帶的常用控制臺程序只能用于本機操作,沒有添加遠程通信的模塊,為了將控制臺程序用于遠程交互,需要修改程序源代碼,在程序中添加與遠程通信的接口。該方法無法適用于已經成型的控制臺程序,即對于控制臺程序的向下兼容性較差。
針對以上問題,本文提出一種控制臺遠程交互模型,并設計一種控制臺程序加載器。
控制臺程序是Windows為了兼容DOS程序而設立的沒有獨立窗口的程序,一般在命令行下(cmd.exe)運行。控制臺程序的輸入輸出是通過標準I/O進行的,不像界面程序可以通過鼠標點擊進行操作。一般后臺運行的程序可作為控制臺程序。
控制臺I/O緩沖區包括輸入緩沖區和輸出緩沖區(屏幕緩沖區)。輸入緩沖區能夠存儲輸入記錄序列,該序列中包含了各種輸入事件的信息,如鍵盤事件和鼠標事件等;輸出緩沖區是控制臺窗口的一個二維的字符數組和彩色數據,即屏幕中的文本和背景顏色屬性等信息。
所謂遠程交互,是指用戶在異地通過網絡與本地計算機通信[8]。隨著網絡的高速發展,電腦遠程交互技術越來越引起人們的關注。目前遠程交互的主要應用包括遠程辦公、遠程教育、遠程維護和遠程協助等。
為了更好地實現對系統安防軟件的兼容性,以及實現對控制臺程序良好的兼容性,本文提出一種新型的基于I/O緩沖區讀寫的控制臺程序遠程交互模型。該模型克服現有解決方案中容易與系統軟件沖突導致系統不穩定的不足,并且為了增強對控制臺程序的兼容性,提出了一種全新的架構。在保證控制臺程序完整性的前提下,為控制臺程序提供了一個加載器,如圖1所示。

圖1 遠程交互模型拓撲圖
該加載器作為控制臺程序的父進程,采用模擬鍵盤輸入到窗口輸入緩沖區的方式作為控制臺窗口的輸入,并通過獲取控制臺窗口的輸出緩沖區數據得到輸出。由加載該控制臺程序的父進程與其進行交互,父進程通過 Windows套接字(Winsock)與遠程用戶進行命令和數據的傳輸,從而實現對控制臺程序的遠程交互。
該模型的遠程交互包括以下組件:遠程主機接入端和本地控制臺程序加載器;遠程主機接入端與本地控制臺程序加載器通過互聯網或局域網(有線或者無線)相互通信。
遠程主機接入端具體包括人機交互模塊和遠程通信模塊;2個功能模塊在遠程主機系統中運行。當人機交互模塊接收到用戶的命令時,將命令轉發給遠程通信模塊,遠程通信模塊將命令通過網絡發送給本地控制臺程序加載器;當遠程通信模塊收到本地控制臺程序加載器發送的回顯數據時,將數據轉發給人機交互模塊,人機交互模塊再將數據顯示給用戶。
本地控制臺程序加載器具體包括本地通信模塊和控制臺交互模塊;2個功能模塊在本地主機系統中運行。當本地通信模塊收到命令后,將命令轉發給控制臺交互模塊,控制臺交互模塊將命令作為控制臺程序命令行窗口的輸入傳遞給控制臺程序;當控制臺交互模塊獲取到控制臺程序命令行窗口的回顯數據時,將數據轉發給本地通信模塊,本地通信模塊再將回顯數據通過網絡發送給遠程主機接入端。圖2為該模型結構及模塊間連接關系示意圖。

圖2 遠程交互模型結構及模塊間連接關系示意圖
如圖2所示,該模型遠程交互流程如下:
(1)本地控制臺程序加載器初始化,等待遠程主機接入端的連接。
(2)遠程主機接入端初始化,與本地控制臺程序加載器建立連接,做好通信準備。
(3)用戶對遠程主機接入端進行配置,輸入控制命令。
(4)遠程主機接入端接收到用戶命令,將命令通過網絡發送給本地控制臺程序加載器。
(5)本地控制臺程序加載器接收到命令數據,將命令通過模擬鍵盤輸入的方式作為控制臺程序命令行窗口的輸入數據傳遞給控制臺程序。
(6)當控制臺程序處理完命令輸出回顯數據時,本地控制臺程序加載器從控制臺程序命令行窗口的輸出緩沖區獲取到回顯數據,并將數據通過網絡發送給遠程主機接入端。
遠程主機接入端接收到回顯數據,通過人機交互模塊顯示給用戶。
圖3為加載器中控制臺交互模塊流程。

圖3 加載器交互模塊流程
如圖3所示,在與控制臺程序的命令行窗口交互前,加載器的控制臺交互模塊先進行初始化,創建用于處理控制臺程序命令行窗口輸入輸出的2個線程。成功創建線程后,創建控制臺程序子進程。創建成功后,將本地控制臺程序加載器(父進程)的命令行窗口附著到控制臺程序的命令行窗口上。加載器接收到命令后,輸入線程通過模擬鍵盤輸入到窗口輸入緩沖區的方式將命令輸入到控制臺程序的命令行窗口,控制臺程序處理完命令后,加載器的輸出線程從命令行窗口輸出緩沖區中獲取到回顯數據,再將數據發送給遠程主機接入端。當加載器的輸入線程收到的是終止命令時,本地控制臺程序加載器終止輸入輸出雙線程,然后結束控制臺程序子進程和自身進程。
結合圖2對該模型中的關鍵技術進行詳細實例說明。網絡環境:互聯網/局域網;硬件設備:2臺 PC機;運行平臺:Windows XP;控制臺程序:cmd.exe。
如圖2所示,模型中的遠程主機接入端運行在一臺遠程PC機上,它的作用是通過人機交互模塊接收用戶輸入的命令,使用遠程通信模塊,將命令經由網絡發送給本地控制臺程序加載器。本地控制臺程序加載器通過本地通信模塊接收遠程主機接入端發送的命令,將命令由控制臺交互模塊作為命令行窗口的輸入傳給控制臺程序;控制臺程序處理完相應命令后,向命令行窗口輸出回顯數據,本地控制臺程序加載器的控制臺交互模塊從控制臺程序的命令行窗口輸出緩沖區中獲取回顯數據,再將回顯數據通過本地通信模塊由網絡發送給遠程主機接入端。遠程主機接入端通過遠程通信模塊接收回顯數據,再將回顯數據通過人機交互模塊顯示給用戶。
下面介紹在 Windows環境下加載器控制臺交互模塊的具體實施方法。Microsoft的 Windows系統提供一整套API函數庫方便編程人員進行二次開發。如圖3所示,具體步驟如下:
(1)加載器控制臺交互模塊先進行初始化,并調用函數創建用于傳遞命令行窗口輸入輸出數據的I/O雙線程。
(2)調用函數,創建控制臺程序進程(cmd子進程)。
(3)調用函數,將本地控制臺程序加載器的命令行窗口附著在cmd子進程的命令行窗口上。這樣做的結果是本地控制臺程序加載器的命令行窗口的輸入會成為cmd子進程窗口的輸入,cmd子進程窗口的輸出會成為本地控制臺程序加載器的命令行窗口的輸出。因此,只需要操作本地控制臺程序加載器的命令行窗口,就可以實現與cmd子進程命令行窗口的交互。
(4)當加載器控制臺交互模塊收到遠程發送來的用戶命令時,如果是退出命令,則控制臺交互模塊終止I/O雙線程,然后退出自身程序。
(5)如果不是退出命令,輸入線程調用函數,打開“CONIN$”,即 cmd子進程命令行窗口的輸入緩沖區,結構INPUT_RECORD描述了命令行窗口輸入緩沖區的一個輸入事件[9],鍵盤的一次按鍵的事件可以存儲的一個INPUT_RECORD結構中,因此,將輸入命令的字符存儲在INPUT_RECORD結構數組中,調用函數將命令輸入到命令行窗口中,即模擬鍵盤輸入的技術。
(6)當 cmd子進程命令行窗口產生回顯數據時,輸出線程調用函數,打開“CONOUT$”,即 cmd子進程命令行窗口的輸出緩沖區,調用函數,獲取cmd子進程命令行窗口的大小(寬高)[10],根據大小確定一次從輸出緩沖區中讀取的字符數,再調用函數,從輸出緩沖區中讀取相應的字符。
為了測試該模型對系統安防軟件的兼容性,針對目前主流的安防軟件分別搭建了相應的測試平臺,包括 360殺毒/安全衛士、卡巴斯基 2011Kav、NOD32和諾頓2011。測試結果如表1所示。

表1 系統安防軟件兼容性測試結果
從表1可以看出,基于控制臺程序窗口標準輸入輸出重定向的方式會使安防軟件產生誤報或者誤刪等錯誤操作,兼容性較差,影響系統的穩定性;基于控制臺程序窗口I/O緩沖區讀寫的方式能夠有效避免安防軟件的誤報和誤刪,提高了系統的穩定性,保證了與系統安防軟件的兼容性。
為了測試該模型對控制臺程序的兼容性,針對目前常用的控制臺程序搭建了相應的測試平臺,包括cmd.exe、ipconfig.exe、telnet.exe、ftp.exe、nslookup.exe、NetCapture.exe和 ping.exe。測試結果如表 2所示。

表2 控制臺程序兼容性測試結果
從表2可以看出,由于常用的系統提供的控制臺程序中沒有提供用于對外通信的模塊,因此無法與其他程序通信。而NetCapture.exe是第三方的控制臺程序,自身帶有通信模塊,所以能夠兼容。基于控制臺程序窗口標準輸入輸出重定向的方式在不修改控制臺程序的前提下,無法用于常用的系統控制臺程序;基于控制臺程序窗口I/O緩沖區讀寫的方式能夠將控制臺程序作為單獨模塊,保證其完整性,因此,可以很好地用于常用的各種控制臺程序,保證該模型對控制臺程序的兼容性。
由于現有方案中需要對控制臺程序的標準輸入輸出進行重定向,容易與系統軟件發生沖突,并導致系統不穩定;同時為了支持遠程交互,需要對控制臺程序進行修改,添加遠程通信模塊,因此對控制臺程序的兼容性較差。
本文提出了一種基于I/O緩沖區讀寫的控制臺遠程交互模型,將控制臺程序作為獨立模塊,并設計了用于擴展其功能的加載器,無需對控制臺程序進行修改。該加載器采用模擬鍵盤輸入到控制臺窗口輸入緩沖區的方式實現控制臺程序命令行窗口的輸入,從控制臺窗口的輸出緩沖區中獲取回顯數據,并通過網絡使本地控制臺程序與遠程主機接入端進行遠程數據通信,從而實現非重定向條件下與控制臺程序的交互,增強了對不同類型控制臺程序的兼容性。
[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 開發詳解——函數、接口、編程實例[M].北京: 人民郵電出版社,2011.