◆武振華 張 超 顏學(xué)雄 馬子騰 龔 婕
大規(guī)模軟件自動(dòng)化安裝方法研究
◆武振華1,2張 超2顏學(xué)雄1馬子騰1龔 婕3
(1.戰(zhàn)略支援部隊(duì)信息工程大學(xué) 河南 450002;2.清華大學(xué)網(wǎng)絡(luò)科學(xué)與網(wǎng)絡(luò)空間研究院 北京 100083) (3.31006部隊(duì) 北京 100840)
軟件安裝就是將開發(fā)者封裝好的程序部署到用戶系統(tǒng)環(huán)境的過程。本文采用增量式分析策略,對(duì)需要安裝的安裝包,使用簡單易行的靜默安裝方式完成部分軟件的安裝;之后對(duì)無法使用靜默安裝的軟件,采用基于規(guī)則的控件識(shí)別和OCR識(shí)別方式進(jìn)行安裝。最后對(duì)安裝后的結(jié)果進(jìn)行分析,不斷調(diào)整追加安裝規(guī)則,爭取對(duì)獲取的大規(guī)模軟件安裝包實(shí)現(xiàn)最高的安裝覆蓋率。
大規(guī)模;軟件;自動(dòng)化安裝
軟件安裝就是將開發(fā)者封裝好的程序部署到用戶系統(tǒng)環(huán)境的過程。軟件安裝包的安裝過程,本質(zhì)上來說是對(duì)軟件安裝包的動(dòng)態(tài)分析過程,在動(dòng)態(tài)執(zhí)行過程中與安裝包的圖形用戶界面(GUI)進(jìn)行自動(dòng)化交互,逐步完成安裝過程并監(jiān)控安裝過程中的行為信息。高效穩(wěn)定的軟件的自動(dòng)化安裝方法,不僅為計(jì)算機(jī)管理維護(hù)人員帶來極大的便利,而且解決了軟件安裝時(shí)在無人值守的情況下無法點(diǎn)擊“下一步”的煩瑣操作。
本文采用增量式分析策略,對(duì)需要運(yùn)行的安裝包,使用簡單易行的靜默安裝方式完成部分軟件的安裝;之后對(duì)無法使用靜默安裝的軟件,采用基于規(guī)則的控件識(shí)別和OCR識(shí)別方式進(jìn)行安裝。最后對(duì)安裝后的結(jié)果進(jìn)行分析,不斷調(diào)整追加安裝規(guī)則,爭取對(duì)獲取的大規(guī)模軟件安裝包實(shí)現(xiàn)最高的安裝覆蓋率。
目前有關(guān)軟件自動(dòng)安裝的研究有以下幾種方案:第一種是直接對(duì)安裝后的系統(tǒng)文件和軟件目錄做鏡像,然后使用克隆軟件將鏡像復(fù)制到其他的系統(tǒng)或者機(jī)器中。代表性工作包括文獻(xiàn)[1]和文獻(xiàn)[2]。該方案要求硬件設(shè)備和系統(tǒng)環(huán)境具有較高的相似性,否則復(fù)制后的軟件無法正常運(yùn)行,僅適用于大型企業(yè)或者學(xué)校機(jī)房中統(tǒng)一采購機(jī)器的軟件部署。
第二種是利用第三方軟件錄制軟件安裝時(shí)的操作過程并創(chuàng)建記錄文件,當(dāng)需要重新安裝或在其他機(jī)器上安裝同樣的軟件時(shí),只需運(yùn)行記錄文件即可實(shí)現(xiàn)自動(dòng)安裝。代表工作包括文獻(xiàn)[3]、文獻(xiàn)[4]和文獻(xiàn)[5]。該方案本質(zhì)上屬于重新安裝的方法,降低了軟硬件環(huán)境的依賴性,對(duì)于企業(yè)版或大客戶版的安裝軟件能顯著提高軟件部署便利性,但無法實(shí)現(xiàn)大批量軟件的一次性安裝需求,且對(duì)于需要單機(jī)注冊(cè)的軟件來說,依然需要在每臺(tái)客戶機(jī)上修改注冊(cè)信息、注冊(cè)表和環(huán)境變量。
第三種是利用軟件包的安裝程序的靜默安裝參數(shù)來實(shí)現(xiàn)自動(dòng)安裝,軟件的靜默安裝是指軟件安裝過程無須任何用戶干預(yù),直接使用封包工具中給定的參數(shù),將軟件安裝包中打包的文件按照默認(rèn)的設(shè)計(jì)釋放到系統(tǒng)環(huán)境中。這些傳遞給封包工具并使用靜默安裝的參數(shù)稱為靜默安裝參數(shù)。多數(shù)軟件安裝包可使用靜默安裝選項(xiàng),靜默安裝參數(shù)由封包工具提供,不同工具的靜默安裝參數(shù)不同。代表性工作包括文獻(xiàn)[6]、文獻(xiàn)[7]、文獻(xiàn)[8]。該方案適用于多樣化的安裝環(huán)境,然而一些軟件開發(fā)商為滿足用戶多樣化的需求,往往采用自定義的軟件打包工具,不提供靜默安裝參數(shù),無法實(shí)現(xiàn)無人值守的靜默安裝模式,而且需要憑專家經(jīng)驗(yàn)搜集整理安裝程序的類型,無法判斷安裝程序的類型就無法通過靜默方式實(shí)現(xiàn)自動(dòng)化安裝。
第四種是基于腳本語言的自定義安裝方式,代表性工作為文獻(xiàn)[9]。該方案的靈活性強(qiáng),無軟硬件系統(tǒng)的依賴性,對(duì)絕大多數(shù)的軟件安裝都適用,然而此種方式每個(gè)腳本只適用于安裝一款軟件,當(dāng)大批量安裝不同的軟件時(shí),腳本的開發(fā)量和軟件的種類數(shù)量形成正比,極大增加了工作量。
由于每種應(yīng)用軟件的安裝過程都是未知的,且只需要可靠地安裝一次即可,上述四種方案不僅工作量大而且效率低下,無法滿足需求。因此在針對(duì)軟件種類多、規(guī)模大的自動(dòng)化安裝需求時(shí),需要研究無人值守和不經(jīng)人工干預(yù)的大批量的軟件自動(dòng)化安裝方法。
本文采用增量式分析策略,如圖1中所示,對(duì)需要安裝的安裝包,首先使用靜默安裝方式完成部分軟件的安裝;之后對(duì)無法使用靜默安裝的軟件,采用基于規(guī)則的控件識(shí)別和OCR識(shí)別方式進(jìn)行安裝。最后對(duì)安裝后的結(jié)果進(jìn)行分析,不斷調(diào)整追加安裝規(guī)則,爭取對(duì)獲取的軟件安裝包實(shí)現(xiàn)最高的安裝覆蓋率。
圖1 軟件自動(dòng)化安裝流程圖
本文復(fù)用文獻(xiàn)[8]的靜默安裝方法,首先利用USSF工具獲取部分安裝包的參數(shù),并將同一封包工具的參數(shù)進(jìn)行匯總;對(duì)無法獲取參數(shù)的安裝包,使用查殼工具提取PE文件加殼特征即封包工具類型,并按照封包工具進(jìn)行分類。對(duì)使用同一封包工具的安裝包,查詢USSF提供的該工具的靜默安裝參數(shù),若存在,則直接嘗試靜默安裝,若不存在,則將該安裝包留給下一步基于控件識(shí)別的安裝方法繼續(xù)處理。表1統(tǒng)計(jì)了主流的封包工具及其使用的靜默安裝參數(shù)。
表1 封包工具類型及靜默安裝參數(shù)
軟件的靜默安裝可對(duì)應(yīng)用市場上大部分的軟件成功完成安裝,然而隨著軟件工程的飛速發(fā)展,軟件功能不斷增加,軟件規(guī)模日益增大,個(gè)性化的安裝需求也變得更加重要,更多的軟件為了達(dá)到更美觀的效果,使用自定義的打包工具,不提供靜默安裝參數(shù),以求在軟件的安裝過程中用戶可根據(jù)自己的需求,定制軟件安裝的功能模塊和安裝方式,此外靜默安裝模式對(duì)于復(fù)雜交互或者版本限定選擇(個(gè)人版、商用版)的軟件無法適用。對(duì)于無法靜默安裝的軟件,需要使用GUI進(jìn)行交互式安裝。由于Windows操作系統(tǒng)是基于消息機(jī)制的,因此通過在特定位置模擬鍵盤輸入和鼠標(biāo)點(diǎn)擊等行為來代替人工操作完成安裝。
如圖2所示,首先在安裝窗口中進(jìn)行控件識(shí)別獲取控件列表,然后將列表中的控件按照自定義的操作規(guī)則XML進(jìn)行篩選,獲取有效操作控件,對(duì)有效的操作控件進(jìn)行模擬操作,操作完成后,繼續(xù)循環(huán)遍歷新彈出的窗口。
圖2 基于控件識(shí)別&OCR識(shí)別的自動(dòng)化安裝流程
首先是窗口識(shí)別。在基于GUI交互式安裝的過程中,成功啟動(dòng)軟件安裝包的安裝程序后,在系統(tǒng)環(huán)境中會(huì)成功彈出交互式安裝窗口,除此以外,系統(tǒng)環(huán)境在正常的運(yùn)行中,System也會(huì)在后臺(tái)調(diào)用多個(gè)窗口,因此需要在數(shù)量龐大的后臺(tái)系統(tǒng)窗口中精確識(shí)別出軟件安裝窗口。本文采用兩種方法來進(jìn)行窗口識(shí)別,一是在啟動(dòng)軟件安裝包前,先通過API函數(shù)EnumWindows獲取所有窗口列表,在啟動(dòng)軟件安裝包后,再次獲取所有的窗口列表,并將兩個(gè)列表做差集,最后從差集中篩選出“WS_VISIBLE”樣式的具有#32770、TWizardForm、TSelectLanguageForm、ATL:DLGFrame032E、MsiDialogCloseClass等類型的對(duì)話框窗口,該窗口就是軟件安裝包啟動(dòng)的安裝窗口。由于軟件封包工具的不同,安裝窗口的類型也多種多樣,因此在實(shí)際的操作過程中,隨著安裝軟件的增多,窗口的類型也在不斷增加。
其次是控件識(shí)別。在準(zhǔn)確定位到安裝窗口后,需要對(duì)窗口中的控件進(jìn)行識(shí)別,獲取窗口中所有的控件信息列表。本文使用API函數(shù)EnumChildWindows來獲取特定窗口中所有控件句柄的列表,并根據(jù)控件句柄進(jìn)一步獲取控件的其他屬性信息,如控件標(biāo)題(“下一步”“完成”等)、控件類型(“Button”“CheckBox”等)和控件位置(相對(duì)于屏幕)等。在GUI安裝窗口中,根據(jù)窗口內(nèi)的控件是否能被API函數(shù)識(shí)別,又分為Windows標(biāo)準(zhǔn)控件和非標(biāo)準(zhǔn)控件兩類。對(duì)標(biāo)準(zhǔn)控件,可利用控件句柄直接獲取控件的屬性信息。對(duì)于非標(biāo)準(zhǔn)控件,則無法利用API函數(shù)獲取控件的屬性信息,也就無法獲取控件的位置,進(jìn)而利用模擬操作完成安裝。對(duì)于非標(biāo)準(zhǔn)控件的安裝包,交由文字識(shí)別進(jìn)行處理。
然后是XML操作規(guī)則。在獲取窗口中所有控件列表后,需要進(jìn)一步對(duì)控件進(jìn)行篩選,保留有效的操作控件。對(duì)某一特定的安裝窗口,安裝人員需要操作的對(duì)象往往只有幾種,例如“Button”控件中的“下一步”、“安裝”和“完成”等,“RadioButton”控件中的“我同意”和“接受”等,而對(duì)于“Static”控件(描述了提示信息)則全都不需要處理。因此本文定義了一個(gè)控件操作規(guī)則的XML文件,如圖3所示,XML中總結(jié)了常見的需要操作的控件類型和控件標(biāo)題,由于軟件包的開發(fā)語言不同,因此控件標(biāo)題相應(yīng)存在中英文、簡繁體的差別,在XML中搜集了所有可能出現(xiàn)的控件標(biāo)題的別名??丶僮鞯膬?yōu)先級(jí)根據(jù)前期對(duì)三千余款軟件安裝時(shí)優(yōu)化出的經(jīng)驗(yàn)值,數(shù)值越大,優(yōu)先級(jí)越高,例如在同一安裝窗口中,同時(shí)出現(xiàn)了“我同意”和“下一步”兩種控件,需要先點(diǎn)擊操作“我同意”然后再點(diǎn)擊操作“下一步”,否則安裝無法順利進(jìn)行,因此在XML中,“我同意”的優(yōu)先級(jí)比“下一步”要高。
對(duì)輸入的控件列表,首先匹配第一級(jí)的控件類型(“Button”、“RadioButton”和“CheckBox”等),若XML中沒有匹配的控件類型,則說明該類型的控件不需要操作(如“Static”“Toolbar”等),若匹配到控件類型,則繼續(xù)遍歷所有的“Names”,若不匹配則說明該控件不需要操作(如“上一步”“取消”等),若匹配則輸出該控件以及控件的優(yōu)先級(jí)。按照以上方法,將輸入的控件列表按照XML中匹配的控件進(jìn)行篩選,輸出需要操作的有效控件列表以及控件的操作順序。此外,當(dāng)預(yù)置xml內(nèi)容無法驅(qū)動(dòng)安裝進(jìn)行下一步操作時(shí),按照文本輸入框、選擇框(CheckBox)和按鈕(Button)的優(yōu)先級(jí)進(jìn)行組合探索,如果某種組合最終實(shí)現(xiàn)了自動(dòng)安裝,則反饋該組合,并更新XML操作規(guī)則。
圖3 操作規(guī)則XML文件結(jié)構(gòu)圖
之后是模擬操作。對(duì)獲取的有效操作控件列表,若列表中只有一個(gè)控件,則直接通過API函數(shù)mouse_event模擬鼠標(biāo)操作(如點(diǎn)擊“下一步”“安裝”或“完成”等)即可;若列表中的控件有多個(gè),首先根據(jù)控件優(yōu)先級(jí)進(jìn)行排序,然后按照優(yōu)先級(jí)由高到低依次模擬操作。將列表的控件遍歷操作完成后,若操作成功,直接進(jìn)入下一步;若操作失敗,則說明控件的操作順序錯(cuò)誤,此時(shí)將有效操作控件列表中的n個(gè)控件作為集合中的n個(gè)不同元素,然后從n個(gè)元素中循環(huán)取出m(m=n,n-1,…,2,1)個(gè)進(jìn)行排列,每個(gè)排列結(jié)果作為控件的操作順序,按照該順序?qū)丶M(jìn)行模擬操作,若成功,則停止遍歷,進(jìn)入下一步,并修改操作規(guī)則XML文件中的優(yōu)先級(jí);若全部的排列結(jié)果都遍歷后,依然失敗,則交于文字識(shí)別的自動(dòng)化安裝進(jìn)一步處理。
最后是結(jié)果判定。在使用GUI操作界面的安裝中,大多數(shù)軟件在進(jìn)行正確的點(diǎn)擊操作后,會(huì)在原始窗口覆蓋或者彈出新的安裝窗口。因此在上一步的模擬操作后,通過判斷是否有新窗口生成或者同一窗口的控件是否改變來判斷模擬操作是否成功。若操作成功,則繼續(xù)遍歷覆蓋后的窗口或者新彈出窗口。需要注意的是,在一些軟件的安裝窗口,會(huì)出現(xiàn)進(jìn)度條,在操作前,進(jìn)度條屬于不可見狀態(tài),在正確的操作后,進(jìn)度條變?yōu)榭梢?,此時(shí)窗口中的控件沒有發(fā)生變化。因此通過同一窗口的控件是否改變來判斷模擬操作是否成功時(shí),進(jìn)度條需要單獨(dú)進(jìn)行判斷,若進(jìn)度條可見,也說明模擬操作成功。若安裝完成,則在窗口中會(huì)出現(xiàn)“完成”標(biāo)題的“Button”控件,或者有“運(yùn)行”標(biāo)題的“CheckBox”控件,在循環(huán)遍歷窗口的過程中,需要不斷檢查安裝完成標(biāo)志,判定自動(dòng)化安裝工作是否完成。
對(duì)無法靜默安裝,且使用了非標(biāo)準(zhǔn)控件的軟件,由于無法利用API函數(shù)獲取控件的位置和名稱,也就無法確定需要操作的控件類型和控件位置。在窗口識(shí)別定位到安裝包的安裝窗口后,利用API函數(shù)GetWindowRect獲取窗口的位置,然后使用ImageGrab將軟件安裝窗口截圖,在該截圖上使用OCR識(shí)別,獲取窗口截圖中所有字符序列及字符序列的位置信息。按照以上方法,輸入OCR識(shí)別的字符序列,經(jīng)過自定義的XML操作規(guī)則篩選,輸出需要操作的有效字符序列位置信息以及字符序列的操作順序。
為測試軟件的自動(dòng)化安裝效果,本文基于“天穹沙箱分析系統(tǒng)”(見:https://research.qianxin.com/sandbox/)實(shí)現(xiàn)了分析環(huán)境,頂層框架分為服務(wù)端和客戶端,服務(wù)端為Windows 7中文64位的操作系統(tǒng),在系統(tǒng)中建立文件共享系統(tǒng),在客戶端成功連接后,為客戶端推送軟件安裝包、安裝模型和操作規(guī)則庫,并存儲(chǔ)處理客戶端搜集傳回的特征信息??蛻舳瞬渴鹆薟indows XP和Windows 7的中文32位和64位純凈版的操作系統(tǒng)。為避免外部因素給安裝過程造成干擾,分析系統(tǒng)中預(yù)置了.net/framework 3.5/4.0、JDK、Python、以及各種常用的依賴包;關(guān)閉用戶賬戶控制的通知提醒,以防止賬戶控制過程失去對(duì)系統(tǒng)的控制權(quán)。
實(shí)驗(yàn)的數(shù)據(jù)集包括了從360軟件管家、軟件官網(wǎng)、論壇以及主流的下載站獲取的共計(jì)30116個(gè)軟件安裝包。軟件類型涵蓋了辦公軟件、視頻軟件、聊天工具、瀏覽器、輸入法、音樂軟件和游戲娛樂等多種不同的領(lǐng)域。獲取數(shù)據(jù)集后,首先在服務(wù)端的系統(tǒng)中,建立文件共享存放軟件安裝包,安裝模型和操作規(guī)則庫,在與客戶端建立通信后,向客戶端推送安裝包和操作規(guī)則。根據(jù)軟件安裝包的最低系統(tǒng)要求,啟動(dòng)相應(yīng)的客戶端系統(tǒng)沙箱環(huán)境(Windows XP或Windows 7)??蛻舳顺晒?dòng)后會(huì)自動(dòng)與服務(wù)端建立連接,獲取服務(wù)端推送的安裝包,在獲取安裝包后,繼續(xù)請(qǐng)求安裝模型和操作規(guī)則進(jìn)行軟件的自動(dòng)化安裝。
運(yùn)用分層次的自動(dòng)化安裝后,有14365款軟件獲取了靜默安裝參數(shù),并成功執(zhí)行了靜默安裝,對(duì)剩余的軟件安裝包繼續(xù)執(zhí)行基于控件識(shí)別的自動(dòng)化安裝,成功安裝了10581款軟件,在對(duì)剩余的軟件安裝包執(zhí)行基于OCR識(shí)別的自動(dòng)化安裝,成功安裝了3316款軟件,最后還有1854款軟件未成功安裝,各安裝方法成功安裝的比例如圖4所示。對(duì)未安裝成功的安裝包,經(jīng)分析發(fā)現(xiàn)可分為三種情況,一是安裝包中設(shè)置版權(quán),要求在安裝時(shí)提供序列號(hào)輸入,如Acrobat、IDA Pro、Mindjet Mind Manager、Photoshop、UltraISO等。第二種是壓縮包被密碼保護(hù),由于沒有從已知信息中成功推測出解壓密碼,因此無法對(duì)其進(jìn)行后續(xù)分析。最后一種是少量樣本通過網(wǎng)絡(luò)在線下載安裝包如Flash Player,由于網(wǎng)絡(luò)下載超時(shí),導(dǎo)致安裝失敗。其中,如果不考慮沒有壓縮包密碼的樣本,整體分析成功率為95.7%。
圖4 軟件自動(dòng)化安裝各方法的成功比例
本文總結(jié)現(xiàn)有軟件自動(dòng)化安裝方案,并分析了這些方案存在的不足之處,結(jié)合大規(guī)模軟件自動(dòng)化安裝的需求,提出了基于靜默安裝參數(shù)、基于控件識(shí)別以及基于OCR識(shí)別的軟件自動(dòng)化安裝方案,對(duì)獲取的30116個(gè)安裝包進(jìn)行實(shí)驗(yàn)測試,成功率達(dá)到了約94%,如果不考慮沒有壓縮包密碼的樣本,整體分析成功率為95.7%,有效實(shí)現(xiàn)了對(duì)大規(guī)模軟件的自動(dòng)化安裝。
[1]吳承遠(yuǎn).應(yīng)用Ghost網(wǎng)絡(luò)克隆技術(shù)實(shí)現(xiàn)批量安裝計(jì)算機(jī) [J].信息與電腦,2015(9):37-38.
[2]阿呆.妙用WinRAR打造安裝程序[J].電腦迷,2005 (12):68-68.
[3]郭建偉.隔山打牛,遠(yuǎn)程遙控軟件安裝[J].電腦知識(shí)與技術(shù),2018(1):23.
[4]金色鐵錨.軟件安裝再出“懶”招[J].電腦愛好者,2006 (22):61.
[5]李魯群,林金鐘.Windows應(yīng)用軟件自動(dòng)安裝系統(tǒng)設(shè)計(jì) [J].智能計(jì)算機(jī)與應(yīng)用,2001(1):18-19.
[6]唐老鴨.安裝程序自動(dòng)裝[J].電腦知識(shí)與技術(shù),2004 (34):6-7.
[7]劉光燦,劉簡達(dá),何文德,等.全自動(dòng)軟件安裝技術(shù)研究[J].微計(jì)算機(jī)信息,2010,26(4):49-51.
[8]桔色心情.軟件安裝隨我意[J].電腦知識(shí)與技術(shù),2009 (8):29-31.
[9]孔柱新.基于AutoIt3的機(jī)房軟件自動(dòng)安裝[J].實(shí)驗(yàn)科學(xué)與技術(shù),2014,12(3):200-202.
本文由國家自然科學(xué)基金聯(lián)合基金項(xiàng)目(61972224、61772308)資助。