防注入的方法和裝置與流程
2023-05-24 21:18:26 1

本發明涉及信息安全領域,特別是涉及一種防注入的方法和裝置。
背景技術:
注入是指以某種方式或通過系統機制把可執行模塊強行加載到進程中。常見的注入發生在API(Applicant Programming Interface,應用程式編程接口)的內部,當代碼中調用某個系統API時(如SHELL32.dll的特定API),API內部會主動讀取註冊表特定的位置,檢查是否有第三方的DLL(Dynamic Link Library,動態連結庫)註冊信息,如果存在第三方的DLL信息,API會把這些第三方DLL加載到當前進程中,這個就是一次注入過程。
為了防止注入,傳統的方式是避免調用有注入行為的API。然而,採用避免調用的方式,需要清晰知道哪類API內部具有注入行為,對軟體開發者要求過高,且出錯機會較大;一些核心功能的API,實現功能比較複雜,並且沒有替代的API,如果調用這些API則會被注入,容易被攻擊者通過注入的DLL進行攻擊,安全性低,若不調用這些API,則需要自己實現其相應的功能,代價非常大。
技術實現要素:
基於此,有必要針對傳統的避免調用方式防止注入,出錯機率大且安全性低的問題,提供一種防注入的方法,能防止出錯且安全性高。
此外,還有必要提供一種防注入的裝置,能防止出錯且安全性高。
一種防注入的方法,包括以下步驟:
獲取應用程式編程接口的調用指令;
根據所述調用指令在應用程式編程接口內部讀取註冊表信息時,進入Hook函數;
通過所述Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息;
加載獲取的動態連結庫信息到當前進程。
一種防注入的裝置,包括:
調用模塊,用於獲取應用程式編程接口的調用指令;
進入模塊,用於根據所述調用指令在應用程式編程接口內部讀取註冊表信息時,進入Hook函數;
獲取模塊,用於通過所述Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息;
加載模塊,用於加載獲取的動態連結庫信息到當前進程。
上述防注入的方法和裝置,調用應用程式編程接口時,通過Hook函數讀取註冊表信息,並按照預設策略獲取動態連結庫信息,加載動態連結庫信息到當前進程中,通過預設策略篩選了動態連結庫,而不是直接由應用程式編程接口讀取註冊表信息獲取動態連結庫進行加載,不需人工識別,能防止出錯,且能加載應用程式編程接口,因篩選過動態連結庫,調用應用程式編程接口安全性高。
附圖說明
圖1A為一個實施例中終端的內部結構示意圖;
圖1B為一個實施例中伺服器的內部結構示意圖;
圖2為一個實施例中防注入的方法的流程圖;
圖3為一個實施例中使用上述防注入的方法注入動態連結庫的框架示意圖;
圖4為一個實施例中通過該Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息的具體流程圖;
圖5為一個實施例中防注入的裝置的結構框圖;
圖6為另一個實施例中防注入的裝置的結構框圖;
圖7為注入第三方的DLL的結果示意圖;
圖8為防止注入第三方的DLL的結果示意圖。
具體實施方式
為了使本發明的目的、技術方案及優點更加清楚明白,以下結合附圖及實施例,對本發明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發明,並不用於限定本發明。
圖1A為一個實施例中終端的內部結構示意圖。如圖1A所示,該終端包括通過系統總線連接的處理器、存儲介質、內存和網絡接口、聲音採集裝置、顯示屏、揚聲器和輸入裝置。其中,終端的存儲介質存儲有作業系統,還包括一種防注入的裝置,該防注入的裝置用於實現一種防注入的方法。存儲介質中還存儲有白名單和/或黑名單、動態連結庫注入信息的註冊表位置等,白名單用於記錄允許注入的動態連結庫的屬性信息,黑名單用於記錄不允許注入的動態連結庫的屬性信息。屬性信息可包括DLL(Dynamic Link Library,動態連結庫)的路徑、DLL的CLSID信息(Class Identity,全局唯一標識符)、DLL的哈希信息等。該處理器用於提供計算和控制能力,支撐整個終端的運行。終端中的內存為存儲介質中的防注入的裝置的運行提供環境,網絡接口用於與伺服器進行網絡通信,如發送數據請求至伺服器,接收伺服器返回的數據等。終端的顯示屏可以是液晶顯示屏或者電子墨水顯示屏等,輸入裝置可以是顯示屏上覆蓋的觸摸層,也可以是終端外殼上設置的按鍵、軌跡球或觸控板,也可以是外接的鍵盤、觸控板或滑鼠等。該終端可以是手機、平板電腦或者個人數字助理。本領域技術人員可以理解,圖1A中示出的結構,僅僅是與本申請方案相關的部分結構的框圖,並不構成對本申請方案所應用於其上的終端的限定,具體的終端可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
圖1B為一個實施例中伺服器的內部結構示意圖。如圖1B所示,該伺服器包括通過系統總線連接的處理器、存儲介質、內存和網絡接口。其中,該伺服器的存儲介質存儲有作業系統、資料庫和防注入的裝置,資料庫中存儲有白名單和/或黑名單、動態連結庫注入信息的註冊表位置等,白名單用於記錄允許注入的動態連結庫的屬性信息,黑名單用於記錄不允許注入的動態連結庫的屬性信息。屬性信息可包括DLL(Dynamic Link Library,動態連結庫)的路徑、DLL的CLSID信息(Class Identity,全局唯一標識符)、DLL的哈希信息等。該防注入的裝置用於實現適用於伺服器的一種防注入的方法。該伺服器的處理器用於提 供計算和控制能力,支撐整個伺服器的運行。該伺服器的內存為存儲介質中的防注入的裝置的運行提供環境。該伺服器的網絡接口用於據以與外部的終端通過網絡連接通信,比如接收終端發送的數據請求以及向終端返回壓縮後的數據等。伺服器可以用獨立的伺服器或者是多個伺服器組成的伺服器集群來實現。本領域技術人員可以理解,圖1B中示出的結構,僅僅是與本申請方案相關的部分結構的框圖,並不構成對本申請方案所應用於其上的伺服器的限定,具體的伺服器可以包括比圖中所示更多或更少的部件,或者組合某些部件,或者具有不同的部件布置。
圖2為一個實施例中防注入的方法的流程圖。圖2中的防注入的方法可應用於終端或伺服器上。如圖2所示,一種防注入的方法,包括以下步驟:
步驟202,獲取應用程式編程接口的調用指令。
具體地,程序調用應用程式編程接口時,產生調用指令。
步驟204,根據該調用指令在應用程式編程接口內部讀取註冊表信息時,進入Hook函數。
具體地,程序調用API時,API內部會讀取註冊表信息。讀取註冊表信息是讀取各個註冊表位置上的信息。
步驟206,通過該Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息。
具體地,Hook函數讀取註冊表信息後,根據預設策略從註冊表信息中獲取動態連結庫信息。
預設策略可根據需要設定。
在一個實施例中,預設策略可包括白名單和/或黑名單。其中,白名單用於記錄允許注入的動態連結庫的屬性信息,該黑名單用於記錄不允許注入的動態連結庫的屬性信息。屬性信息可包括DLL的路徑、DLL的CLSID(全局唯一標識符)信息、DLL的哈希信息等中的一種或多種。DLL的路徑是指動態連結庫所處的位置,例如D:\program files/abc。DLL的CLSID是指windows系統對於不同的應用程式、文件類型、對象等以及各種系統組件分配的一個唯一表示它的ID代碼,用於對其身份的標示和其他對象進行區分。
步驟206包括:通過該Hook函數讀取註冊表信息,並根據白名單和/或黑名單篩選得到允許注入的動態連結庫。
具體地,根據白名單篩選出允許加載的動態連結庫,根據黑名單刪除不允許加載的動態連結庫。
在另一個實施例中,預設策略為不允許任何動態連結庫注入。步驟206包括:通過該Hook函數讀取註冊表信息,並根據預設策略獲取空信息給應用程式編程接口。
具體地,當預設策略為不允許任何動態連結庫注入時,Hook函數返回空信息給API,這樣就不會有任何動態連結庫被加載。
在另一個實施例中,預設策略可包括動態連結庫的數字籤名信息。步驟206包括:通過Hook函數讀取註冊表信息,獲取動態連結庫信息,從動態連結庫信息中篩選出具有數字籤名的動態連結庫作為允許注入的動態連結庫。
具體地,動態連結庫信息可包括DLL的路徑、DLL的CLSID(全局唯一標識符)信息、DLL的哈希信息等中的一種或多種。
在另一個實施例中,預設策略可包括動態連結庫的數字籤名信息、白名單和/或黑名單。步驟206包括:通過Hook函數讀取註冊表信息,獲取動態連結庫信息,從動態連結庫信息中篩選出具有數字籤名的動態連結庫,再從具有數字籤名的動態連結庫中按照白名單和/或黑名單篩選得到允許注入的動態連結庫。
步驟208,加載獲取的動態連結庫信息到當前進程。
具體地,獲取的動態連結庫信息可包括允許注入的動態連結庫,或者為空信息。若動態連結庫信息為允許注入的動態連結庫,則加載獲取的動態連結庫到當前進程中。若動態連結庫信息為空信息,則不加載任何動態連結庫。
當前進程是指調用應用程式編程接口的程序運行時所啟動的進程。
上述防注入的方法,調用應用程式編程接口時,通過Hook函數讀取註冊表信息,並按照預設策略獲取動態連結庫信息,加載動態連結庫信息到當前進程中,通過預設策略篩選了動態連結庫,而不是直接由應用程式編程接口讀取註冊表信息獲取動態連結庫進行加載,不需人工識別,能防止出錯,且能加載應 用程序編程接口,因篩選過動態連結庫,調用應用程式編程接口安全性高。
圖3為一個實施例中使用上述防注入的方法注入動態連結庫的框架示意圖。如圖3所示,注入動態連結庫的過程包括:API調用後,(1)API內部讀取註冊表信息;(2)從Hook函數讀取DLL信息;(3)Hook函數讀取註冊表;(4)獲取註冊表返回的註冊表信息;(5)Hook函數根據返回的註冊表信息及預設策略返回DLL信息給API;(6)API加載獲取到的DLL到當前進程。
圖4為一個實施例中通過該Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息的具體流程圖。如圖4所示,通過該Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息步驟包括:
步驟402,通過該Hook函數讀取註冊表信息,判斷讀取的註冊表位置是否為預先記錄的與注入相關的註冊表位置,若是,則執行步驟404,若否,執行步驟410。
本實施例中,預先記錄動態連結庫注入信息的註冊表位置。具體地,軟體開發者統計出系統中所有保存DLL注入信息的註冊表位置,並記錄。預先記錄的與注入相關的註冊表位置即為預先記錄的動態連結庫注入信息的註冊表位置。
步驟404,根據該調用指令分析讀取到的動態連結庫信息,然後執行步驟406。
步驟406,根據預設策略從讀取到的動態連結庫信息中剔除不需要注入的動態連結庫,然後執行步驟408。
步驟408,獲取剩餘的動態連結庫。
具體地,預設策略可包括數字籤名、黑名單、白名單其中一種或兩種以上組合。
本實施例中,加載獲取的動態連結庫信息到當前進程的步驟包括:加載該剩餘的動態連結庫到當前進程。
步驟410,根據調用指令直接獲取動態連結庫信息。
具體地,判斷出讀取的註冊表位置不為預先記錄的與注入相關的註冊表位 置,則根據調用指令直接獲取動態連結庫信息,後續根據獲取的動態連結庫信息直接進行加載。
上述通過Hook函數判斷讀取的註冊表位置是否為與注入相關的位置,若是,則分析讀取到的DLL信息,根據預設策略篩選能加載的DLL,如此加載的DLL均為信任的DLL,其安全性高,通過Hook函數進行檢測判斷,方便且準確性高,能防止出錯。
圖5為一個實施例中防注入的裝置的結構框圖。圖5的防注入的裝置的內部模塊為對應於圖2中防注入的方法所建立的虛擬功能模塊,但不限於此功能模塊劃分。如圖5所示,一種防注入的裝置,包括調用模塊510、進入模塊520、獲取模塊530和加載模塊540。其中:
調用模塊510用於獲取應用程式編程接口的調用指令。
具體地,程序調用應用程式編程接口時,產生調用指令。
進入模塊520用於根據該調用指令在應用程式編程接口內部讀取註冊表信息時,進入Hook函數。
具體地,程序調用API時,API內部會讀取註冊表信息。讀取註冊表信息是讀取各個註冊表位置上的信息。
獲取模塊530用於通過該Hook函數讀取註冊表信息,並根據預設策略獲取動態連結庫信息。
具體地,Hook函數讀取註冊表信息後,根據預設策略從註冊表信息中獲取動態連結庫信息。預設策略可根據需要設定。
在一個實施例中,預設策略可包括白名單和/或黑名單。其中,白名單用於記錄允許注入的動態連結庫的屬性信息,該黑名單用於記錄不允許注入的動態連結庫的屬性信息。屬性信息可包括DLL的路徑、DLL的CLSID(全局唯一標識符)信息、DLL的哈希信息等中的一種或多種。DLL的路徑是指動態連結庫所處的位置,例如D:\program files/abc。DLL的CLSID是指windows系統對於不同的應用程式、文件類型、對象等以及各種系統組件分配的一個唯一表示它的ID代碼,用於對其身份的標示和其他對象進行區分。
獲取模塊530還用於通過該Hook函數讀取註冊表信息,並根據白名單和/或黑名單篩選得到動態連結庫。具體地,根據白名單篩選出允許加載的動態連結庫,根據黑名單刪除不允許加載的動態連結庫。
在另一個實施例中,預設策略為不允許任何動態連結庫注入。獲取模塊530還用於通過該Hook函數讀取註冊表信息,並根據預設策略獲取空信息給應用程式編程接口。
具體地,當預設策略為不允許任何動態連結庫注入時,Hook函數返回空信息給API,這樣就不會有任何動態連結庫被加載。
在另一個實施例中,預設策略可包括動態連結庫的數字籤名信息。獲取模塊530還用於通過Hook函數讀取註冊表信息,獲取動態連結庫信息,從動態連結庫信息中篩選出具有數字籤名的動態連結庫作為允許注入的動態連結庫。
具體地,動態連結庫信息可包括DLL的路徑、DLL的CLSID(全局唯一標識符)信息、DLL的哈希信息等中的一種或多種。
在另一個實施例中,預設策略可包括動態連結庫的數字籤名信息、白名單和/或黑名單。獲取模塊530還用於通過Hook函數讀取註冊表信息,獲取動態連結庫信息,從動態連結庫信息中篩選出具有數字籤名的動態連結庫,再從具有數字籤名的動態連結庫中按照白名單和/或黑名單篩選得到允許注入的動態連結庫。
加載模塊540用於加載獲取的動態連結庫信息到當前進程。
具體地,獲取的動態連結庫信息可包括允許注入的動態連結庫,或者為空信息。若動態連結庫信息為允許注入的動態連結庫,則加載獲取的動態連結庫到當前進程中。若動態連結庫信息為空信息,則不加載任何動態連結庫。
當前進程是指調用應用程式編程接口的程序運行時所啟動的進程。
上述防注入的裝置,調用應用程式編程接口時,通過Hook函數讀取註冊表信息,並按照預設策略獲取動態連結庫信息,加載動態連結庫信息到當前進程中,通過預設策略篩選了動態連結庫,而不是直接由應用程式編程接口讀取註冊表信息獲取動態連結庫進行加載,不需人工識別,能防止出錯,且能加載應用程式編程接口,因篩選過動態連結庫,調用應用程式編程接口安全性高。
在一個實施例中,該獲取模塊530還用於通過該Hook函數讀取註冊表信息,判斷讀取的註冊表位置是否為預先記錄的與注入相關的註冊表位置,若判斷出讀取的註冊表位置為預先記錄的與注入相關的註冊表位置,則根據該調用指令分析讀取到的動態連結庫信息,根據預設策略從讀取到的動態連結庫信息中剔除不需要注入的動態連結庫,並獲取剩餘的動態連結庫;以及還用於若判斷出讀取的註冊表位置不為預先記錄的與注入相關的註冊表位置,則根據調用指令直接獲取動態連結庫信息。
該加載模塊540還用於加載該剩餘的動態連結庫到當前進程。
上述通過Hook函數判斷讀取的註冊表位置是否為與注入相關的位置,若是,則分析讀取到的DLL信息,根據預設策略篩選能加載的DLL,如此加載的DLL均為信任的DLL,其安全性高,通過Hook函數進行檢測判斷,方便且準確性高,能防止出錯。
圖6為另一個實施例中防注入的裝置的結構框圖。如圖6所示,一種防注入的裝置,除了包括調用模塊510、進入模塊520、獲取模塊530和加載模塊540,還包括記錄模塊550。其中:
記錄模塊550用於預先記錄動態連結庫注入信息的註冊表位置。通過記錄動態連結庫注入信息的註冊表位置方便進行比較判斷獲取的註冊表位置是否為動態連結庫注入信息的註冊表位置。
為了更加清楚的說明防注入的方法和裝置,以電腦管家應用程式為例。因穩定性是軟體的基礎,軟體在運行過程中需要加載系統的模塊、軟體自身模塊以及第三方注入的模塊,一般來說,軟體自身模塊經過軟體開發組的測試是相對穩定的,而對於第三方注入的模塊,由於種類眾多,開發力量懸殊,測試不充分等原因,注入到軟體後導致軟體工作不正常、崩潰等,對軟體的打擊是致命的。注入的模塊即指動態連結庫(DLL)。如圖7所示,在未採用防注入的方法之前,電腦管家應用程式啟動後對應的進程被注入了相關的軟體模塊,例如, DLL的名稱為TortoiseSVN32.dll,描述為TortoiseSVN shell extension client,公司名稱為http://tortoisesvn.net,路徑為D:\TortoiseSVN\bin\TortoiseSVN32.dll;DLL的名稱為TortoiseStub32.dll,描述為TortoiseSVN shell extension client,公司名稱為http://tortoisesvn.net,路徑為D:\TortoiseSVN\bin\TortoiseStub32.dll;DLL的名稱為libsvn_tsvn32.dll,描述為subversion library dll built for TortoiseSVN shell extension client,公司名稱為http://subversion.apache.org/,路徑為D:\TortoiseSVN\bin\libsvn_tsvn32.dll等,電腦管家自身所需的軟體模塊可包括DLL的名稱為GdiPlus.dll,描述為Microsoft GDI+,公司名稱為Microsoft Corporation,路徑為C:\Windows\winsxs\x86_microsoft.windows.gdiplus_6595b64;DLL的名稱為comctl32.dll,描述為用戶體驗控制項庫,公司名稱為Microsoft Corporation,路徑為C:\Windows\winsxs\x86_microsoft.windows.commom-controls;DLL的名稱為msvcr80.dll,描述為Microsoft C Runtime Library,公司名稱為Microsoft Corporation,路徑為C:\Windows\winsxs\x86_microsoft.vc80.crt_lfc8b3b9ale8e3等。一旦這些模塊內部發生了異常會導致整個管家進程也異常退出,從某個角度來看,攻擊者也可以通過注入的DLL,攻擊電腦管家。
通過防注入的方法,電腦管家調用API時,API內部讀取註冊表,進入Hook函數,Hook函數讀取註冊表信息,篩選剔除第三方的DLL,得到剩餘的DLL信息,將剩餘的DLL信息返回給API,API加載剩餘的DLL到當前電腦管家進程。如圖8所示,電腦管家的進程不再注入第三方的DLL模塊,只加載系統自身的一些DLL,例如DLL的名稱為GdiPlus.dll,描述為Microsoft GDI+,公司名稱為Microsoft Corporation;DLL的名稱為comctl32.dll,描述為用戶體驗控制項庫,公司名稱為Microsoft Corporation;DLL的名稱為msvcr80.dll,描述為Microsoft C Runtime Library,公司名稱為Microsoft Corporation等。如此不但節省了內存,還保證了電腦管家進程的穩定性。
本領域普通技術人員可以理解實現上述實施例方法中的全部或部分流程,是可以通過電腦程式來指令相關的硬體來完成,所述的程序可存儲於一非易失性計算機可讀取存儲介質中,該程序在執行時,可包括如上述各方法的實施 例的流程。其中,所述的存儲介質可為磁碟、光碟、只讀存儲記憶體(Read-Only Memory,ROM)等。
以上所述實施例僅表達了本發明的幾種實施方式,其描述較為具體和詳細,但並不能因此而理解為對本發明專利範圍的限制。應當指出的是,對於本領域的普通技術人員來說,在不脫離本發明構思的前提下,還可以做出若干變形和改進,這些都屬於本發明的保護範圍。因此,本發明專利的保護範圍應以所附權利要求為準。