的具體調(diào)用指令,利用Hook技術(shù)來實現(xiàn)。另一方面通過監(jiān)控目標應(yīng)用程序?qū)ο到y(tǒng)資源的訪 問,例如是否請求發(fā)送短信息,來依據(jù)安全策略確定是否允許其操作,當不允許這種實施這 種行為時,可以向相關(guān)調(diào)用指令返回自定義數(shù)據(jù),例如返回空值,從而確保能杜絕一些非法 操作。所述監(jiān)控模塊被注冊為服務(wù)進程,以鉤子函數(shù)關(guān)聯(lián)目標應(yīng)用程序活動進程的調(diào)用指 令以實現(xiàn)對所述目標應(yīng)用程序的活動監(jiān)控。所述監(jiān)控模塊利用鉤子函數(shù)對相關(guān)調(diào)用指令的 入口點進行監(jiān)視,截獲此一調(diào)用指令,轉(zhuǎn)向執(zhí)行相應(yīng)的鉤子函數(shù),由該鉤子函數(shù)依據(jù)沙箱 自身邏輯來應(yīng)答該調(diào)用指令,從而達到前述的目的。涉及到監(jiān)控模塊對于監(jiān)視活動的處理, 尤其是安全控制方面,將在后文中給出更為具體的實例進行說明。
[0127] 步驟130,當監(jiān)控到目標應(yīng)用程序調(diào)用加載dex文件的函數(shù),則鉤取所述加載dex文 件的函數(shù)以獲取dex文件信息。
[0128] 其中,加載dex文件的函數(shù),包括可以加載dex文件相關(guān)信息的函數(shù),例如OnAttach 函數(shù)、openDEXf i 1 e函數(shù)等。
[0129]在目標應(yīng)用進程啟動后,鉤取模塊可以鉤取目標應(yīng)用進程對上述的加載dex文件 的函數(shù)的調(diào)用,同時鉤子函數(shù)可以繼續(xù)執(zhí)行所鉤取的函數(shù),從而可以獲取到dex文件信息。 [0130]例如,可以利用鉤取模塊中的鉤子函數(shù),分別鉤取上述的0n A11 a c h函數(shù)、 openDEXf ile函數(shù),然后鉤子函數(shù)可以繼續(xù)執(zhí)行上述OnAttach函數(shù)、openDEXf ile函數(shù)的功 能,從而可以分別獲取OnAttach函數(shù)和openDEXf ile函數(shù)加載的dex文件相關(guān)信息。
[0131 ]步驟140,根據(jù)所述dex文件信息對所述dex文件進行修復(fù)。
[0132] 如前述,經(jīng)步驟130獲取的dex文件信息中的代碼(code)是被加殼的,不完全可見 的。其加殼的具體方式可以有很多種,例如,dex文件的偏移值被損壞、其中的部分代碼被抽 取、dex文件的結(jié)構(gòu)被打散等情況。
[0133] 在本發(fā)明實施例中,可以利用修復(fù)模塊根據(jù)獲取的dex文件信息對dex文件進行修 復(fù)。
[0134] 在具體實施過程中,對dex文件的修復(fù)方法可以為:針對dex文件的加殼方式,利用 與各加殼方式對應(yīng)的修復(fù)方式相對應(yīng)地破解其加殼方式。例如,若某dex文件的加殼的具體 方式為dex文件的偏移值被損壞,則可以利用恢復(fù)偏移值的修復(fù)方式,對該dex文件進行修 復(fù);若某dex文件的加殼的具體方式為其中的部分代碼被抽取,則可以利用恢復(fù)代碼的修復(fù) 方式,查找出其被抽取的代碼段及位置,然后該dex文件進行修復(fù)。
[0135] 在本發(fā)明實施例中,可以反射調(diào)用與宿主應(yīng)用程序具有相同包名或不同包名的作 為宿主應(yīng)用程序附帶資源的安裝包,以加載該安裝包所實現(xiàn)的目標應(yīng)用程序;由宿主應(yīng)用 程序調(diào)用監(jiān)控模塊,對目標應(yīng)用程序的活動進行監(jiān)控;當監(jiān)控到目標應(yīng)用程序調(diào)用加載dex 文件的函數(shù),則鉤取所述加載dex文件的函數(shù)以獲取dex文件信息;根據(jù)所述dex文件信息對 所述dex文件進行修復(fù)。由此可以在免Root的情況下對加殼的應(yīng)用進行脫殼,從而可以還原 隱藏的dex文件,為辨識病毒提供可操作的條件。
[0136] 實施例二
[0137] 參照圖2,示出了根據(jù)本發(fā)明一個實施例的一種動態(tài)脫殼方法實施例的步驟流程 圖,具體可以包括如下步驟:
[0138] 步驟210,反射調(diào)用與宿主應(yīng)用程序具有相同包名或不同包名的作為宿主應(yīng)用程 序附帶資源的安裝包,以加載該安裝包所實現(xiàn)的目標應(yīng)用程序。
[0139] 步驟220,由宿主應(yīng)用程序調(diào)用監(jiān)控模塊,對目標應(yīng)用程序的活動進行監(jiān)控。
[0140] 步驟230,當監(jiān)控到目標應(yīng)用程序調(diào)用OnAttach函數(shù),則鉤取所述OnAttach函數(shù)以 獲取dex文件彳目息。
[0141] 在實際應(yīng)用中,目標應(yīng)用進程通過調(diào)用OnAttach函數(shù),可以獲取dex文件信息。而 且,Android系統(tǒng)中的每個應(yīng)用進程都會調(diào)用OnAttach函數(shù)。
[0142] 所以,在本發(fā)明實施例中,可以利用鉤取模塊,鉤取目標應(yīng)用進程對OnAttach函數(shù) 的調(diào)用,然后該鉤取模塊可以繼續(xù)執(zhí)行與OnAttach函數(shù)一致的操作,從而可以獲取到調(diào)用 OnAttach函數(shù)所獲取的dex文件信息。
[0143] 優(yōu)選地,步驟230,包括:
[0144] 子步驟231,鉤取OnAttach函數(shù),根據(jù)目標應(yīng)用進程傳輸給所述OnAttach函數(shù)的參 數(shù),獲取類加載器。
[0M5]其中的類加載器(ClassLoader)的作用包括加載當前目標應(yīng)用的類到Java虛擬機 中。在本發(fā)明實施例中,所有屬于當前目標應(yīng)用的類(Class)都是用與之對應(yīng)的類加載器加 載到本發(fā)明實施例的Dalvik虛擬機中。
[0146] 在實際應(yīng)用中,各應(yīng)用進程調(diào)用OnAttach函數(shù)的過程中,會傳輸給OnAttach函數(shù) 一定的參數(shù)。所以,在本發(fā)明實施例中,鉤取〇nAttach函數(shù),利用OnAttach函數(shù)接收到的參 數(shù),從而可以獲取類加載器。
[0147] 子步驟232,從所述類加載器獲取cookie信息;所述cookie信息包括dex緩存信息。
[0148] 其中的cookie信息可以記錄操作痕跡信息,在本發(fā)明實施例中,從某個類加載器 獲取的cookie信息中記錄該類加載器的操作痕跡,例如,對各種類的加載等操作痕跡。
[0149] 如前述,dex文件中包括全部應(yīng)用代碼,其中有很多類。所以,在cookie信息包括 dex緩存信息。通過從類加載器中獲取cookie信息,進而可以獲取dex緩存信息。
[0150] 步驟240,當監(jiān)控到目標應(yīng)用程序調(diào)用openDEXf ile函數(shù),則鉤取所述openDEXf ile 函數(shù)以獲取dex文件信息。
[0151]在實際應(yīng)用中,在實際應(yīng)用中,可能會通過一個dex文件加載一個第三方的dex文 件,進而啟動該第三方的dex文件對應(yīng)的應(yīng)用。則在第三方的dex文件加載的過程中,會調(diào)用 openDEXf i le函數(shù)以從Android系統(tǒng)內(nèi)存中加載第三方的dex文件。
[0152] 所以,在本發(fā)明實施例中,利用鉤取模塊鉤取目標應(yīng)用進程對openDEXf i 1 e函數(shù)的 調(diào)用,然后鉤取模塊繼續(xù)執(zhí)行與openDEXfile函數(shù)同樣的操作,從而可以獲取dex文件信息。
[0153] 需要說明的是,在本發(fā)明實施例中,步驟230和步驟240可能只存在一個,對此,本 發(fā)明實施例不加以限定。若兩者都存在,則步驟240也可以在步驟230之前執(zhí)行,對此,本發(fā) 明實施例也不加以限定。
[0154] 子步驟241,鉤取openDEXfile函數(shù),根據(jù)目標應(yīng)用進程傳輸給所述openDEXfile函 數(shù)的參數(shù)將dex文件信息加載到緩存中,并從所述緩存中獲取dex緩存信息。
[0155]同樣,在實際應(yīng)用中,各應(yīng)用進程調(diào)用openDEXfile函數(shù)的過程中,會傳輸給 openDEXfile函數(shù)一定的參數(shù)。所以在本發(fā)明實施例中,可以鉤取openDEXfile函數(shù),根據(jù)目 標應(yīng)用進程傳輸給openDEXfile函數(shù)的參數(shù),將dex文件信息加載到緩存中,然后從緩存中 獲取dex緩存彳目息。
[0156]當然,也可以不將dex文件信息加載到緩存中,而直接獲取dex文件信息,對此,本 發(fā)明實施例不加以限定。
[0157] 步驟250,分析dex的破壞方式,并根據(jù)所述破壞方式采用相應(yīng)的修復(fù)方式對所述 dex文件進行修復(fù)。
[0158] 在實際應(yīng)用中,dex文件的破壞方式可能有很多種。優(yōu)選地,在本發(fā)明實施例中,破 壞方式包括:損壞dex偏移值、破壞header (頭文件)、抽取code (代碼)、打散結(jié)構(gòu)、添加亂碼。 [0159]其中,損壞dex偏移值是指dex文件的偏移值被改變,在實際應(yīng)用中,可以通過解析 dex文件的偏移值信息,判斷dex偏移值是否被損壞。
[0160] header是dex文件中的頭文件,其中包含dex偏移值和size(長度)信息等,所以,在 本發(fā)明實施例中,可以通過判斷dex偏移值是否被損壞進而判斷header是否被破壞。
[0161]抽取code,包括dex文件中的部分代碼被轉(zhuǎn)存到其他地方,例如被轉(zhuǎn)存在系統(tǒng)內(nèi)存 中。在實際應(yīng)用中,可以通過判斷Code off的指針是否指向dex文件,進而確定其中的code 是否被抽取。若Code off的指針不指向dex文件,而指向內(nèi)存中,貝lj可確定其中的code被抽 取。
[0162] 打散結(jié)構(gòu),包括dex文件的組成部分并是集中存儲在內(nèi)存的某一處。此時dex文件 的有些偏移值指向內(nèi)存中的其他地方,但是dex文件的偏移值都是正確的。
[0163] 添加亂碼,包括在原始的dex文件中添加亂碼。在實際應(yīng)用中,可以通過對內(nèi)存進 行反編譯發(fā)現(xiàn)添加亂碼的信息,例如添加亂碼的位置與亂碼的內(nèi)容等。
[0164] 所以,在本發(fā)明實施例中,可以分析dex文件的破壞方式,然后針對不同的破壞方 式,采用相應(yīng)的修復(fù)方式對所述dex文件進行修復(fù)。
[0165] 優(yōu)選地,當所述破壞方式為損壞dex偏移值和/或破壞header時,步驟250,包括:
[0166] 子步驟251,根據(jù)所述header里面size(長度)信息重新計算偏移,并根據(jù)所述偏移 獲取真實的數(shù)據(jù)。
[0167] 在實際應(yīng)用中,若破壞方式為損壞dex偏移值和/或破壞header,其中的偏移值都 會被改變,但是對于此類兩種破壞方式,header里面的size信息是不會發(fā)生變化的,因此, 在本發(fā)明實施例中,可以基于header里面size信息重新計算偏移值,從而可以對破壞方式 為損壞dex偏移值和/或破壞header的dex文件進行修復(fù)。
[0168]優(yōu)選地,當所述破壞方式為抽取code時,步驟250,包括:
[0169] 子步驟252,遍歷每個類并在DVM(Dalvik Virtual Machine,Dalvik虛擬機)虛擬 機中實例化,并從所述DVM虛擬機中獲取真實的code數(shù)據(jù)。
[0170]若dex文件的破壞方式為抽取code,則在本發(fā)明實施例中,可以遍歷每個類并在 Dal vik虛擬機中實例化,從而可以獲取被抽取的code信息,例如被抽取的code的位置及內(nèi) 容等,進而可以從DVM虛擬機中獲取原始dex文件真實的code數(shù)據(jù)。
[0171] 其中,可以利用任何一種現(xiàn)有的遍歷方法實現(xiàn)對每個類的遍歷,對此,本發(fā)明實施 例不加以限定。另外,在Da 1 v i k虛擬機中對類進行實例化使本領(lǐng)域的公知技術(shù),在此不再贅 述。
[0172] 優(yōu)選地,當所述破壞方式為添加亂碼時,步驟250,包括:
[0173] 子步驟253,刪除所述亂碼。
[0174] 在本發(fā)明實施例中,可以通過對內(nèi)存進行反編譯,查找出在目標應(yīng)用的dex文件中 添加的亂碼,然后對亂碼進行刪除。
[0175] 當然,也可以通過其他現(xiàn)有的技術(shù)查找所添加的亂碼,對此本發(fā)明實施例不加以 限定。
[0176] 優(yōu)選地,當所述破壞方式為打散結(jié)構(gòu)時,步驟250,包括:
[0177]子步驟254,根據(jù)指向不同內(nèi)存指向dex文件塊的指針,從各內(nèi)存中獲取dex文件 塊。
[0178]如前述,若破壞方式為打散結(jié)構(gòu),則其dex文件可能被拆分為多個dex文件塊,存儲 在不同的內(nèi)存中。
[0179] 在本發(fā)明實施例中,可以通過指向不同內(nèi)存中的dex文件塊的指針,從各內(nèi)存中獲 取各dex文件塊。
[0180] 子步驟255,在同一個內(nèi)存中,將各dex文件塊拼接為一個dex文件。
[0181]在獲取了屬于同一dex文件的各dex文件塊后,可以在同一個內(nèi)存中,將各dex文件 塊拼接為一個dex文件,即可以獲得原始的dex文件。
[0182]其中的同一個內(nèi)存,可以為存儲屬于該dex文件的各dex文件塊的任一各內(nèi)存,也 可以另外選擇一個新的內(nèi)存,對此,本發(fā)明實