專利名稱:一種文件解鎖、粉碎的方法及裝置的制作方法
技術領域:
本發(fā)明涉及計算機安全的技術領域,特別是涉及一種文件解鎖、粉碎的方法和一種文件解鎖、粉碎的裝置。
背景技術:
計算機病毒是指“編制者在計算機程序中插入的破壞計算機功能或者破壞數據,影響計算機使用并且能夠自我復制的一組計算機指令或者程序代碼。計算機一旦染上病毒,計算機通常表現為其文件被增加、刪出、改變名稱或屬性、移動到其它目錄下,病毒對計算機文件的這些操作,可能會導致正常的程序無法運行、計算機操作系統(tǒng)崩潰、計算機被遠程控制、用戶信息被盜用等一系列的問題。為了保證計算機的安全運行,需要對計算機中感染病毒的文件進行病毒查殺,以 防止和清除病毒的破壞。在安全軟件領域,針對染毒計算機文件的“刪除”與“反刪除”是 安全軟件和惡意程序(計算機病毒)對抗的永恒主題之一??v觀windows操作系統(tǒng)平臺,常見的反刪除技術有(I)文件只讀屬性限制(2)特殊文件名、畸形文件路徑及組合(3)文件權限、所有者限制(4)Windows APILockFile例程鎖定(5)文件句柄持有(6)文件共享屬性獨占(7)用戶態(tài)相關例程的IAT/EAT/InlineHook(8)內核態(tài)相關例程的SSDT Hook(9)文件系統(tǒng)過濾驅動攔截(10)內核相關例程的篡改、熱補丁等?,F有技術中的病毒,往往通過上述手段給染毒文件加上了加密鎖,采用常規(guī)手段無法破解加密鎖即無法刪除染毒文件,這些手段阻止殺毒軟件查殺染毒文件。安全軟件查殺病毒的過程,可以理解為對染毒文件進行解鎖和粉碎。現有安全軟件,對染毒文件的解鎖和粉碎手段單一,無法破除染毒文件設置的層層保護,對抗能力不強。傳統(tǒng)安全軟件廠商只解決了部分“反刪除”問題,在操作系統(tǒng)內核態(tài)的攻防上往往體現出一定的能力缺失,驅動級惡意程序(Rootkit)對抗能力偏弱。因此,目前需要本領域技術人員迫切解決的一個技術問題就是提出一種文件解鎖、粉碎的處理機制,用以在復雜的客戶端環(huán)境中識別惡意程序的文件自保護行為并加以對抗,增強和驅動級惡意程序攻防的對抗能力。
發(fā)明內容
本發(fā)明所要解決的技術問題是提供一種文件解鎖、粉碎的方法,以增強和驅動級惡意程序攻防的對抗能力。本發(fā)明還提供了一種文件解鎖、粉碎的裝置,用以保證上述方法在實際中的應用及實現。為了解決上述問題,本發(fā)明實施例公開了一種文件解鎖、粉碎的方法,包括判斷目標文件是否能打開且滿足預設條件;若是,則獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。優(yōu)選的,所述目標文件具有對應的文件路徑,所述判斷目標文件是否能打開且滿足預設條件的步驟具體包括以下子步驟子步驟SI,判斷所述目標文件的路徑是否能準確定位,若是,則執(zhí)行子步驟S3 ;若否,則執(zhí)行子步驟S2;子步驟S2,將所述目標文件路徑處理為正確的路徑,然后轉子步驟S3 ;子步驟S3,依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則執(zhí)行子步驟S4 ;子步驟S4,判斷所述目標文件的屬性是否為只讀,若是,則執(zhí)行子步驟S5 ;若否,則執(zhí)行子步驟S6 ;
子步驟S5,調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后轉子步驟S6;子步驟S6,調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則執(zhí)行子步驟S7 ;子步驟S7,判定所述目標文件能打開且滿足預設條件。優(yōu)選的,所述從目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值的步驟包括 從目標文件對象的數據結構中找到上下文指針指向的數據結構,然后找到文件弓I用信息庫中的Count計數域,賦值為預設值。優(yōu)選的,所述預設值為O。優(yōu)選的,所述預設值為1,所述的方法還包括調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwCIose,由所述ZwCIose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。優(yōu)選的,所述的方法,還包括若目標文件不能打開且返回句柄占用的錯誤碼,則遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle,并獲取所述文件句柄File Handle所屬的進程;切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。本發(fā)明實施例還公開了一種文件解鎖、粉碎的裝置,包括判斷模塊,用于判斷目標文件是否能打開且滿足預設條件;若是,則調用文件對象獲取模塊;文件對象獲取模塊,用于獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;引用計數清零模塊,用于從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。優(yōu)選的,所述目標文件具有對應的文件路徑,所述判斷模塊具體包括以下子模塊路徑判斷子模塊,用于判斷所述目標文件的路徑是否能準確定位,若是,則調用文件打開子模塊,若否,則調用路徑預處理子模塊;路徑預處理子模塊,用于將所述目標文件路徑處理為正確的路徑,然后調用文件打開子模塊;文件打開子模塊,用于依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則調用文件屬性查詢子模塊;文件屬性查詢子模塊,用于判斷所述目標文件的屬性是否為只讀,若是,則調用只讀屬性去除子模塊;若否,則調用文件刪除子模塊;只讀屬性去除子模塊,用于調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬 性,然后調用文件刪除子模塊;調用文件刪除子模塊,用于調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則調用判定子模塊;判定子模塊,用于判定所述目標文件能打開且滿足預設條件。優(yōu)選的,所述引用計數清零模塊包括 上下文指針查找子模塊,用于從目標文件對象的數據結構中找到上下文指針指向的數據結構;引用計數域賦值子模塊,用于依據上下文指針指向的數據結構找到文件引用信息庫中的Count計數域,賦值為預設值。優(yōu)選的,所述預設值為O。優(yōu)選的,所述預設值為1,所述的裝置還包括句柄關閉模塊,用于調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,由所述ZwClose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。優(yōu)選的,所述的裝置,還包括句柄表遍歷模塊,用于在目標文件不能打開且返回句柄占用的錯誤碼時,遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle,并獲取所述文件句柄FileHandle所屬的進程;句柄關閉操作發(fā)起模塊,用于切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。與現有技術相比,本發(fā)明具有以下優(yōu)點本發(fā)明實施例通過提供一種暴力刪除文件的機制,即在文件可以打開,但經過一些解鎖、粉碎手段,如文件路徑預處理、只讀屬性去除等,仍然無法刪除的情況下,通過“直接操作”(DK0M術語,Direct KernelObject Manipulation)文件系統(tǒng)的內部數據結構,進入文件的引用信息庫,將文件的引用計數清零,實現文件的解鎖與粉碎。本發(fā)明所提供的文件解鎖、粉碎機制不僅安全、可靠、成功率高,并且可以在復雜的客戶端環(huán)境中識別惡意程序的文件自保護行為并加以對抗,增強了和驅動級惡意程序攻防的對抗能力。
圖I是本發(fā)明的一種文件解鎖、粉碎的方法實施例I的步驟流程圖;圖2是本發(fā)明的一種文件解鎖、粉碎的方法實施例2的步驟流程圖;圖3是本發(fā)明的一種文件解鎖、粉碎的裝置實施例的結構框圖。
具體實施例方式為使本發(fā)明的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結合附圖和具體實施方式
對本發(fā)明作進一步詳細的說明。本發(fā)明實施例的核心構思之一在于,提供一種暴力刪除文件的機制,即在文件可以打開,但經過一些解鎖、粉碎手段,如文件路徑預處理、只讀屬性去除等,仍然無法刪除的情況下,通過“直接操作”(DK0M術語,Direct Kernel Object Manipulation)文件系統(tǒng)的內部數據結構,進入文件的引用信息庫,將文件的引用計數清零,實現文件的解鎖與粉碎。參考圖1,示出了本發(fā)明的一種文件解鎖、粉碎的方法實施例I的步驟流程圖,具體可以包括以下步驟步驟101、判斷目標文件是否能打開且滿足預設條件;若是,則執(zhí)行步驟102 ;在具體實現中,所述目標文件具有對應的文件路徑。在本發(fā)明的一種優(yōu)選實施例 中,所述判斷目標文件是否能打開且滿足預設條件的步驟具體可以包括以下子步驟子步驟SI,判斷所述目標文件的路徑是否能準確定位,若是,則執(zhí)行子步驟S3 ;若否,則執(zhí)行子步驟S2;子步驟S2,將所述目標文件路徑處理為正確的路徑,然后轉子步驟S3 ; 在本發(fā)明的一種優(yōu)選實施例中,所述將目標文件路徑處理為正確的路徑的步驟具體可以包括如下子步驟S2-1和S2-2 S2-1、按照路徑分隔符依次拆解出目標文件路徑中的路徑段;在本實施例中,可以基于路徑分隔符“\”和/或“/”依次拆解文件路徑,例如,文件路徑為c:\a\b. txt,則第一次拆解出的路徑段為c:,第二次拆解出的路徑段為a,第三次拆解出的路徑段為b. txt。S2-2、判斷所述路徑段是否符合預置規(guī)則,若否,則按照預置規(guī)則矯正所述目標文件路徑。針對Windows操作系統(tǒng)的應用而言,所述預置規(guī)則可以為操作系統(tǒng)定義的標準路徑描述方式。Windows操作系統(tǒng)在路徑名命名規(guī)則中,針對特殊符號(如”)和保留關鍵字和設備名做出了特別規(guī)定,因而,在具體實現中,所述路徑段不符合操作系統(tǒng)定義的標準路徑描述方式具體可以包括,在路徑段中存在保留關鍵字和設備名,和/或,在路徑段中存在特殊符號。作為本發(fā)明實施例具體應用的一種示例,若所述路徑段中包括保留關鍵字和設備名,則按照預置規(guī)則矯正目標文件路徑的步驟具體可以包括以下子步驟S2-2-1,S2-2-2,S2-2-3,和 / 或,S2-2-4 S2-2-1、在所述目標文件路徑加上“\\ \”的前綴。作為本發(fā)明實施例具體應用的另一種示例,若所述路徑段中包括目錄名和特殊符號”,則按照預置規(guī)則矯正目標文件路徑的步驟具體還可以包括以下子步驟S2-2-2、若存在去掉”后的目錄且不存在加”的目錄,則用去掉”后的目錄名替換當前路徑段中的目錄名;和/ 或,S2-2-3、若存在加”的目錄,則在所述目標文件路徑加上“\\ \ ”的前綴。作為本發(fā)明實施例具體應用的又一種示例,所述按照預置規(guī)則矯正目標文件路徑的步驟具體還可以包括以下子步驟S2-2-4、若既存在沒有”的目錄,也存在對應的加”的目錄,則采用沒有”的目錄名。更具體而言,針對目標文件路徑無法定位的畸形路徑而言,本發(fā)明實施例可以處理的保留關鍵字和設備名,以及特殊符號主要包括以下幾種情形(I)路徑段尾的”號干擾,這類型的”號會被去掉;例如,假設目標文件路徑是C:\Windows. \System32\a. \con. txt。第一個路徑段C:\Windows. \是故意加“點”,如果系統(tǒng)真的存在目錄C: \Windows\,并且C:\Windows. \不存在,就認為這里的點號是“干擾”可以去掉。(2)帶”號的NT風格路徑(相對DOS風格而言這是“畸形”的路徑,這也是畸形的由來),這類型的點號不能去掉。 例如,假設目標文件路徑是C:\Windows. \System32\a. \con. txt。第三個路徑段“a. \,,子目錄真實存在,可以認為這不是干擾,屬于NT風格路徑,微軟規(guī)定NT風格路徑需要加\\ \前綴,于是針對這類型的處理是在目標文件路徑加上“\\ \”的前綴。(3)上述(1)、(2)混合存在于目標文件路徑中的情形,在具體實現中,通過逐個路徑段判斷,明確哪個點號可以去除,哪個點號不應去除。例如,父目錄有”號干擾,則去除父目錄中的”號;子目錄中存在帶”號的畸形文件夾,則保留該”號,但在目標文件路徑加上“\\ \ ”的前綴。(4)兩條目標文件路徑的區(qū)別僅在于某個或某幾個路徑段中,一個加了 ”號,一個沒加”號,則確定起作用的目標文件路徑為沒加”號目標文件路徑。例如在注冊表的啟動項里寫c:\a. \run. exe會導致run. exe程序開機自啟動。若磁盤上存在c:\a\run. exe文件、也存在c:\a. \run. exe文件,則起作用(自啟動時被加載)的目標文件路徑為c: \a\run. exe。(5)以Windows操作系統(tǒng)的保留關鍵字、設備名為名字的文件,針對此類型的路徑處理為,在所述目標文件路徑加上“\\ \”的前綴。Windows操作系統(tǒng)的保留關鍵字、設備名包括PRN、COMI、COM2、COM3、COM4、C0M5、C0M6、C0M7、C0M8、C0M9、COMlO、LPTl、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9、NUL、CON、AUX 等。例如,假設目標文件路徑是C: \Windows. \System32\a. \con. txt。由于最后一個路徑段con. txt中包括保留關鍵字con,于是在目標文件路徑加上“\\ \”的前綴。(6)上述五種情形混合出現。如上例中所述的畸形目標文件路徑C:\Windows. \System32\a. \con. txt,經處理為的正確路徑為\\ \C:\Windows\System32\a. \con. txt。在具體應用中,本發(fā)明實施例適合各種Windows操作系統(tǒng)平臺(除DOS磁盤操作系統(tǒng))。隨著操作系統(tǒng)的發(fā)展,如果有另外的保留關鍵字和擴展名以及特殊符號,在實際中可以動態(tài)擴充ExpandFileName函數(自定義應用程序接口 BAPI的路徑預處理裝置),方便地達到新增保留關鍵字和擴展名以及特殊符號的目的。子步驟S3,依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則執(zhí)行子步驟S4 ;在本發(fā)明的一種優(yōu)選實施例中,所述調用自定義的用于打開文件的應用程序接口嘗試打開目標文件的步驟,具體可以包括如下子步驟S31、S32、S33和S34 S31、獲取針對目標文件的打開操作請求,所述請求中包括調用者輸入參數,所述輸入參數中包括所述正確路徑;S32、校驗所述調用者輸入參數,若校驗通過,則依據所述正確路徑在對象管理器中查找對應的文件對象解析例程;S33、若查找到對應的文件對象解析例程,則依據所述文件對象解析例程生成I/O請求包,并發(fā)送至預置的文件系統(tǒng)下層設備的原始地址;其中,所述I/o請求包中包括從所述目標文件打開操作請求中提取的打開操作信息;
S34、由所述文件系統(tǒng)下層設備依據所述打開操作信息執(zhí)行打開所述目標文件的操作。需要說明的是,在本發(fā)明實施例中,所述文件打開不是指通過雙擊鼠標或按回車鍵等觸發(fā)方式打開文件(如*. exe、*. doc等類型的文件);而是指用操作系統(tǒng)API或本發(fā)明的自定義BAPI (應用本發(fā)明,可以在操作系統(tǒng)用戶態(tài)接口完整實現一套文件操作調用庫)的CreateFileO函數等打開文件、得到文件句柄的操作,因為只有得到文件句柄后才可以進一步操作該文件。從函數調用方法角度而言,本發(fā)明實施例中所指文件“打開”主要包括以下幾種情形I、使用Windows標準API CreateFile函數打開目標文件;2、使用 Windows Native API ZwCreateFile/NtCreateFile 函數打開目標文件;3、使用 Windows Native API ZwOpenFile/NtOpenFile 函數打開目標文件其中,CreateFile的參數dwCreationDisposition可以控制函數行為是“創(chuàng)建新文件”還是“打開已經存在的文件”。在本發(fā)明的一種優(yōu)選實施例中,所述子步驟S32中依據文件路徑在對象管理器中查找對應的文件對象解析例程的步驟具體可以包括以下子步驟S321、S322、S323、S324和S325 ;子步驟S321、判斷文件路徑是否已經拆解完畢,若否,則執(zhí)行子步驟S322 ;若是,則執(zhí)行子步驟S324 ;子步驟S322、按照路徑分隔符拆解出文件路徑中下一個待拆解的路徑段;子步驟S323、采用當前拆解出的路徑段在對象管理器中搜索,判斷是否存在對應的文件對象例程;若是,則返回子步驟S321 ;若否,則執(zhí)行子步驟S325 ;子步驟S324、獲得所述文件路徑對應的文件對象解析例程。子步驟S325、返回未找到對應文件對象解析例程的信息。在具體實現中,可以預先構建對象管理器查詢的OpenPacket結構,基于路徑分隔符“ \ ”循環(huán)拆解文件路徑,例如,文件路徑為c:\a\b. txt,則第一次拆解出的路徑段為c:,第二次拆解出的路徑段為c:\a,第三次拆解出的路徑段為c:\a\b. txt,即在本發(fā)明實施例,是基于遞歸調用的方式拆解文件路徑。對象管理器中維護有拉鏈式的對象Hash表,基于每次拆解出的路徑段搜索對象管理器,若能查找到對應的對象解析例程ParseProcedure,則繼續(xù)下一次的文件路徑拆解,并基于下一次拆解出的路徑段和之前已拆解出的路徑段搜索對象管理器,若當前的文件路徑經過循環(huán)解析被完全拆解完畢,則經過搜索對象管理器找到的文件對象解析例程ParseRoutine為當前文件路徑對應的文件對象解析例程。在實際中,調用者進程可以在用戶態(tài)通過調用自定義的FSCreateFile例程發(fā)起文件打開請求,所述請求中包括目標文件的路徑,在對所述路徑采用本發(fā)明進行預處理(若為畸形路徑,則預處理為正確路徑)后,操作系統(tǒng)內核態(tài)驅動獲取并校驗所述來自用戶態(tài)的請求,構建查詢數據結構循環(huán)解析傳入的文件路徑,最終查找到對象管理器中維護的對象類型,這一過程有效對抗了內核態(tài)的劫持內險。此后,操作系統(tǒng)內核態(tài)驅動構建并填充IRP請求數據包,發(fā)送至預先確定的文件系統(tǒng)下層設備的原始地址處,此時文件系統(tǒng)調用棧上的第三方過濾驅動(其他安全軟件、驅動級惡意程序)被穿透(旁路,bypass)。簡而言之,即本發(fā)明通過建立一條新的、可信的、可以穿透過濾驅動的文件操作執(zhí)行路徑,有效避免了傳統(tǒng)操作系統(tǒng)的文件執(zhí)行路徑上存在的風險。子步驟S4,判斷所述目標文件的屬性是否為只讀,若是,則執(zhí)行子步驟S5 ;若否, 則執(zhí)行子步驟S6 ;在實際中,若接收到上述目標文件刪除或寫入操作的調用錯誤碼,則獲取該目標文件的屬性信息。例如,如果目標文件具有只讀屬性,則上述調用會返回錯誤碼,參考微軟MSDN 中的描述為“If the file is aread-only file, the function fails with ERR0R_ACCESS_DENIED (若文件為只讀文件,則因為ERROR_ACCESS_DENIED調用失敗)”;其中,ERROR_ACCESS_DENIED 是一個數值,值為 5。子步驟S5,調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后轉子步驟S6;若文件具有只讀屬性,則文件將不允許被寫入和刪除,在這種情況下,則只能通過去除只讀屬性才能繼續(xù)文件操作。在Windows操作系統(tǒng)用戶態(tài),可以使用函數SetFileAttributes、ZwSetInformationFile設置一個文件的屬性(這一過程也是主動發(fā)起的);在Windows操作系統(tǒng)內核態(tài),可以使用函數ZwSetInformationFile設置文件屬性。SetFileAttributes、ZwSetInformationFile等函數如果設置文件屬性成功,函數會返回“非零”(相對“零”而言,一般是I),設置屬性失敗函數返回“零”。然而,在實際中,調用上述API設置文件屬性存在極大的數據流被篡改的風險,操作系統(tǒng)的分層調用方式,給驅動級的惡意程序帶來了許多可趁之機。因而,在本發(fā)明的一種優(yōu)選實施例中,所述目標文件的只讀屬性需要通過調用自定義的應用程序接口 BAPI去除,具體可以包括如下子步驟S5-1、獲取針對目標文件的屬性更改請求,所述請求中包括調用者輸入參數,所述輸入參數中包括目標文件的路徑;S5-2、校驗所述調用者輸入參數,若校驗通過,則依據所述目標文件路徑在對象管理器中查找對應的文件對象解析例程;S5-3、若查找到對應的文件對象解析例程,則依據所述文件對象解析例程生成I/O請求包,并發(fā)送至預置的文件系統(tǒng)下層設備的原始地址;其中,所述I/o請求包中包括依據所述屬性更改請求生成的目標文件屬性更改操作信息;S5-4、由所述文件系統(tǒng)下層設備依據所述目標文件屬性更改操作信息,去除目標文件的只讀屬性。更具體而言,調用者進程可以在用戶態(tài)通過調用自定義的FSSetFileAttributes例程發(fā)起文件屬性的更改請求,其中,所述請求中包括調用者輸入參數,所述輸入參數中包括文件路徑和用戶態(tài)地址;用戶態(tài)的FSSetFiIeAttributes例程會將調用者輸入參數中的ANSI相關參數轉換為UNICODE類型,并調用對應的文件操作接口寬字符FSSetFileAttributes例程;然后依據系統(tǒng)平臺的類型構建內核態(tài)結構參數,依據所述內核態(tài)結構參數生成相應的文件操作控制碼,并發(fā)送至操作系統(tǒng)內核態(tài);操作系統(tǒng)內核態(tài)驅動獲取文件屬性更改請求,校驗調用者輸入參數,并重構(Captured)所述用戶態(tài)地址至內核態(tài)內存空間;FSSetFileAttributes例程的內核態(tài)部分會校驗用戶態(tài)傳入參數,構建OpenPacket結構,循環(huán)解析文件路徑格式并搜索對象管理器維護的拉鏈式對象Hash表。具體可以采用路徑分隔符“\”拆解輸入的文件路徑,拆解出的路徑部分搜索對象管理器維護的拉鏈式對象Hash表,查找出對應的ParseProcedure。在循環(huán)解析完畢時,便認為找到了 對象的ParseRoutine例程。Parse Routine內部會構建并填充IRP請求數據包并發(fā)送至文件系統(tǒng)下層設備的原始地址處,完成文件穿透的創(chuàng)建過程。此時,文件系統(tǒng)調用棧上的第三方過濾驅動(其他安全軟件、驅動級惡意程序)被旁路。然后由文件系統(tǒng)下層設備執(zhí)行具體的文件屬性更改操作。在具體實現中,所述文件屬性更改操作至少包括去除只讀屬性的操作,還可以包括根據實際情況設置成其它屬性的操作,如設置隱藏屬性等,本發(fā)明對此不作限制。子步驟S6,調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則執(zhí)行子步驟S7 ;在本發(fā)明的一種優(yōu)選實施例中,所述調用自定義的用于刪除文件的應用程序接口嘗試刪除目標文件的步驟具體包括如下子步驟S6-1、獲取針對目標文件的刪除請求,所述請求中包括調用者輸入參數,所述輸入參數中包括目標文件的路徑;S6-2、校驗所述調用者輸入參數,若校驗通過,則依據所述目標文件路徑在對象管理器中查找對應的文件對象解析例程;S6-3、若查找到對應的文件對象解析例程,則依據所述文件對象解析例程生成I/O請求包,并發(fā)送至預置的文件系統(tǒng)下層設備的原始地址;其中,所述I/o請求包中包括依據所述刪除請求生成的目標文件刪除操作信息;S6-4、由所述文件系統(tǒng)下層設備依據所述目標文件刪除操作信息,刪除所述目標文件。子步驟S7,判定所述目標文件能打開且滿足預設條件。即在這種情況下,才繼續(xù)執(zhí)行步驟102。步驟102、獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;在Windows操作系統(tǒng)的應用中,通過打開文件路徑即可得到文件句柄,調用操作系統(tǒng)內核的句柄引用對象例程ObReferenceObjectByHandle,即可通過文件句柄得到文件對象(FILE OBJECT)。
步驟103、從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。在Windows操作系統(tǒng)的應用中,文件系統(tǒng)驅動(NTFS. SYS、FASTFAT. SYS等)主要功能是識別、組織、維護磁盤上的文件,文件系統(tǒng)驅動會在內存里建立一系列復雜的數據結構來表述、維護“文件”和“使用者”之間的關系,“文件引用信息庫”可以看作是上述數據結構的一部分,它主要維護了文件使用的“引用計數” “,”這些“引用計數”表明目標文件被使用(“使用”一詞在操作系統(tǒng)內核里主要是指打開“Create”和引用“Reference”)的次數。如一個文件只被進程A打開過I次,此時,文件的引用計數為I ;隨后,進程A關閉文件時,Close句 柄操作會使引用計數減1,以此類推。微軟設計這套方案來維護文件使用的“生命周期”。作為本發(fā)明實施例具體實現的一種示例,所述步驟103具體可以包括如下子步驟從目標文件對象的數據結構中找到上下文指針指向的數據結構,然后找到文件引用信息庫中的Count計數域,賦值為預設值。其中,文件引用信息庫可以參考SCB數據結構、FCB數據結構、CCB數據結構、LCB數據結構等等,本發(fā)明并不以此為限。需要說明的是,上述結構術語中,CB是“控制塊”的縮寫(Control Block),如FCB代表文件控制塊(FileControlBlock),CCB、LCB、SCB也都是某種控制塊的縮寫,這可能是有意義的縮寫,也可能是無意義的代號。值得注意的是,關于文件系統(tǒng)驅動內部數據結構的設計細節(jié)以及上述縮寫,微軟從來沒有公開,故本說明書中無法給出這些控制塊的對應中文含義。在本發(fā)明的一種優(yōu)選實施例中,所述預設值可以為0,即針對各控制塊中的Count計數域直接賦值為0,從而達到引用計數清零的目的。然而,這種操作在實際中往往引發(fā)不可預知的風險,因而可以采用下一種實施例。在本發(fā)明的另一種優(yōu)選實施例中,,所述預設值可以為I,在這種情況下,本發(fā)明實施例還包括以下步驟調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,由所述ZwClose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。可以理解,本實施例實際是把“文件引用信息庫”中的“” “引用計數信息”強制清理成I,再主動觸發(fā)一次操作系統(tǒng)內核的句柄關閉函數ZwClose,讓系統(tǒng)自己完成由I清成O的操作(Close句柄操作會使引用計數減I),這么做的好處是更加安全、穩(wěn)定,減少出錯的機率和風險。強制清零操作之后,文件系統(tǒng)維護的引用計數為零,這意味著文件的“生命周期”結束,文件系統(tǒng)會自動清除該目標文件,在這種情況下,無需再主動發(fā)送目標文件的刪除命令。參考圖2,示出了本發(fā)明的一種文件解鎖、粉碎的方法實施例2的步驟流程圖,具體可以包括以下步驟步驟201,判斷所述目標文件的路徑是否能準確定位,若是,則執(zhí)行步驟203 ;若否,則執(zhí)行步驟202;步驟202,將所述目標文件路徑處理為正確的路徑,然后轉步驟203 ;步驟203,依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件;步驟204,判斷所述目標文件是否能被打開,若是,則執(zhí)行步驟205 ;若否,則執(zhí)行步驟210 ;步驟205,判斷所述目標文件的屬性是否為只讀,若是,則執(zhí)行子步驟206 ;若否,則執(zhí)行步驟207 ;步驟206,調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后轉步驟207;步驟207,調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件;步驟208,判斷所述目標文件是否能被刪除,若是,則跳轉步驟211 ;若否,則執(zhí)行
步驟209 ;步驟209,獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。步驟210,讀取目標文件無法被打開返回的錯誤碼,如為句柄占用的錯誤碼,則遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄FileHandle,并獲取所述文件句柄File Handle所屬的進程;然后切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。步驟211、返回文件刪除成功的信息(STATUS_SUCCESS)。以在Windows操作系統(tǒng)中應用本實施例為例,若無法打開目標路徑下的文件,并且操作系統(tǒng)內核態(tài)返回的錯誤碼信息為STATUS_DELETE_PENDING,數值為0xC0000056L ;和/或,操作系統(tǒng)用戶態(tài)返回的錯誤碼信息為拒絕訪問ERROR_ACCESS_DENIED,數值為5。則可以判定所述目標文件存在句柄占用的情形。STATUS_DELETE_PENDING (延時刪除)是微軟操作系統(tǒng)內核定義的一個狀態(tài)(錯誤碼),它表示某文件已被打開,但同時它也被要求刪除,只是目前還有進程持有文件的句柄(持有意味著還有引用計數)。當最后一個文件持有者關閉句柄時,文件系統(tǒng)驅動會自動從磁盤清除這個文件。在“最后一個文件持有者關閉句柄前”,任何進程都無法再打開這個文件。由于內核認為文件都要被刪除了,就不用再被打開了。在具體實現中,所述目標文件具有對應的全路徑;所述句柄表位于操作系統(tǒng)內核,其中維護有所有進程打開的句柄信息,所述句柄信息中包括文件句柄File Handle的信息,所述文件句柄File Handle的信息中包括各文件句柄File Handle對應的文件的全路徑(即文件句柄在創(chuàng)建時對應的磁盤路徑)。因而,作為本發(fā)明實施例具體應用的一種示例,所述遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle的步驟具體可以為將目標文件的全路徑與各文件句柄File Handle對應的文件的全路徑進行對比,若找到一致的文件全路徑,則提取該文件全路徑對應的文件句柄File Handle為所述目標文件對應的文件句柄File Handle。在實際中,Windows操作系統(tǒng)會在其內核維護所有進程打開的句柄信息,維護的結構被稱作“句柄表”。句柄是區(qū)分類型存儲的,同時,每個句柄都歸屬于一個特定的進程,常見的句柄類型包括File (文件)、Process (進程)、Thread (線程)、Key (鍵值)等。本發(fā)明實施例主要是針對文件句柄(File Handle)而言,應用本實施例,通過枚舉每一個文件句柄所對應的文件全路徑,并和待刪除文件的全路徑進行比較,如果相等就認為找到了目標。而此時目標句柄所屬進程也得到了明確(每個句柄都歸屬于一個特定的進程),切換到那個進程,以它的名義(上下文)發(fā)起目標文件解鎖操作請求即可。在本發(fā)明的一種優(yōu)選實施例中,所述切換到所述進程的操作可以通過調用操作系統(tǒng)應用程序接口 API的堆棧連接進程例程KeStackAttachProcess執(zhí)行。切換到所述目標文件的文件句柄File Handle所屬的進程可以理解為切換到“句柄持有者”進程空間,然后以這個進程的名義(進程上下文,context)發(fā)起目標文件解鎖操作的請求。在具體實現中,進程切換前需要進一步考慮目標進程是否真的可供切換;例如,目標進程正在被結束往往是不能切換的,所以要引入一定的同步機制(鎖機制)等;因此,作為本發(fā)明實施例在具體實現中的一種示例,還可以在判斷所述文件句柄File Handle所屬的進程是否能切換,并在能切換時才執(zhí)行所述切換至進程的步驟。在本發(fā)明的一種優(yōu)選實施例中,所述基于進程發(fā)起目標文件句柄的關閉操作的步 驟具體可以包括以下子步驟以所述進程的名義發(fā)起文件句柄關閉操作請求;依據所述請求調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,所述ZwClose例程執(zhí)行文件句柄關閉操作。在具體實現中,當所述目標文件句柄的關閉操作完成后,所述目標文件即被清除,從而完成文件解鎖及粉碎的過程??梢岳斫獾氖?,應用本發(fā)明實施例,文件引用計數清零操作的前提是文件可被打開,但是如果文件處于STATUS_DELETE_PENDING狀態(tài),無論是用API的CreateFile函數還是用BAPI的CreateFile函數都不能打開,此時只能用句柄枚舉、句柄關閉的方法刪除目標。需要說明的是,對于方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領域技術人員應該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領域技術人員也應該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。參考圖3,示出了本發(fā)明的一種文件解鎖、粉碎的裝置實施例的結構框圖,具體可以包括以下模塊判斷模塊31,用于判斷目標文件是否能打開且滿足預設條件;若是,則調用文件對象獲取模塊32 ;文件對象獲取模塊32,用于獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;引用計數清零模塊33,用于從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。在本發(fā)明的一種優(yōu)選實施例中,所述目標文件具有對應的文件路徑,所述判斷模塊31具體包括以下子模塊路徑判斷子模塊,用于判斷所述目標文件的路徑是否能準確定位,若是,則調用文件打開子模塊,若否,則調用路徑預處理子模塊;
路徑預處理子模塊,用于將所述目標文件路徑處理為正確的路徑,然后調用文件打開子模塊;文件打開子模塊,用于依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則調用文件屬性查詢子模塊;文件屬性查詢子模塊,用于判斷所述目標文件的屬性是否為只讀,若是,則調用只讀屬性去除子模塊;若否,則調用文件刪除子模塊;只讀屬性去除子模塊,用于調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后調用文件刪除子模塊;調用文件刪除子模塊,用于調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則調用判定子模塊;
判定子模塊,用于判定所述目標文件能打開且滿足預設條件。針對Windows操作系統(tǒng)的應用,所述引用計數清零模塊可以包括以下子模塊 上下文指針查找子模塊,用于從目標文件對象的數據結構中找到上下文指針指向的數據結構;引用計數域賦值子模塊,用于依據上下文指針指向的數據結構找到文件引用信息庫中的Count計數域,賦值為預設值。作為本發(fā)明實施例具體應用的一種示例,所述預設值可以為O。作為本發(fā)明實施例具體應用的另一種示例,所述預設值可以為1,在本實施例中,所述的裝置還可以包括以下模塊句柄關閉模塊,用于調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,由所述ZwClose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。在本發(fā)明的一種優(yōu)選實施例中,還可以包括如下模塊句柄表遍歷模塊,用于在目標文件不能打開且返回句柄占用的錯誤碼時,遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle,并獲取所述文件句柄FileHandle所屬的進程;句柄關閉操作發(fā)起模塊,用于切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。由于所述裝置實施例基本相應于前述方法實施例,故本實施例的描述中未詳盡之處,可以參見前述實施例中的相關說明,在此就不贅述了。本發(fā)明可用于眾多通用或專用的計算系統(tǒng)環(huán)境或配置中。例如個人計算機、服務器計算機、手持設備或便攜式設備、平板型設備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費電子設備、網絡PC、小型計算機、大型計算機、包括以上任何系統(tǒng)或設備的分布式計算環(huán)境等等。本發(fā)明可以在由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務或實現特定抽象數據類型的例程、程序、對象、組件、數據結構等等。也可以在分布式計算環(huán)境中實踐本發(fā)明,在這些分布式計算環(huán)境中,由通過通信網絡而被連接的遠程處理設備來執(zhí)行任務。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設備在內的本地和遠程計算機存儲介質中。
以上對本發(fā)明所提供的一種文件解鎖、粉碎的方法和一種文件解鎖、粉碎的裝置進行了詳細介紹,本文中應用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實 施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領域的一般技術人員,依據本發(fā)明的思想,在具體實施方式
及應用范圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本發(fā)明的限制。
權利要求
1.一種文件解鎖、粉碎的方法,其特征在于,包括 判斷目標文件是否能打開且滿足預設條件; 若是,則獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象; 從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。
2.如權利要求I所述的方法,其特征在于,所述目標文件具有對應的文件路徑,所述判斷目標文件是否能打開且滿足預設條件的步驟具體包括以下子步驟 子步驟SI,判斷所述目標文件的路徑是否能準確定位,若是,則執(zhí)行子步驟S3 ;若否, 則執(zhí)行子步驟S2 ; 子步驟S2,將所述目標文件路徑處理為正確的路徑,然后轉子步驟S3 ; 子步驟S3,依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則執(zhí)行子步驟S4 ; 子步驟S4,判斷所述目標文件的屬性是否為只讀,若是,則執(zhí)行子步驟S5 ;若否,則執(zhí)行子步驟S6 ; 子步驟S5,調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后轉子步驟S6; 子步驟S6,調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則執(zhí)行子步驟S7; 子步驟S7,判定所述目標文件能打開且滿足預設條件。
3.如權利要求I所述的方法,其特征在于,所述從目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值的步驟包括 從目標文件對象的數據結構中找到上下文指針指向的數據結構,然后找到文件引用信息庫中的Count計數域,賦值為預設值。
4.如權利要求3所述的方法,其特征在于,所述預設值為O。
5.如權利要求3所述的方法,其特征在于,所述預設值為1,所述的方法還包括 調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,由所述ZwClose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。
6.如權利要求I或2所述的方法,其特征在于,還包括 若目標文件不能打開且返回句柄占用的錯誤碼,則遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle,并獲取所述文件句柄File Handle所屬的進程; 切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。
7.一種文件解鎖、粉碎的裝置,其特征在于,包括 判斷模塊,用于判斷目標文件是否能打開且滿足預設條件;若是,則調用文件對象獲取模塊; 文件對象獲取模塊,用于獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象; 引用計數清零模塊,用于從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。
8.如權利要求7所述的裝置,其特征在于,所述目標文件具有對應的文件路徑,所述判斷模塊具體包括以下子模塊 路徑判斷子模塊,用于判斷所述目標文件的路徑是否能準確定位,若是,則調用文件打開子模塊,若否,則調用路徑預處理子模塊; 路徑預處理子模塊,用于將所述目標文件路徑處理為正確的路徑,然后調用文件打開子模塊; 文件打開子模塊,用于依據所述正確的目標文件路徑,調用自定義的用于打開文件的應用程序接口嘗試打開目標文件,若所述目標文件被打開,則調用文件屬性查詢子模塊;文件屬性查詢子模塊,用于判斷所述目標文件的屬性是否為只讀,若是,則調用只讀屬性去除子模塊;若否,則調用文件刪除子模塊; 只讀屬性去除子模塊,用于調用自定義的用于文件屬性更改的應用程序接口去除所述目標文件的只讀屬性,然后調用文件刪除子模塊; 調用文件刪除子模塊,用于調用自定義的用于刪除文件的應用程序接口嘗試刪除所述目標文件,若無法刪除,則調用判定子模塊; 判定子模塊,用于判定所述目標文件能打開且滿足預設條件。
9.如權利要求7所述的裝置,其特征在于,所述引用計數清零模塊包括 上下文指針查找子模塊,用于從目標文件對象的數據結構中找到上下文指針指向的數據結構; 引用計數域賦值子模塊,用于依據上下文指針指向的數據結構找到文件引用信息庫中的Count計數域,賦值為預設值。
10.如權利要求9所述的裝置,其特征在于,所述預設值為O。
11.如權利要求9所述的裝置,其特征在于,所述預設值為1,所述的裝置還包括 句柄關閉模塊,用于調用Windows操作系統(tǒng)內核態(tài)的句柄關閉例程ZwClose,由所述ZwClose例程執(zhí)行文件句柄關閉操作,并將所述文件引用信息庫中的引用計數值清零。
12.如權利要求7或8所述的裝置,其特征在于,還包括 句柄表遍歷模塊,用于在目標文件不能打開且返回句柄占用的錯誤碼時,遍歷操作系統(tǒng)的句柄表,獲得目標文件對應的文件句柄File Handle,并獲取所述文件句柄FileHandle所屬的進程; 句柄關閉操作發(fā)起模塊,用于切換到所述進程,基于所述進程發(fā)起目標文件句柄的關閉操作。
全文摘要
本發(fā)明提供了一種文件解鎖、粉碎的方法,包括判斷目標文件是否能打開且滿足預設條件;若是,則獲取目標文件的句柄,并依據所述句柄獲取目標文件的對象;從所述目標文件的對象中查找到對應的文件引用信息庫,將所述文件引用信息庫中的引用計數值賦為預設值。本發(fā)明所提供的文件解鎖、粉碎機制不僅安全、可靠、成功率高,并且可以在復雜的客戶端環(huán)境中識別惡意程序的文件自保護行為并加以對抗,增強了和驅動級惡意程序攻防的對抗能力。
文檔編號G06F21/56GK102855435SQ20111017540
公開日2013年1月2日 申請日期2011年6月27日 優(yōu)先權日2011年6月27日
發(fā)明者鄭文彬, 潘劍鋒, 王宇 申請人:奇智軟件(北京)有限公司