,本發(fā)明進而可以對加殼安裝 包中的代碼文件進行壓縮,生成壓縮文件和用于還原所述壓縮文件為代碼文件的附加文 件,這一壓縮過程同理適用于所述原安裝包中。只要后續(xù)安裝過程中依據(jù)逆向算法,利用附 加文件對所述壓縮文件在內(nèi)存中進行還原,即可使宿主應用程序和目標應用程序?qū)崿F(xiàn)正常 運行。經(jīng)過壓縮的安裝包,其增量接近于零甚至小于零,因此效率較高。
[0104] 3、安裝該加殼安裝包。
[0105] 如前所述,本發(fā)明的實施場景之一,未獲Root權(quán)限,因此,這種場景中,并不能通過 本發(fā)明實現(xiàn)靜默安裝。這種情況下,本發(fā)明優(yōu)先通過調(diào)用系統(tǒng)安裝器,以啟動安裝界面,指 導用戶完成該加殼安裝包的安裝。
[0106] 若加殼安裝包的包名與目標應用程序的包名相同,則宿主應用程序即指所述加殼 安裝包安裝后的程序,而所述安裝包即指存放于加殼安裝包的a ssets\目錄下的應用程序 原安裝包。安裝后,宿主應用程序反射調(diào)用的目標應用程序的安裝包,屬于宿主應用程序的 已安裝資源文件。反射調(diào)用該安裝包,即意味著運行所述目標應用程序。
[0107] 加殼安裝包的包名不同于目標應用程序的包名,則安裝該加殼安裝包后,其中的 Andro i dman ifest.xml中的文件便完成向系統(tǒng)的注冊,若宿主應用程序所使用的包名與目 標應用程序的包名不同,但后續(xù)可通過利用所述逆向規(guī)則實現(xiàn)的程序克服,故宿主應用程 序能夠通過ActivityManagerService找到經(jīng)反射調(diào)用而運行的目標應用程序的組件的入 口,并且,目標應用程序的組件也能順利通過系統(tǒng)PackageManagerService的查驗,程序?qū)?現(xiàn)難度大減,而且應用程序的運行效率也將大大提高。
[0108] 步驟110,反射調(diào)用與宿主應用程序具有相同包名或不同包名的作為宿主應用程 序附帶資源的安裝包,以加載該安裝包所實現(xiàn)的目標應用程序。
[0109] 本發(fā)明所采用的反射機制可以為Java反射機制,Java反射機制是在運行狀態(tài)中, 對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它 的任意一個方法;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象的方法的功能即為JAVA語言的反射 機制。
[0110] 在本發(fā)明推薦的一個實例中,所述宿主應用程序?qū)⑹紫日业狡浒惭b后的由其 assets攜帶的安裝包APK文件,然后通過一個代理組件(Activity )去執(zhí)行APK中的 Activity,從而實現(xiàn)對目標應用程序的反射調(diào)用。宿主應用程序?qū)嵤┓瓷湔{(diào)用首先需要通 過類加載器來實現(xiàn),具體是通過DexClassLoaderO來實現(xiàn)。利用這一類加載器來實現(xiàn)對安 裝包中的活動組件的調(diào)用是本領(lǐng)域技術(shù)人員所掌握的手段,恕不贅述。程序?qū)崿F(xiàn)時,通過一 個Proxy方法來讓宿主應用程序接管目標應用程序的執(zhí)行,一旦被接管以后,目標應用程序 所有的執(zhí)行均通過proxy實現(xiàn),且Context也變成了宿主程序的Context。宿主應用程序其實 就是個空殼,它只是把原安裝包apk加載到自己的內(nèi)部去執(zhí)行。這種情況下,盡管宿主應用 程序已經(jīng)采用目標應用程序的Andro idmanifest. xml向系統(tǒng)注冊,由于運行上下文環(huán)境 context可能不同,仍可能會導致出現(xiàn)資源訪問上的困難,有時甚至會發(fā)現(xiàn)不能訪問安裝包 中的資源的情況。而這種困難的程度,取決于前述應用配置方法中,被構(gòu)造到加殼應用程序 中的資源的多寡,當然也關(guān)系到包名相同或者不同的問題。不管如何,本領(lǐng)域技術(shù)人員可以 借助后續(xù)揭示的方式加以克服。
[0111]目標應用程序的運行將涉及到對資源的引用,這種引用的處理技巧雖為本領(lǐng)域技 術(shù)人員所知曉,但也較為繁雜,因此本發(fā)明將盡量通過示例輔助本領(lǐng)域技術(shù)人員快速理解 本發(fā)明所提供的若干實例。
[0112]誠然,如果目標應用程序要訪問的資源已經(jīng)被已安裝的宿主應用程序注冊到系統(tǒng) 中,例如前文所述的主圖標文件,則其對資源的引用將非常直接,通過對宿主應用程序的已 安裝資源的調(diào)用即可滿足目標應用程序的資源訪問。除此之外,則需要附加一些額外考慮。
[0113] 如果由于構(gòu)造加殼安裝包導致宿主應用程序的Context不能被目標應用程序正常 訪問,可以考慮改進這一問題,向原安裝包借用資源。由于目標應用程序安裝包APK沒有安 裝,因此就無法通過宿主應用程序的Context去取得APK中的資源,比如圖片、文本等。APK在 被加載運行時所采用的上下文是宿主應用程序的上下文,用別人的Context是無法得到自 己的資源的。由此可知,宿主應用程序除了要能加載應用程序中的各組件外,還要為應用程 序構(gòu)造其所需的運行環(huán)境。
[0114] Android應用程序在運行的過程中,是通過一個稱為AssetsManager資源管理器來 讀取打包在APK文件里面的資源文件的。應用程序的每一個Activity組件都關(guān)聯(lián)一個 Context Imp 1對象,這個Context Imp 1對象就是用來描述activity組件的運行上下文環(huán)境 的。調(diào)用這個Contextlmpl對象的成員函數(shù)init來執(zhí)行初始化Activity組件運行上下文環(huán) 境的工作,其中就包括創(chuàng)建用來訪問應用程序資源的Resources對象和AssetsManager對象 的工作。其中,Contextlmpl · init函數(shù)就定義在文件frameworks/base/core/ java/ android/app/Contextlmpl · java中。ContextImpl · init函數(shù)中的參數(shù)packagelnfo指向的 是一個loadedApk對象,這個loadedApk對象描述的是當前正在啟動組件所屬的Apk。用來訪 問應用程序資源的Resources對象是通過調(diào)用參數(shù)package Info所指向的是一個loadedApk 對象的成員函數(shù)getResources來創(chuàng)建的。由此可知,為了創(chuàng)建Resources對象,以提取或訪 問應用程序資源,如果出于訪問安裝包Apk中的資源的需要,本實施例還可以分別為應用中 的各組件構(gòu)建一個loadedAPK對象。
[0115]同理,適應具體的加殼安裝包的配置,根據(jù)需要,可以考慮對資源Resources類的 構(gòu)造函數(shù)中的成員變量mResource、mAssets進行修改,以在啟動各所述組件時通過所述 mResource、mAssets來調(diào)取相應的資源。
[0116] 同理,也可考慮對資源管理器AssetsManager中的AssetsPath函數(shù)進行修改,修改 后的所述AssetsPath函數(shù)指向所述目標應用程序安裝包中的資源文件(通常指assets), 以在啟動各所述組件時通過所述AssetsManager調(diào)取所述AssetsPath函數(shù)來獲取所述資源 文件中的對應資源。
[0117]其中,Re sources類的構(gòu)造函數(shù)定義在文件frameworks/base/core/java/ android/content/res/Resources · java中。因為Resources類的構(gòu)造函數(shù)將參數(shù)assets所 指向的一個AssetManager對象保存在成員變量mAssets中,即mAssets = assets,使得 Resources類的構(gòu)造函數(shù)可以通過mAssets來訪問應用程序的資源。因此,本實施例可通過 對資源類的構(gòu)造函數(shù)中的成員變量mAssets進行修改,來實現(xiàn)通過mAssets調(diào)取應用程序所 需的資源。誠然,上述實現(xiàn)方式也采用反射機制來實現(xiàn)。
[0118] 當然,本實施例還可對資源管理器AssetsManager中的AssetsPath函數(shù)進行修改, 如通過AssetsManager對象的成員函數(shù)addAssetsPath來添加指定的應用程序資源文件路 徑(如:路徑為/data/app/com.qihoo.box-1 .apk)到 AssetsPath函數(shù)中。由于 addAssetsPath是隱藏API我們無法直接調(diào)用,所以只能通過反射機制來實現(xiàn)。
[0119] 在本發(fā)明實施例中,還需要在加載模塊中實現(xiàn)類加載器,以加載各所述組件中的 相應加載類??刹捎萌缦路绞綄崿F(xiàn):一種方式是將所述應用程序的路徑添加到類加載器中 的路徑列表pathList中,構(gòu)造根據(jù)所述應用程序路徑查找加載類的類加載器;另一種方式 是對類加載器中的成員變量進行修改,構(gòu)造首先用super找加載類的類加載器。由于利用類 加載器動態(tài)加載應用程序的技術(shù)已為本領(lǐng)域技術(shù)人員所熟知,故此處僅給出示例性說明, 恕不贅述。
[0120] 在本發(fā)明另一實施例中,對于包名不同的上述過程與包名類似,但是:在程序運行 過程中,如前所述,需要考慮所述利用逆向規(guī)則來規(guī)避宿主應用程序與目標應用程序包名 差異的問題??梢詫⒛嫦蛞?guī)則實現(xiàn)為一個供調(diào)度的函數(shù),結(jié)合本發(fā)明所述的監(jiān)控模塊所實 現(xiàn)的有關(guān)資源重定向的方面,對相關(guān)可能涉及包名引用的調(diào)用指令進行監(jiān)控,當出現(xiàn)包名 引用時,便可調(diào)度前述利用逆向規(guī)則實現(xiàn)的函數(shù)來修改所引用的包名,從而使兩者建立一 一對應關(guān)系,實現(xiàn)資源的正常引用。這里所稱的調(diào)用的指令,也即監(jiān)控模塊利用鉤子函數(shù)所 掛鉤的指令,包括諸如startActivity、startService、loadClass、sentBroacast、 bindServer等。通常這些指令利用意圖即Intent進行參數(shù)傳遞,而Intent中包含對包名的 引用,這種情況下,鉤子函數(shù)即發(fā)揮其作用,對包名進行修改,使這些調(diào)用指令能夠調(diào)用到 正確的資源。例如,目標應用程序要調(diào)用其自身的一個Activity,在Intent中包含活動組件 (301]1.3口1^3〇1:;^丨7,通過8丨31^4〇1:;^;^7來調(diào)用,鉤子函數(shù)截獲這一調(diào)用指令,然后利用所述 逆向規(guī)則所實現(xiàn)的函數(shù),將其包名進行修改,對應到已經(jīng)注冊的活動組件 apphost.com.apk.activity,由此便可由宿主應用程序做進一步去反射調(diào)用目標應用程序 的相應組件。誠然,盡管包名不同,宿主應用程序在反射調(diào)用時,其進行類加載時,也會遵守 同一規(guī)則去調(diào)用正確的目標應用程序中的資源。以上也順便揭示了后續(xù)即將揭示的監(jiān)控模 塊所實現(xiàn)的一方面功能,故而后續(xù)有關(guān)監(jiān)控模塊的功能實現(xiàn)的介紹將被簡化。
[0121] 步驟120,由宿主應用程序調(diào)用監(jiān)控模塊,對目標應用程序的活動進行監(jiān)控。
[0122] 用戶可以通過本發(fā)明提供的沙箱應用程序下載并安裝該第三方應用而獲得所述 原安裝包,或者,也可由該沙箱應用程序從/data/app中獲取相應安裝包文件。對于已裝應 用,可以本發(fā)明處理完畢之后,誘導用戶卸載舊應用,安裝新應用。
[0123] 沙箱是一種按照安全策略限制程序行為的執(zhí)行環(huán)境,目前已經(jīng)廣泛實用于各種操 作系統(tǒng)中。
[0124] 解析應用程序的原安裝包的手段,為本領(lǐng)域技術(shù)人員所熟知。安裝包APK文件本質(zhì) 上是利用ZIP壓縮技術(shù)結(jié)合簽名技術(shù)實現(xiàn)的壓縮包,因此,一方面可以通過解壓技術(shù)釋放其 內(nèi)部文件,另一方面還可通過Apktool之類的工具軟件獲取其內(nèi)部文件(在這種情況下其代 碼文件會被反向為.smali文件)。本領(lǐng)域技術(shù)人員均能嫻熟地利用這些公知技術(shù)在一個給 定目錄中對原安裝包進行處理,從而獲得其中的內(nèi)部文件。需要強調(diào)的是,本發(fā)明所稱獲得 其內(nèi)部文件,推薦以公知的內(nèi)存操作的方式而獲得,而非指文件操作。
[0125] 作為一個沙箱實例,使目標應用程序運行于沙箱運行環(huán)境中,通常通過所述加載 模塊先于所述目標應用程序的反射調(diào)用而優(yōu)先調(diào)用監(jiān)控模塊
[0126] 在本發(fā)明實施例中,監(jiān)控模塊是沙箱運行環(huán)境的核心實現(xiàn)者,負責實現(xiàn)兩方面的 功能,一方面通過監(jiān)控目標應用程序?qū)Y源的訪問,對資源引用進行重定向,使目標應用程 序進程能夠?qū)崿F(xiàn)對正確資源的正常引用。具體而言,如果相關(guān)資源是被反射調(diào)用的原安裝 包的資源,則通過反射調(diào)用機制調(diào)用該原安裝包的資源供引用,實現(xiàn)重定向。如果是系統(tǒng)資 源或者指向宿主應用程序的已安裝資源,則可允許其默認引用保證其正常引用關(guān)系。如果 是I/O操作,也可以藉此進行重定向。例如,上述有關(guān)對目標應用程序的安裝包的資源進行 的引用,既可以通過對上述的AssetsManager的修改來實現(xiàn),也可以通過監(jiān)控具體調(diào)用資源