減少了修復(fù)過程中的帶寬占用。
【附圖說明】
[0068]圖1是本發(fā)明實(shí)施例1中一種修復(fù)客戶端程序的方法的流程示意圖。
[0069]圖2是本發(fā)明實(shí)施例2中一種修復(fù)客戶端程序的方法的流程示意圖。
[0070]圖3是本發(fā)明實(shí)施例3中一種修復(fù)客戶端程序的裝置的結(jié)構(gòu)框圖。
[0071]圖4是本發(fā)明實(shí)施例4中一種服務(wù)器的結(jié)構(gòu)框圖。
[0072]圖5是本發(fā)明實(shí)施例5中一種修復(fù)客戶端程序的系統(tǒng)的結(jié)構(gòu)框圖。
[0073]圖6是本發(fā)明實(shí)施例6中一種修復(fù)客戶端程序的方法的流程示意圖。
[0074]圖7是本發(fā)明實(shí)施例7中一種修復(fù)客戶端程序的方法的流程示意圖。
[0075]圖8是本發(fā)明實(shí)施例8中一種修復(fù)客戶端程序的裝置的結(jié)構(gòu)框圖。
[0076]圖9是本發(fā)明實(shí)施例9中一種服務(wù)器的結(jié)構(gòu)框圖。
[0077]圖10是本發(fā)明實(shí)施例10中一種修復(fù)客戶端程序的系統(tǒng)的結(jié)構(gòu)框圖。
[0078]圖11是本發(fā)明實(shí)施例11中一種修復(fù)客戶端程序的方法的流程示意圖。
[0079]圖12是本發(fā)明實(shí)施例12中一種修復(fù)客戶端程序的方法的流程示意圖。
[0080]圖13是本發(fā)明實(shí)施例13中一種修復(fù)客戶端程序的裝置的結(jié)構(gòu)框圖。
[0081]圖14是本發(fā)明實(shí)施例14中一種服務(wù)器的結(jié)構(gòu)框圖。
[0082]圖15是本發(fā)明實(shí)施例15中一種修復(fù)客戶端程序的系統(tǒng)的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0083]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0084]參見圖1,是本發(fā)明實(shí)施例1提供的一種修復(fù)客戶端程序的方法的流程示意圖。其中,該方法是針對(duì)在發(fā)現(xiàn)客戶端程序的文件被修改(惡意篡改,例如,由于病毒感染)的情況下,需要向服務(wù)器提取該文件的原始文件來進(jìn)行修復(fù)而描述。該方法包括步驟:
[0085]S101、當(dāng)本地的客戶端程序中被修改的文件大于閾值時(shí),則將所述被修改的文件按照閾值大小劃分成多個(gè)數(shù)據(jù)塊,并計(jì)算出每個(gè)數(shù)據(jù)塊的特征值后生成所述被修改的文件的特征碼列表。
[0086]其中,所述本地是指用戶端,所述客戶端程序中“被修改的文件”往往是指惡意篡改的文件,具體的包括修改文件中的部分?jǐn)?shù)據(jù)或者刪除文件中的部分?jǐn)?shù)據(jù)。所述閾值的大小可由根據(jù)實(shí)際情況設(shè)定,而特征值的計(jì)算可采用常用的算法。
[0087]下面,以閾值為1MB、采用MD5算法計(jì)算特征值為例,對(duì)本實(shí)施例的分塊處理進(jìn)行更詳細(xì)的描述。對(duì)于超過IMB的被修改的文件Fl,則將被修改的文件Fl按照IMB大小劃分成多個(gè)數(shù)據(jù)塊,然后使用MD5算法對(duì)每個(gè)數(shù)據(jù)塊計(jì)算其特征值,最終得到所述被修改的文件Fl的特征碼列表(MD5特征碼列表),例如Fl = {Ml, M2, M3, M4, M5}。
[0088]S102、將生成的所述特征碼列表發(fā)送給所述服務(wù)器,以請(qǐng)求獲取所述被修改的文件中被修改/刪除了的數(shù)據(jù)塊所對(duì)應(yīng)的原始數(shù)據(jù)塊;其中,所述被修改的文件中被修改/刪除了的數(shù)據(jù)塊所對(duì)應(yīng)的原始數(shù)據(jù)塊由所述服務(wù)器將接收到的特征碼列表與所述被修改的文件所對(duì)應(yīng)的原始文件進(jìn)行比對(duì)生成校驗(yàn)碼列表后,將所述校驗(yàn)碼列表與所述特征碼列表進(jìn)行比對(duì)確定。
[0089]其中,所述原始文件具體指所述被修改的文件的最初文件(即沒有進(jìn)行過任何修改的原始狀態(tài))。用戶端可將客戶端程序的版本號(hào)隨同所述特征碼列表一同發(fā)給所述服務(wù)器。這樣,可保證服務(wù)器端能夠找到對(duì)應(yīng)的原始文件。
[0090]具體的,用戶端將上述生成的所述被修改的文件Fl的特征碼列表Fl ={M1,M2,M3,M4,M5}發(fā)送給服務(wù)器后,服務(wù)器將所述特征碼列表與所述被修改的文件Fl的原始文件fl進(jìn)行比對(duì),得到校驗(yàn)碼列表。例如,得到的校驗(yàn)碼列表fl ={DO, Ml, M2, D3, M4, M5}。其中,Ml、M2、M4、M5均與用戶端發(fā)送的特征碼列表Fl中的特征值一致,表示所述被修改的文件Fl中第1/2/4/5數(shù)據(jù)分塊均沒有任何修改。DO表示所述被修改的文件Fl文件開頭刪除了部分?jǐn)?shù)據(jù),D3表示所述被修改的文件Fl中第3塊數(shù)據(jù)發(fā)生修改。因此,服務(wù)器需要將校驗(yàn)碼列表H = {DO, Ml, M2, D3, M4, M5}以及DO以及D3對(duì)應(yīng)的這兩塊完整數(shù)據(jù)塊返回給客戶端。
[0091]需要說明的是,此處的DO、D3對(duì)應(yīng)的兩塊完整數(shù)據(jù)塊分別是指一個(gè)連續(xù)的數(shù)據(jù)塊,且不受如前所述的閾值(IMB)大小限制。
[0092]可以理解的,當(dāng)用戶端確定本地的客戶端程序中被修改的文件不止一個(gè)時(shí),可以生成需修復(fù)文件信息列表,所述需修復(fù)文件信息列表包含每個(gè)被修改的文件的文件名,并將所述需修復(fù)文件信息列表與每個(gè)被修改的文件的特征碼列表一起發(fā)給服務(wù)器,以請(qǐng)求獲取每一個(gè)所述被修改的文件中被修改/刪除了的數(shù)據(jù)塊所對(duì)應(yīng)的原始數(shù)據(jù)塊。其中,所述需修復(fù)文件信息列表可采用數(shù)組結(jié)構(gòu),如下表所示:
[0093]Char a[] = { “dlls/secl.dll”,“dlls/sec3.dll,,};
[0094]其中,“dlls/secl.dll”,“dlls/sec3.dll”為對(duì)應(yīng)的每個(gè)被修改的文件的路徑(包括文件名)。
[0095]S103、接收所述服務(wù)器返回的所述原始數(shù)據(jù)塊以及校驗(yàn)碼列表,并根據(jù)所述校驗(yàn)碼列表將所述原始數(shù)據(jù)塊對(duì)所述被修改的文件進(jìn)行修復(fù)。
[0096]具體的,當(dāng)用戶端接收所述服務(wù)器返回的所述原始數(shù)據(jù)塊以及校驗(yàn)碼列表后,根據(jù)所述校驗(yàn)碼列表將所述服務(wù)器返回的所述原始數(shù)據(jù)塊與所述被修改的文件中未發(fā)生數(shù)據(jù)修改的數(shù)據(jù)塊重新構(gòu)建新的完整文件,并將所述新的完整文件替換所述被修改的文件,從而完成對(duì)所述被修改的文件的修復(fù)。
[0097]例如,如前所述,當(dāng)用戶端接收到所述校驗(yàn)碼列表f I = {DO, Ml, M2, D3, M4, M5}以及DO以及D3這兩塊完整數(shù)據(jù)塊時(shí),可以根據(jù)Ml、M2、M4、M5從被修改的文件Fl中找到相應(yīng)的數(shù)據(jù)塊,并和D0、D3按照順序(根據(jù)校驗(yàn)碼列表)組合成新的文件F1’,此處的F1’即為分塊更新后的完整文件。構(gòu)建一個(gè)完整的文件后,將該文件保存在待更新區(qū)。在如前所示的例子中,用戶端接收服務(wù)端返回的數(shù)據(jù)塊只有被刪除的DO和被修改的D3,其余的第1/2/4/5數(shù)據(jù)分塊則只接收到數(shù)據(jù)塊的特征值,因此節(jié)省了大量的數(shù)據(jù)交互。
[0098]其中,所述待更新區(qū)是指一個(gè)目錄,用于存放從服務(wù)端下載的數(shù)據(jù)后構(gòu)建形成的用于更新本地?cái)?shù)據(jù)的完整文件。需要說明的是,當(dāng)用戶端確定本地的客戶端程序中被修改的文件少于閾值時(shí),則無需對(duì)文件進(jìn)行分塊處理,可直接向服務(wù)器請(qǐng)求下載所述被修改的文件對(duì)應(yīng)的整個(gè)原始文件并保存到待更新區(qū)。
[0099]在利用所述待更新區(qū)的每個(gè)最新的完整文件對(duì)被修改的文件進(jìn)行相應(yīng)修復(fù)時(shí),需要啟動(dòng)文件更新器。對(duì)于待更新區(qū)的每個(gè)文件,文件更新器先將目標(biāo)文件(即被修改的文件)備份到備份區(qū),并執(zhí)行文件替換操作。
[0100]所述文件更新器是一個(gè)獨(dú)立的程序文件,用于執(zhí)行文件更新操作。由于文件更新器也有可能被修改,因此待全部數(shù)據(jù)下載并構(gòu)建完整的文件后,需要先判斷其中是否包含文件更新器。程序在運(yùn)行時(shí)無法被修改,因此如果待更新區(qū)包含文件更新器,則需要先由客戶端主程序?qū)ξ募缕鲌?zhí)行替換操作。
[0101]主程序啟動(dòng)文件更新器后自行退出,而文件更新器啟動(dòng)以后,需要保證主程序已經(jīng)完成退出。如果主程序沒有退出,那么文件更新器在更新主程序文件的時(shí)候?qū)?huì)失敗。為了實(shí)現(xiàn)所述等待客戶端主程序退出的功能,主程序在啟動(dòng)文件更新器時(shí)需要將自己的PID (Process Identity)通過命令行參數(shù)的方式傳給文件更新器程序,文件更新器根據(jù)PID來判斷主程序是否還處于運(yùn)行狀態(tài)。判斷的具體方式為:文件更新器根據(jù)PID判斷該進(jìn)程是否在運(yùn)行,如果進(jìn)程未退出,文件更新器需要等待預(yù)設(shè)時(shí)長(zhǎng)5秒,再嘗試檢測(cè)過程。重試3次以后,如果主程序還在運(yùn)行,則文件更新器需要提示用戶修復(fù)失敗,并退出修復(fù)過程。
[0102]所述備份區(qū)是指一個(gè)目錄,用于存放舊版本的文件(即被修改的文件)。在執(zhí)行文件替換操作時(shí),如果被替換的目標(biāo)文件(即被修改的文件)處于繁忙狀態(tài),可能會(huì)導(dǎo)致替換失敗。在替換失敗的情況下,文件更新器需要等待一段時(shí)間后再進(jìn)行重試。重試的次數(shù)為3次,重試的間隔為5秒。如果超出指定的重試次數(shù),則本次修復(fù)失敗,需要顯示出錯(cuò)信息來提示用戶。
[0103]上述等待主程序退出和替換文件失敗時(shí),需要退出修復(fù)過程。在實(shí)際操作過程中,可以暫停修復(fù)操作,提示用戶檢查目標(biāo)文件是否處于打開或鎖定狀態(tài),等用戶關(guān)閉文件或解鎖文件以后再重新嘗試步驟替換修復(fù)操作。
[0104]上述退出修復(fù)過程時(shí),由于客戶端可能有部分文件已經(jīng)被更新,為了保證程序文件的一致性,需要對(duì)更新過程執(zhí)行回滾操作?;貪L操作的步驟如下:對(duì)于備份區(qū)中的每一個(gè)文件,使用該文件替換程序目錄下的同名對(duì)應(yīng)文件(即將舊版本的文件恢復(fù))。所有文件替換完成后,清理備份區(qū),回滾操作完成。
[0105]待更新區(qū)的所有文件完成替換操作以后,文件更新器清理待更新區(qū)和備份區(qū),啟動(dòng)主程序并自行退出,客戶端程序修復(fù)完成。
[0106]本實(shí)施例公開的修復(fù)客戶端程序的方法通過將客戶端程序中大于閾值的被修改的文件進(jìn)行分塊處理并計(jì)算各個(gè)分塊的特征信息,以生成被修改的文件的特征碼列表,然后將特征碼列表發(fā)送給服務(wù)器,通過服務(wù)器將所述特征碼列表與所述被修改的文件所對(duì)應(yīng)的原始文件進(jìn)行比對(duì)生成校驗(yàn)碼列表,并將所述校驗(yàn)碼列表與所述特征碼列表進(jìn)行比對(duì)確定所述被修改的文件中被修改/刪除了的數(shù)據(jù)塊所對(duì)應(yīng)的原始數(shù)據(jù)塊;并接收所述服務(wù)器返回的所述原始數(shù)據(jù)塊以及校驗(yàn)碼列表,然后根據(jù)所述校驗(yàn)碼列表將所述原始數(shù)據(jù)塊對(duì)所述被修改的文件進(jìn)行修復(fù),從而節(jié)省了大量的數(shù)據(jù)交互,極大減少了修復(fù)過程中的帶寬占用。
[0107]參考圖2,是本發(fā)明實(shí)施例2公開的一種修復(fù)客戶端程序的方法的流程示意圖。其中,該方法是針對(duì)接收用戶端請(qǐng)求提取原始文件對(duì)客戶端程序中的被修改的文件(惡意篡改,例如,由于病毒感染)進(jìn)行修復(fù)而描述的,該方法包括步驟:
[0108]S201、接收用戶端發(fā)送的特征碼列表;其中,所述特征碼列表為所述用戶端將客戶端程序中的被修改的文件按照閾值大小劃分成多個(gè)數(shù)據(jù)塊,并計(jì)算出每個(gè)數(shù)據(jù)塊的特征值后生成。
[0109]其中,所述客戶端程序中“被修改的文件”往往是指惡意篡改的文件,具體的包括修改文件中的部分?jǐn)?shù)據(jù)或者刪除文件中的部分?jǐn)?shù)據(jù)。所述閾值的大小可由根據(jù)實(shí)際情況設(shè)定,而特征值的計(jì)算可采用常用的算法。例如,本實(shí)施例中的閾值為1MB,特征值的計(jì)算采用MD5算法。
[0110]當(dāng)接收到用戶端發(fā)送被修改的文件的特征碼列表時(shí),表示所述被修改的文件大于閾值(例如,1MB)。
[0111]可以理解的,當(dāng)用戶端的客戶端程序中被修改的文件不止一個(gè)時(shí),接收到用戶端發(fā)送的特征碼列表不止一個(gè)時(shí),還會(huì)同時(shí)接收到需修復(fù)文件信息列表,所述需修復(fù)文件信息列表包含每個(gè)被修改的文件的文件名,每個(gè)所述特征碼列表對(duì)應(yīng)一個(gè)所述被修改的文件。其中,所述需修復(fù)文件信息列表可采用數(shù)組結(jié)構(gòu),如下表所示:
[0112]Char a[] = { “dlls/secl.dll”,“dlls/sec3.dll,,};
[0113]其中,“dlls/secl.dll”, “dlls/sec3.dll”為對(duì)應(yīng)的每個(gè)被修改的文件的路徑(包括文件名)。
[0114]而每個(gè)文件的特征碼列表的生成過程可以參數(shù)實(shí)施例1,在此不再贅述。
[0115]S202、將接收到的所述特征碼列表與所述被修改的文件所對(duì)應(yīng)的原始文件進(jìn)行對(duì)比生成校驗(yàn)碼列表,并將所述校驗(yàn)碼列表與所述特征碼列表進(jìn)行比對(duì),以確定所述被修改的文件中被修改/刪除了的數(shù)據(jù)塊所對(duì)應(yīng)的原始數(shù)據(jù)塊。
[0116]具體的,所述將接收到的所述特征碼列表與所述被修改的文件所對(duì)應(yīng)的原始文件進(jìn)行對(duì)比生成校驗(yàn)碼列表具體包括如下過程:
[0117]步驟1、從所述原始文件的第O個(gè)字節(jié)開始,計(jì)算第一個(gè)閾值大小數(shù)據(jù)塊的校驗(yàn)碼;
[0118]步驟2、若所述校驗(yàn)碼與所述特征碼列表中的第一個(gè)特征值相同時(shí),則將所述第一個(gè)特征值加入到所述校驗(yàn)碼列表中;否則向后移一個(gè)字節(jié),再計(jì)算從所述原始文件的第I個(gè)字節(jié)開始的閾值大小數(shù)據(jù)塊的校驗(yàn)碼,如此循環(huán),直到找到所述閾值大小數(shù)據(jù)塊的校驗(yàn)碼與所述特征碼列表的第一個(gè)特征值相同的第N個(gè)字節(jié)時(shí),則將所述原始文件的第O個(gè)字節(jié)到第N-1字節(jié)之間的數(shù)據(jù)塊生成的校驗(yàn)碼加入到所述校驗(yàn)碼列表中,N ^ 2 ;然后計(jì)算從第N字節(jié)開始的閾值大小數(shù)據(jù)塊的校驗(yàn)碼,并執(zhí)行上述步驟,直至查找完所述特征碼列表的所有特征值,生成所述校驗(yàn)碼列表;
[0119]步驟3、若遍歷所述原始文件的所有字節(jié)均沒有找到與所述特征碼列表的第一個(gè)特征值相同的校驗(yàn)碼時(shí),則循環(huán)上述步驟找出與所述特征碼列表的第二個(gè)特征值相同的校驗(yàn)碼所在的字節(jié),直至查找所述特征碼列表的所有特征值,生成所述校驗(yàn)碼列表。
[0120]例如,當(dāng)接收到用戶端發(fā)送個(gè)一個(gè)被修改的文件Fl的特征碼列表為Fl={Ml, M2, M3, M4, M5}時(shí),首先可根據(jù)該被修改的文件Fl的文件名找出其對(duì)應(yīng)的原始文件Π,然后對(duì)原始文件Π執(zhí)行查找操作,以找到被修改/刪除了的數(shù)據(jù)塊,具體的查找過程如下:從原始文件fl的第O個(gè)字節(jié)開始,利用MD5算法先計(jì)算第一個(gè)IMB數(shù)據(jù)塊的校驗(yàn)碼NI,如果NI和Ml