派生進程駐存方法、派生程序生成方法及相應的裝置的制造方法
【專利摘要】本發明公開一種派生程序生成方法,包括如下步驟:響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包;將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異于原始安裝包的新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬包名為所述的原包名的重設模塊;對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。此外,本發明還公開了一種派生進程駐存方法,以描述所述派生程序生成方法所生成的派生程序的運行控制技術。本發明以更為簡單的技術途徑實現了同時駐存原始程序及其副本的進程的方案,在遵守應用程序版權控制技術的前提下,破除了安卓系統的技術封鎖,改善了用戶體驗。
【專利說明】
派生進程駐存方法、派生程序生成方法及相應的裝置
技術領域
[0001] 本發明涉及信息安全技術領域,具體而言,本發明涉及一種派生進程駐存方法及 其相應的裝置,同時涉及與所述派生進程相應的一種派生程序生成方法及其相應的裝置。
【背景技術】
[0002] Android系統已經廣泛應用于各種移動終端,其Linux基因使其安全性得到初步保 障,但也帶來不便。Android對進程的管理,以包名為單位,每個應用程序分配一個唯一性的 包名,因而,一個應用程序通常不能在Android中實現雙進程運行,也就是說,一個應用程序 只能獲得一個虛擬機,而不能同時獲得兩個虛擬機。也因此,現實中移動終端上的應用程序 一般是以單賬號的形式進行用戶交互的,用戶如果想要在同一應用程序中登錄兩個賬號, 以開發者提供的應用程序固有的功能而言,是無法滿足這一需求的。
[0003] 現有技術中,業內通過Android底層機制,實現了替代方案。具體而言,通過構造自 有的孵化器(如命名為newZygote)來接管安卓系統原始的孵化器(Zygote)的服務。應用程 序首次啟動時,由newZygote按照正常啟動邏輯處理,為其按傳統方式構建虛擬機;后續再 次啟動時,newZygote便可為該應用程序的建構副本虛擬機,并且解決其他諸如重定向的問 題。這種情況下,能夠深層次解決進程副本與原始進程共同駐存的問題,并且,兩個進程彼 此并行不悖,更優的,系統只需安裝一次原始程序,便可實現雙開的目的。然而,這種方式顯 然大大增加了技術實現的難度,尤其是在底層實現的編程問題上,開發者需要考慮到諸如 資源重定向、包管理服務欺騙,活動組件鑒權等問題,程序實現難度大,出錯機率高。一旦應 用程序的版本出現更迭,還容易因應用程序的資源調度設計而引發潛在的問題,導致雙開 的目的不能得到很好的滿足。
【發明內容】
[0004] 本發明的一個目的在于針對以上存在的至少一方面不足,提供一種派生程序生成 方法及其相應的裝置,以簡單易實現的方式為相同應用程序的雙份開啟提供技術實現基 礎。
[0005] 本發明的另一目的在于針對以上存在的至少一方面不足,提供一種派生進程駐存 方法及其相應的裝置,以便使得所述派生進程得以有效地駐存在系統進程列表中得以運 行,即使與原始進程同時駐存也能與之并行不悖。
[0006] 為了實現該目的,本發明采取如下技術方案:
[0007] 本發明提供的一種派生程序生成方法,包括如下步驟:
[0008] 響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包;
[0009] 將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異于原始安裝包的 新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬包名為所述 的原包名的重設模塊;
[0010]對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。
[0011] 具體的,所述的原始程序安裝包存儲于系統應用安裝目錄或者第三方應用安裝目 錄。
[0012] 進一步,所述重設模塊被配置為在運行階段通過掛鉤其所在的派生程序的進程的 包名獲取函數,向該包名獲取函數返回所述的原包名。
[0013] 根據本發明的一個實施例所揭示,所述包名獲取函數為用于返回當前進程所屬的 包名的函數:getPackageName()。
[0014] 具體的,所述的鏡像中包含有Androidmanifest .xml文件,該文件中所述原始安裝 包的包名被替換為所述的新包名。
[0015] 較佳的,所述的鏡像中的資源文件中的快捷圖標一并被部分修改,以使所述派生 程序安裝后形成的快捷圖標部分地區別于所述原始程序的快捷圖標。
[0016] 本發明提供的一種派生程序生成裝置,包括:
[0017]確定模塊,用于響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包;
[0018] 裝配模塊,用于將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異 于原始安裝包的新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身 所屬包名為所述的原包名的重設模塊;
[0019] 封裝模塊,用于對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。
[0020] 具體的,所述的原始程序安裝包存儲于系統應用安裝目錄或者第三方應用安裝目 錄。
[0021] 進一步,所述重設模塊被配置為在運行階段通過掛鉤其所在的派生程序的進程的 包名獲取函數,向該包名獲取函數返回所述的原包名。
[0022] 根據本發明的一個實施所揭示,所述包名獲取函數為用于返回當前進程所屬的包 名的函數:getPackageName()。
[0023]具體的,所述的鏡像中包含有Androidmanifest .xml文件,該文件中所述原始安裝 包的包名被替換為所述的新包名。
[0024] 較佳的,所述的鏡像中的資源文件中的快捷圖標一并被部分修改,以使所述派生 程序安裝后形成的快捷圖標部分地區別于所述原始程序的快捷圖標。
[0025] 本發明提供的一種派生進程駐存方法,包括如下步驟:
[0026]響應于用戶運行指令,運行已安裝的根據前一目的任意一種方案所述的派生程序 以啟動所述的派生進程;
[0027] 響應于所述派生進程獲取其自身包名的請求指令,接受其預置的重設模塊的調用 而執行用于重新確定派生進程的包名的解析函數;
[0028] 由該解析函數向重設模塊傳遞與所述派生程序相對應的原始程序的原包名以返 回給所述的請求指令以確保派生進程得以運行。
[0029] 具體的,所述派生程序具有的新包名不同于所述原始程序所具有的原包名,而所 述派生程序安裝包完全包含所述原始程序安裝包的部分文件。
[0030] 較佳的,所述派生進程與所述原始程序運行時的原始進程共同駐存于進程列表 中。
[0031] 進一步,所述用戶運行指令是指針對應用程序列表上關聯于所述派生程序的快捷 圖標的觸控指令,所述快捷圖標與所述原始程序安裝后形成的快捷圖標存在部分差異。
[0032] 根據本發明的一種實施例所揭示,所述派生進程獲取其自身包名的指令為 getPackageNameO包名獲取函數,當即將調用該包名獲取函數時,所述重設模塊調用所述 的解析函數,從而獲得所述原包名作為該包名獲取函數的結果返回。
[0033] 較佳的,所述原始程序及派生程序均安裝于系統安裝目錄或者第三方應用目錄 中。
[0034]具體的,所述原始程序及所述派生程序分別獲得一個彼此相互獨立的虛擬機。 [0035] -種派生進程駐存裝置,其特征在于,包括:
[0036]啟動單元,用于響應于用戶運行指令,運行已安裝的根據前一目的任意一種方案 所述的派生程序以啟動所述的派生進程;
[0037] 調用單元,用于響應于所述派生進程獲取其自身包名的請求指令,接受其預置的 重設模塊的調用而執行用于重新確定派生進程的包名的解析函數;
[0038] 返回單元,被配置為由該解析函數向重設模塊傳遞與所述派生程序相對應的原始 程序的原包名以返回給所述的請求指令以確保派生進程得以運行。
[0039] 具體的,所述派生程序具有的新包名不同于所述原始程序所具有的原包名,而所 述派生程序安裝包完全包含所述原始程序安裝包的部分文件。
[0040] 較佳的,所述派生進程與所述原始程序運行時的原始進程共同駐存于進程列表 中。
[0041] 進一步,所述用戶運行指令是指針對應用程序列表上關聯于所述派生程序的快捷 圖標的觸控指令,所述快捷圖標與所述原始程序安裝后形成的快捷圖標存在部分差異。
[0042] 根據本發明的一種實施例所揭示,所述派生進程獲取其自身包名的指令為 getPackageNameO包名獲取函數,當即將調用該包名獲取函數時,所述重設模塊調用所述 的解析函數,從而獲得所述原包名作為該包名獲取函數的結果返回。
[0043] 較佳的,所述原始程序及派生程序均安裝于系統安裝目錄或者第三方應用目錄 中。
[0044] 具體的,所述原始程序及所述派生程序分別獲得一個彼此相互獨立的虛擬機。
[0045] 與現有技術相比較,本發明至少具有如下優點:
[0046] -方面,本發明通過對原始程序實施反向工程,獲得其鏡像文件,在鏡像區中對其 中的各種文件進行修改,將原包名替換為新包名,并且植入可以用于獲得原包名的重設模 塊,由此而生成的派生程序,當其安裝后,便可被區別于原始程序進程而獲得新的獨立的進 程空間,從而得以正常運行。
[0047] 另一方面,當本發明的所述派生程序被控制運行之后,系統視其新包名不同于原 包名,即可為其分配虛擬機,即使原始進程已經駐存于進程列表也不影響其實現。在派生進 程運行的過程中,一旦派生進程依照原有程序控制邏輯需要獲得獲取自身包名,由于該派 生進程中包含有在生成派生程序過程中便植入的重設模塊,而該重設模塊將告訴派生進程 相關調用以原包名,這樣,派生進程自身的鑒權過程獲得通過,只要派生進程的外在運行環 境得以健康維護,則派生進程自身的鑒權機制便無礙于其正常運行,使得派生進程與原生 進程可以并行不悖地在同一系統中運行,滿足用戶利用原始程序和派生程序同時登錄同一 賬戶體系的兩個賬戶的目的。
[0048] 進一步,本發明通過構造派生程序來實現應用程序雙開的目的,雖然需要既安裝 原始程序又安裝派生程序,但明顯比現有技術的簡化了技術難度,而構造所述的派生程序 的過程對用戶基本透明,并且可以快速地完成,因而,基本無礙于用戶體驗,可見,本發明以 較低實現成本解決了 Android系統下程序雙開的技術問題。
[0049]概括而言,本發明的實施,使系統Android系統具備了同時運行任意應用程序及其 副本的功能。然而,書不盡言,本發明附加的方面和優點將在下面的描述中部分給出,這些 將從下面的描述中變得明顯,或通過本發明的實踐了解到。
【附圖說明】
[0050] 本發明上述的和/或附加的方面和優點從下面結合附圖對實施例的描述中將變得 明顯和容易理解,其中:
[0051] 圖1為本發明的一種派生程序生成方法的流程示意圖;
[0052]圖2為本發明的一種派生進程駐存方法的流程示意圖;
[0053]圖3為本發明的一種派生程序生成裝置的結構原理圖;
[0054]圖4為本發明的一種派生進程駐存裝置的結構原理圖。
【具體實施方式】
[0055] 下面詳細描述本發明的實施例,所述實施例的示例在附圖中示出,其中自始至終 相同或類似的標號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附 圖描述的實施例是示例性的,僅用于解釋本發明,而不能解釋為對本發明的限制。
[0056] 本技術領域技術人員可以理解,除非特意聲明,這里使用的單數形式"一"、"一 個"、"所述"和"該"也可包括復數形式。應該進一步理解的是,本發明的說明書中使用的措 辭"包括"是指存在所述特征、整數、步驟、操作、元件和/或組件,但是并不排除存在或添加 一個或多個其他特征、整數、步驟、操作、元件、組件和/或它們的組。應該理解,當我們稱元 件被"連接"或"耦接"到另一元件時,它可以直接連接或耦接到其他元件,或者也可以存在 中間元件。此外,這里使用的"連接"或"親接"可以包括無線連接或無線耦接。這里使用的措 辭"和/或"包括一個或更多個相關聯的列出項的全部或任一單元和全部組合。
[0057]本技術領域技術人員可以理解,除非另外定義,這里使用的所有術語(包括技術術 語和科學術語),具有與本發明所屬領域中的普通技術人員的一般理解相同的意義。還應該 理解的是,諸如通用字典中定義的那些術語,應該被理解為具有與現有技術的上下文中的 意義一致的意義,并且除非像這里一樣被特定定義,否則不會用理想化或過于正式的含義 來解釋。
[0058]本技術領域技術人員可以理解,這里所使用的"終端"、"終端設備"既包括無線信 號接收器的設備,其僅具備無發射能力的無線信號接收器的設備,又包括接收和發射硬件 的設備,其具有能夠在雙向通信鏈路上,進行雙向通信的接收和發射硬件的設備。這種設備 可以包括:蜂窩或其他通信設備,其具有單線路顯示器或多線路顯示器或沒有多線路顯示 器的蜂窩或其他通信設備;PCS(Personal Communications Service,個人通信系統),其可 以組合語音、數據處理、傳真和/或數據通信能力;PDA(Personal Digital Assistant,個人 數字助理),其可以包括射頻接收器、尋呼機、互聯網/內聯網訪問、網絡瀏覽器、記事本、日 歷和/或GPS(Global Positioning System,全球定位系統)接收器;常規膝上型和/或掌上 型計算機或其他設備,其具有和/或包括射頻接收器的常規膝上型和/或掌上型計算機或其 他設備。這里所使用的"終端"、"終端設備"可以是便攜式、可運輸、安裝在交通工具(航空、 海運和/或陸地)中的,或者適合于和/或配置為在本地運行,和/或以分布形式,運行在地球 和/或空間的任何其他位置運行。這里所使用的"終端"、"終端設備"還可以是通信終端、上 網終端、音樂/視頻播放終端,例如可以是PDA、MID(Mobile Internet Device,移動互聯網 設備)和/或具有音樂/視頻播放功能的移動電話,也可以是智能電視、機頂盒等設備。
[0059]本領域技術人員應當理解,本發明所稱的"應用"、"應用程序"、"應用軟件"、"程 序"以及采用類似表述的概念,是業內技術人員所公知的相同概念,是指由一系列計算機指 令及相關數據資源有機構造的適于電子運行的計算機軟件。除非特別指定,這種命名本身 不受編程語言種類、級別的限制,也不受其賴以運行的操作系統或平臺所限制。理所當然 地,此類概念也不受任何形式的終端所限制。
[0060]為了說明本發明的實施,本發明將試圖結合計算機程序的靜態和動態兩個方面進 行描述,所謂靜態方面,是指程序安裝包、文件、數據庫等存儲于媒介的存儲對象;所謂動態 方面,是指被調入內存中執行的動態對象,包括但不局限于進程、線程、所用到的數據等。鑒 于計算機軟件技術的這些特點,不應將本發明所述及的各個方法、步驟、子步驟、裝置、單 元、模塊等,孤立地理解為僅靜態或僅動態的方面,本領域技術人員對此應當知曉。故而,本 領域技術人員應當能夠依據本發明有關靜態的表述而將其對應到動態的進程活動,或者依 據本發明有關動態的進程活動對應到其靜態的表現形式,建立起靜態與動態兩方面的必然 性關聯,以此為基礎來理解本發明。
[0061 ] 本領域技術人員應當知曉,本發明可以免經Root提權而在以Android為基礎實現 的操作系統上實施,提權操作只是Android系統所實施的權限管理控制,因而,本發明也當 然地適用于已經Roo t提權的Andr 〇 i d操作系統中實施。
[0062] 如前所述,Android體系中,由于限定了包名不得重復的規則,因而,同一應用程序 只能開啟一個進程。本發明中,基于某個已知的應用程序(原始程序),通過為該應用程序制 作副本(派生程序),使該應用程序原件及其副本均可以啟動自身進程,使兩個進程具有同 時駐存在內存中的能力。該應用程序原件所占用的進程稱為原始進程,而該應用程序副本 所占據的進程則為本發明所稱的派生進程。由此,本發明可以分解為兩大任務,其一是提供 用于制作所述應用程序的副本的派生程序生成方法和裝置,其二是提供用于運行所述應用 程序副本的派生進程駐存方法和裝置。以下,本發明將先后詳細介紹上述兩大任務的具體 實現方式:
[0063] 作為本發明的首要任務所要提供的一種派生程序生成方法,請參閱圖1所示,該方 法包括如下步驟:
[0064] 步驟S11、響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包。
[0065] 為便于執行本步驟,系統將提供一個控制選項開放給用戶進行選定,由用戶選定 一個指向所述原始程序的標識(如圖標),當用戶選定一個需要生成派生程序的原始程序之 后,便釋放所述的用戶操作指令,以便實現對該原始程序的確定操作,以便以此為基礎啟動 為該原始程序生成派生程序的后續作業。這種情況更適合于所述原始程序已經完成安裝的 情況。
[0066] 另一種方式是提供一個設置開關,當用戶將該設置開關切換為某個或某些應用程 序生成派生程序時,便釋放所述的用戶操作指令,啟動為所述的某個或某些原始程序生成 相對應的派生程序的后續作業。
[0067] 尚有其余的方式,例如,針對目前的應用商店通常只允許下載未安裝到本機的應 用程序這一缺陷,在應用商店場景中,允許用戶下載已經安裝到本機的應用程序,當用戶選 定該應用程序后,本發明實現在該應用商店中的處理進程便釋放所述的用戶操作指令,以 便啟動本發明的后續作業。
[0068] 可以看出,以上多種方式和場景均可釋放所述的用戶操作指令,本步驟便可響應 于該用戶操作指令,確定需要生成派生程序的原始程序安裝包。原始程序安裝包,對于系統 應用程序,通常安裝在/system/app這一系統應用安裝目錄下,而第三方應用程序,通常則 安裝在/data/app這一第三方應用安裝目錄下,該些目錄存儲相應的APK文件,通過讀取該 APK文件便獲得相應的安裝包,而獲得該安裝包,便完成了原始程序的確定過程。
[0069] 步驟S12、將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異于原始 安裝包的新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬包 名為所述的原包名的重設模塊。
[0070] 在前獲得的所述安裝包,需要在本步驟中執行解析和處理。具體而言,可以采取如 下具體步驟實現之:
[0071] 步驟S121:將具有原包名的原始安裝包反向為安裝包鏡像:
[0072] 解析原始程序的原始安裝包的手段,也是對原始安裝包進行反向的過程。安裝包 APK文件本質上是利用ZIP壓縮技術結合簽名技術實現的壓縮包,因此,一方面可以通過解 壓技術釋放其內部文件,另一方面還可通過Apktool之類的工具軟件獲取其內部文件(在這 種情況下其代碼文件會被反向為.smal i文件)。本領域技術人員均能嫻熟地利用這些公知 技術在一個給定目錄中對原安裝包進行處理,從而通過內存操作(非文件操作)的方式來獲 得其中的內部文件。反向所得的這些文件,也就構成所述派生程序的派生安裝包的鏡像。 [0073] Android安裝包的內部文件的結構性規范,參閱下表所示:
[0074]表1 APK文件內部的文件結構
[0076]本發明通過解析所述原始程序的安裝包,可以獲得與表中所附的目錄和文件相對 應的反向后文件,在此基礎上,可以對相關文件進行后續處理。當然,誠如前述,當反向后的 文件格式為· smali時,如對代碼文件進行修改,應是在· smali文件的基礎上進行的。被修改 后的鏡像一旦重構為新的安裝包,仍然會還原成符合上述規范的結構。
[0077] 眾所周知的,一個APK安裝包具有唯--個包名,該包名出現在安裝包的多處,較 為直觀的,可以直接從其配置文件即Androidmanif est. xml的聲明項中找到。本領域技術人 員均知曉此一原理,恕不贅述。
[0078]步驟S122:為該鏡像配置異于原始安裝包的新包名:
[0079] 安裝包結構所列的Androidmanifest .xml文件,是安裝包中較為重要的全局配置 文件,其負責向系統注冊Android系統的四大組件,以及向系統申請權限等,同時,該文件還 聲明了其自身包名,具體而言,其中的聲明代碼以如下的形式存在:
[0080] 〈manifest xmlns:android = 〃http://schemas·android·com/apk/res/android〃 android: sharedUserld =''android .uid. system"
[0081] package = ' 'com·android·oldpackage">
[0082] 除此之外,依照Android的規范,安裝包的文件名同于其包名的標識符,也即,如具 有上述聲明內容的安裝包的文件名適宜命名為:〇ldpackage.apk。
[0083] 鑒于上述的事實,本步驟從所述的鏡像中訪問所述的配置文件,修改其原包名為 新包名,如下:
[0084] 〈manifest xmlns:android = ^http://schemas.android.com/apk/res/android^ android: sharedUserld = ''android · uid · system"
[0085] package = ' 'com·android·newpackage〃>
[0086] 同理,作為附帶手段,可以在后續將由該鏡像生成的派生安裝包的文件名修改為 對應的名稱:newpackage · apk。
[0087] 步驟S123:向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬 包名為所述的原包名的重設模塊:
[0088] 由于原始程序通常具有自我防偽的功能,內植了用于確定自身包名是否被修改的 相關功能模塊,一旦得以運行并獲知當前包名并非原包名時,便自動終止或退出運行,因 此,除修改包名之外,本步驟中,還向該鏡像植入一重設模塊。通常,調用Android的上下文 context類中的getPackageName()用于獲取當前進程的包名。
[0089]該重設模塊可以是.so代碼段,以注入的方式隨派生程序進程啟動,以Η00Κ技術為 手段,攔截需要征詢其自身包名的指令,也即所述的getPackageName()函數,轉而執行自身 的代碼,使得最終由該重設模塊告知派生程序的進程一個偽造的事實,讓該派生進程獲知 并誤以為其自身包名為所述的原包名,而非所述的新包名,從而完成其內部鑒權過程,使派 生進程得以順利運行。
[0090] 這里所稱的Η00Κ技術,通常也稱為掛鉤技術,利用鉤子函數對相關調用指令的入 口點進行監視,截獲此一調用指令,轉向執行相應的鉤子函數,因此,所述的重設模塊實質 上也是一個鉤子函數。所述的鉤子函數當然可以將數據預存在特定位置,也可以通過與其 他進程通信來獲取相關數據,因而,所述的原包名,在本發明中可以預先被存儲在一個表格 中,建立起其與原包名之間的對應關系,這樣重設模塊運行時便可以直接從該表格中查詢 獲得原包名。該表格也可交由某安全程序維護,而由重設模塊在需要獲知原包名時,提供派 生程序的新包名,調用該安全程序的接口,由該安全程序依據新包名而向重設模塊返回原 包名而解決上述的問題。
[0091] 當然,從形式上,所述重設模塊可以是一體化地,集成了控制和依據所述新包名解 析為原包名的功能的;也可以是將其控制功能獨立,而將其解析功能獨立為一個解析函數 來調用。后一情況下,所述的解析函數便可置于前文的安全程序中,當然也可仍存在于派生 程序中。
[0092] 這里需要補充的是:術語"鉤子"涵蓋了用于通過攔截在軟件組件之間傳遞的函數 調用、消息、或事件來改變或增加操作系統、應用程序、或其他軟件組件的行為的技術。而處 理這種被攔截的函數調用、事件或消息的代碼就被稱為鉤子hook函數。鉤子通常用于各種 目標,包括對功能進行調試和對功能進行擴展。其示例可以包括在鍵盤或鼠標事件傳遞到 應用程序之前攔截它們,或者攔截系統調用(system call)、或者系統函數行為、函數執行 結果等,以監視或修改應用程序或其他組件的功能等等。
[0093] 當前述的各個具體步驟得以運行,便完成了對所述原始程序的鏡像的改造,從而 使其具備了當其成為派生程序后與原始程序共同駐存的能力。
[0094] 需要指出的是,應用程序的快捷圖標一般保存在所述Res目錄中,為了使派生程序 和應用程序具有適度的視覺區分作用,本步驟中,可以一并修改原始安裝包中的快捷圖標, 使其一部分平面區域異于原圖標,而另一部分平面區域同于原圖標;或者使兩個圖標呈現 色域上的差異等,總之使派生程序所用快捷圖標和原始程序所用的快捷圖標之間呈現部分 區別,以便利于用戶進行視角鑒別。
[0095]步驟S13、對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。
[0096] 準備好上述的包名處理后,本發明進一步將上述鏡像進行重新打包,打包后再行 簽名,即完成所述加殼安裝包的構造。作為附帶措施,如果重新打包后的派生安裝包的文件 名不同于所述的新包名(視打包工具而定),則將派生程序安裝包的文件名修改為與其新包 名標識相匹配的新文件名,如前述的newpackage · apk。
[0097] 如前所述,本發明的實施場景之一,未獲Root權限,因此,這種場景中,并不能通過 本發明實現靜默安裝。這種情況下,本發明優先通過調用系統安裝器,以啟動安裝界面,指 導用戶完成該派生程序的安裝。反之,如已獲Root權限,則可徑行安裝。
[0098] 安裝后,本發明的派生程序便存在于應用程序列表中,用戶可以同時開啟所述的 原始程序和派生程序,兩者各自的進程可以同時駐存在系統的內存中,并行不悖。
[0099] 作為本發明的另一任務所要提供的一種派生進程駐存方法,其以前述的派生程序 為基礎,請參閱圖2所示,該方法包括如下步驟:
[0100] 步驟S21、響應于用戶運行指令,運行已安裝的根據本發明所述的派生程序生成方 法的任意實例所構造的派生程序以啟動所述的派生進程;
[0101] 如前所述,所述派生程序安裝后,其快捷圖標(按照前述,該快捷圖標可以在形狀 上與原始程序安裝后形成的快捷圖標存在部分差異)便可以出現在應用列表中,而無論其 是否安裝在系統應用安裝目錄還是第三方應用安裝目錄,因而,用戶可以對其施加觸控操 作,從而產生用戶運行指令,導致執行本步驟,進而便開始啟動該派生程序,依照Android虛 擬機機制原來,經由AMS、PMS向Zygote申請孵化虛擬機,構造進程空間,以便形成相應的派 生進程,使派生程序在該虛擬機中運行。這種情況下,不必理會所述的原始程序的進程是否 已經擁有一個獨立的虛擬機,原始進程與派生進程各自將獲得一個彼此相互獨立的虛擬機 進行運行。
[0102] 步驟S22、響應于所述派生進程獲取其自身包名的請求指令,接受其預置的重設模 塊的調用而執行用于重新確定派生進程的包名的解析函數;
[0103] 如前所述,派生程序的開發者一般都會預置獲取自身包名的驗證指令,這種情況 下,一旦派生進程得以運行,便會喚起其驗證指令。當然,驗證指令也可能出現在派生進程 運行過程中的任何階段。由于所述派生程序具有的新包名不同于所述原始程序所具有的原 包名,而所述派生程序安裝包完全包含所述原始程序安裝包的部分文件,因此,需要依賴于 所述的重設模塊進行后續處理。不管如何,一旦派生進程得以運行,當其即將調用 getPackageName()這一包名獲取函數以其征詢自身包名時,將優先喚起所述預置的重設模 塊,最終將由該重設模塊與所述的解析函數相配合,返回當前進程(派生進程)的包名為所 述的原包名的結果。
[0104] 步驟S23、由該解析函數向重設模塊傳遞與所述派生程序相對應的原始程序的原 包名以返回給所述的請求指令以確保派生進程得以運行。
[0105] 所述的解析函數,其在本質上是對所述重設模塊的功能的靈活變通,一方面,可以 將該解析函數與重設模塊以代碼的形式一體化存在于所述原始程序中,在派生進程運行過 程中隨時便捷調用;另一方面,則可以將其實現于其他程序的后臺進程中,通過預規范的接 口由重設模塊進行調用。所述解析函數的功能,正是為了集中所述重設模塊的欺騙功能,也 即是由該解析函數依據當前進程的新包名,去預存的數據中查詢其對應的原包名,繼而在 重設模塊與解析函數的配合下,向派生程序進程原請求指令邏輯返回當前包名為所述原包 名(如前述的oldPackage)的欺騙信息,令派生程序進程信以為真,從而實現欺騙的目的,避 開派生程序既有的鑒權邏輯。據此,派生進程便具備了與所述原始進程共同運行的能力,一 旦原始進程和派生進程同時運行,可以發現,兩者將同時駐存于系統的進程列表中。
[0106] 由此可見,當派生程序安裝并被運行之后,依靠其自身預置的技術能力,運行所述 重設模塊,便可使其自身具備駐存于系統進程列表的能力,當所述原始進程同時存在于內 存時,兩個進程也能并行不悖地各自完成自身工作。
[0107] -個典型的應用場景中,用戶可以同時運行兩個諸如"微信"這樣的應用程序,兩 個"微信"進程分別用于登錄不同的賬號,并且并行不悖地與外界進行通信,甚至兩個不同 賬號之間也可直接進行通信。
[0108] 同理,基于計算機軟件的模塊化思維,也為呼應前述兩大任務所提出的方法,本發 明還提供了兩種裝置,將分別在下方揭示。
[0109] 本發明提供的一種派生程序生成裝置,請參閱圖3所示,該裝置包括確定模塊11、 裝配模塊12以及封裝模塊13,各模塊所具備的功能如下所述:
[0110] 所述的確定模塊11,用于響應于用戶操作指令,確定需要生成派生程序的原始程 序安裝包。
[0111] 為便于運行本確定模塊11,系統將提供一個控制選項開放給用戶進行選定,由用 戶選定一個指向所述原始程序的標識(如圖標),當用戶選定一個需要生成派生程序的原始 程序之后,便釋放所述的用戶操作指令,以便實現對該原始程序的確定操作,以便以此為基 礎啟動為該原始程序生成派生程序的后續作業。這種情況更適合于所述原始程序已經完成 安裝的情況。
[0112] 另一種方式是提供一個設置開關,當用戶將該設置開關切換為某個或某些應用程 序生成派生程序時,便釋放所述的用戶操作指令,啟動為所述的某個或某些原始程序生成 相對應的派生程序的后續作業。
[0113] 尚有其余的方式,例如,針對目前的應用商店通常只允許下載未安裝到本機的應 用程序這一缺陷,在應用商店場景中,允許用戶下載已經安裝到本機的應用程序,當用戶選 定該應用程序后,本發明實現在該應用商店中的處理進程便釋放所述的用戶操作指令,以 便啟動本發明的后續作業。
[0114] 可以看出,以上多種方式和場景均可釋放所述的用戶操作指令,確定模塊11便可 響應于該用戶操作指令,確定需要生成派生程序的原始程序安裝包。原始程序安裝包,對于 系統應用程序,通常安裝在/system/app這一系統應用安裝目錄下,而第三方應用程序,通 常則安裝在/data/app這一第三方應用安裝目錄下,該些目錄存儲相應的APK文件,通過讀 取該APK文件便獲得相應的安裝包,而獲得該安裝包,便完成了原始程序的確定過程。
[0115]所述的裝配模塊12,用于將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡 像配置異于原始安裝包的新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進 程其自身所屬包名為所述的原包名的重設模塊。
[0116]在前獲得的所述安裝包,需要在裝配模塊中執行解析和處理。具體而言,可以采取 如下具體步驟實現之:
[0117] 步驟S121:將具有原包名的原始安裝包反向為安裝包鏡像:
[0118] 解析原始程序的原始安裝包的手段,也是對原始安裝包進行反向的過程。安裝包 APK文件本質上是利用ZIP壓縮技術結合簽名技術實現的壓縮包,因此,一方面可以通過解 壓技術釋放其內部文件,另一方面還可通過Apktool之類的工具軟件獲取其內部文件(在這 種情況下其代碼文件會被反向為.smal i文件)。本領域技術人員均能嫻熟地利用這些公知 技術在一個給定目錄中對原安裝包進行處理,從而通過內存操作(非文件操作)的方式來獲 得其中的內部文件。反向所得的這些文件,也就構成所述派生程序的派生安裝包的鏡像。
[0119] Android安裝包的內部文件的結構性規范,參閱下表所示:
[0120] 表1 APK文件內部的文件結構
[0123] 本發明通過解析所述原始程序的安裝包,可以獲得與表中所附的目錄和文件相對 應的反向后文件,在此基礎上,可以對相關文件進行后續處理。當然,誠如前述,當反向后的 文件格式為· smali時,如對代碼文件進行修改,應是在· smali文件的基礎上進行的。被修改 后的鏡像一旦重構為新的安裝包,仍然會還原成符合上述規范的結構。
[0124] 眾所周知的,一個APK安裝包具有唯--個包名,該包名出現在安裝包的多處,較 為直觀的,可以直接從其配置文件即Androidmanifes t.xml的聲明項中找到。本領域技術 人員均知曉此一原理,恕不贅述。
[0125] 步驟S122:為該鏡像配置異于原始安裝包的新包名:
[0126] 安裝包結構所列的Androidmanifest .xml文件,是安裝包中較為重要的全局配置 文件,其負責向系統注冊Android系統的四大組件,以及向系統申請權限等,同時,該文件還 聲明了其自身包名,具體而言,其中的聲明代碼以如下的形式存在:
[0127] 〈manifest xmlns: android =''http://schemas.android.com/apk/res/android" android: sharedUserld = ''android · uid · system"
[0128] package = ' 'com.android.oldpackage">
[0129] 除此之外,依照Android的規范,安裝包的文件名同于其包名的標識符,也即,如具 有上述聲明內容的安裝包的文件名適宜命名為:〇ldpackage.apk。
[0130] 鑒于上述的事實,本步驟從所述的鏡像中訪問所述的配置文件,修改其原包名為 新包名,如下:
[0131] 〈manifest xmlns:android=〃http://schemas.android·com/apk/res/android〃 android: sharedUserld = ''android · uid · system"
[0132] package= / 'com·android·newpackage〃>
[0133] 同理,作為附帶手段,可以在后續將由該鏡像生成的派生安裝包的文件名修改為 對應的名稱:newpackage · apk。
[0134] 步驟S123:向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬 包名為所述的原包名的重設模塊:
[0135] 由于原始程序通常具有自我防偽的功能,內植了用于確定自身包名是否被修改的 相關功能模塊,一旦得以運行并獲知當前包名并非原包名時,便自動終止或退出運行,因 此,除修改包名之外,本步驟中,還向該鏡像植入一重設模塊。通常,調用Android的上下文 context類中的getPackageName()用于獲取當前進程的包名。
[0136] 該重設模塊可以是.so代碼段,以注入的方式隨派生程序進程啟動,以Η00Κ技術為 手段,攔截需要征詢其自身包名的指令,也即所述的getPackageName()函數,轉而執行自身 的代碼,使得最終由該重設模塊告知派生程序的進程一個偽造的事實,讓該派生進程獲知 并誤以為其自身包名為所述的原包名,而非所述的新包名,從而完成其內部鑒權過程,使派 生進程得以順利運行。
[0137] 這里所稱的Η00Κ技術,通常也稱為掛鉤技術,利用鉤子函數對相關調用指令的入 口點進行監視,截獲此一調用指令,轉向執行相應的鉤子函數,因此,所述的重設模塊實質 上也是一個鉤子函數。所述的鉤子函數當然可以將數據預存在特定位置,也可以通過與其 他進程通信來獲取相關數據,因而,所述的原包名,在本發明中可以預先被存儲在一個表格 中,建立起其與原包名之間的對應關系,這樣重設模塊運行時便可以直接從該表格中查詢 獲得原包名。該表格也可交由某安全程序維護,而由重設模塊在需要獲知原包名時,提供派 生程序的新包名,調用該安全程序的接口,由該安全程序依據新包名而向重設模塊返回原 包名而解決上述的問題。
[0138] 當然,從形式上,所述重設模塊可以是一體化地,集成了控制和依據所述新包名解 析為原包名的功能的;也可以是將其控制功能獨立,而將其解析功能獨立為一個解析函數 來調用。后一情況下,所述的解析函數便可置于前文的安全程序中,當然也可仍存在于派生 程序中。
[0139] 這里需要補充的是:術語"鉤子"涵蓋了用于通過攔截在軟件組件之間傳遞的函數 調用、消息、或事件來改變或增加操作系統、應用程序、或其他軟件組件的行為的技術。而處 理這種被攔截的函數調用、事件或消息的代碼就被稱為鉤子hook函數。鉤子通常用于各種 目標,包括對功能進行調試和對功能進行擴展。其示例可以包括在鍵盤或鼠標事件傳遞到 應用程序之前攔截它們,或者攔截系統調用(system call)、或者系統函數行為、函數執行 結果等,以監視或修改應用程序或其他組件的功能等等。
[0140] 當前述的各個具體步驟得以運行,便完成了對所述原始程序的鏡像的改造,從而 使其具備了當其成為派生程序后與原始程序共同駐存的能力。
[0141] 需要指出的是,應用程序的快捷圖標一般保存在所述Res目錄中,為了使派生程序 和應用程序具有適度的視覺區分作用,本裝配模塊12可以一并修改原始安裝包中的快捷圖 標,使其一部分平面區域異于原圖標,而另一部分平面區域同于原圖標;或者使兩個圖標呈 現色域上的差異等,總之使派生程序所用快捷圖標和原始程序所用的快捷圖標之間呈現部 分區別,以便利于用戶進行視角鑒別。
[0142] 所述的封裝模塊13,用于對所述鏡像進行重新打包簽名形成所述的派生程序并安 裝之。
[0143] 準備好上述的包名處理后,本發明進一步將上述鏡像進行重新打包,打包后再行 簽名,即完成所述加殼安裝包的構造。作為附帶措施,如果重新打包后的派生安裝包的文件 名不同于所述的新包名(視打包工具而定),則將派生程序安裝包的文件名修改為與其新包 名標識相匹配的新文件名,如前述的newpackage · apk。
[0144] 如前所述,本發明的實施場景之一,未獲Root權限,因此,這種場景中,并不能通過 本發明實現靜默安裝。這種情況下,本發明優先通過調用系統安裝器,以啟動安裝界面,指 導用戶完成該派生程序的安裝。反之,如已獲Root權限,則可徑行安裝。
[0145]安裝后,本發明的派生程序便存在于應用程序列表中,用戶可以同時開啟所述的 原始程序和派生程序,兩者各自的進程可以同時駐存在系統的內存中,并行不悖。
[0146] 作為本發明的另一任務所要提供的一種派生進程駐存裝置,其以前述的派生程序 為基礎,請參閱圖4所示,該裝置包括啟動單元21、調用單元22以及返回單元23,各單元所實 現的功能揭示如下:
[0147] 所述的啟動單元21,用于響應于用戶運行指令,運行已安裝的根據本發明所述的 派生程序生成方法或裝置的任意實例所構造的派生程序以啟動所述的派生進程。
[0148] 如前所述,所述派生程序安裝后,其快捷圖標(按照前述,該快捷圖標可以在形狀 上與原始程序安裝后形成的快捷圖標存在部分差異)便可以出現在應用列表中,而無論其 是否安裝在系統應用安裝目錄還是第三方應用安裝目錄,因而,用戶可以對其施加觸控操 作,從而產生用戶運行指令,導致動行本啟動單元,進而便開始啟動該派生程序,依照 Android虛擬機機制原來,經由AMS、PMS向Zygote申請孵化虛擬機,構造進程空間,以便形成 相應的派生進程,使派生程序在該虛擬機中運行。這種情況下,不必理會所述的原始程序的 進程是否已經擁有一個獨立的虛擬機,原始進程與派生進程各自將獲得一個彼此相互獨立 的虛擬機進行運行。
[0149] 所述的調用單元22,用于響應于所述派生進程獲取其自身包名的請求指令,接受 其預置的重設模塊的調用而執行用于重新確定派生進程的包名的解析函數。
[0150] 如前所述,派生程序的開發者一般都會預置獲取自身包名的驗證指令,這種情況 下,一旦派生進程得以運行,便會喚起其驗證指令。當然,驗證指令也可能出現在派生進程 運行過程中的任何階段。由于所述派生程序具有的新包名不同于所述原始程序所具有的原 包名,而所述派生程序安裝包完全包含所述原始程序安裝包的部分文件,因此,需要依賴于 所述的重設模塊進行后續處理。不管如何,一旦派生進程得以運行,當其即將調用 getPackageName()這一包名獲取函數以其征詢自身包名時,將優先喚起所述預置的重設模 塊,最終將由該重設模塊與所述的解析函數相配合,返回當前進程(派生進程)的包名為所 述的原包名的結果。
[0151] 所述的返回單元,被配置為由該解析函數向重設模塊傳遞與所述派生程序相對應 的原始程序的原包名以返回給所述的請求指令以確保派生進程得以運行。
[0152] 所述的解析函數,其在本質上是對所述重設模塊的功能的靈活變通,一方面,可以 將該解析函數與重設模塊以代碼的形式一體化存在于所述原始程序中,在派生進程運行過 程中隨時便捷調用;另一方面,則可以將其實現于其他程序的后臺進程中,通過預規范的接 口由重設模塊進行調用。所述解析函數的功能,正是為了集中所述重設模塊的欺騙功能,也 即是由該解析函數依據當前進程的新包名,去預存的數據中查詢其對應的原包名,繼而在 重設模塊與解析函數的配合下,向派生程序進程原請求指令邏輯返回當前包名為所述原包 名(如前述的oldPackage)的欺騙信息,令派生程序進程信以為真,從而實現欺騙的目的,避 開派生程序既有的鑒權邏輯。據此,派生進程便具備了與所述原始進程共同運行的能力,一 旦原始進程和派生進程同時運行,可以發現,兩者將同時駐存于系統的進程列表中。
[0153] 由此可見,當派生程序安裝并被運行之后,依靠其自身預置的技術能力,運行所述 重設模塊,便可使其自身具備駐存于系統進程列表的能力,當所述原始進程同時存在于內 存時,兩個進程也能并行不悖地各自完成自身工作。
[0154] -個典型的應用場景中,用戶可以同時運行兩個諸如"微信"這樣的應用程序,兩 個"微信"進程分別用于登錄不同的賬號,并且并行不悖地與外界進行通信,甚至兩個不同 賬號之間也可直接進行通信。
[0155] 綜上所述,本發明以更為簡單的技術途徑實現了同時駐存原始程序及其副本的進 程的方案,在遵守應用程序版權控制技術的前提下,破除了安卓系統的技術封鎖。
[0156] 本技術領域技術人員可以理解,本發明包括涉及用于執行本申請中所述操作中的 一項或多項的設備。這些設備可以為所需的目的而專門設計和制造,或者也可以包括通用 計算機中的已知設備。這些設備具有存儲在其內的計算機程序,這些計算機程序選擇性地 激活或重構。這樣的計算機程序可以被存儲在設備(例如,計算機)可讀介質中或者存儲在 適于存儲電子指令并分別耦聯到總線的任何類型的介質中,所述計算機可讀介質包括但不 限于任何類型的盤(包括軟盤、硬盤、光盤、CD-ROM、和磁光盤)、R0M( Read-OnIy Memory,只 讀存儲器)、RAM(Random Access Memory,隨即存儲器)、EPROM(Erasable Programmable Read-Only Memory,可擦寫可編程只讀存儲器)、EEPR0M(Electrically Erasable Programmable Read-Only Memory,電可擦可編程只讀存儲器)、閃存、磁性卡片或光線卡 片。也就是,可讀介質包括由設備(例如,計算機)以能夠讀的形式存儲或傳輸信息的任何介 質。
[0157] 本技術領域技術人員可以理解,可以用計算機程序指令來實現這些結構圖和/或 框圖和/或流圖中的每個框以及這些結構圖和/或框圖和/或流圖中的框的組合。本技術領 域技術人員可以理解,可以將這些計算機程序指令提供給通用計算機、專業計算機或其他 可編程數據處理方法的處理器來實現,從而通過計算機或其他可編程數據處理方法的處理 器來執行本發明公開的結構圖和/或框圖和/或流圖的框或多個框中指定的方案。
[0158] 本技術領域技術人員可以理解,本發明中已經討論過的各種操作、方法、流程中的 步驟、措施、方案可以被交替、更改、組合或刪除。進一步地,具有本發明中已經討論過的各 種操作、方法、流程中的其他步驟、措施、方案也可以被交替、更改、重排、分解、組合或刪除。 進一步地,現有技術中的具有與本發明中公開的各種操作、方法、流程中的步驟、措施、方案 也可以被交替、更改、重排、分解、組合或刪除。
[0159] 以上所述僅是本發明的部分實施方式,應當指出,對于本技術領域的普通技術人 員來說,在不脫離本發明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應 視為本發明的保護范圍。
【主權項】
1. 一種派生程序生成方法,其特征在于,包括如下步驟: 響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包; 將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異于原始安裝包的新包 名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬包名為所述的原 包名的重設模塊; 對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。2. 根據權利要求1所述的方法,其特征在于,所述的原始程序安裝包存儲于系統應用安 裝目錄或者第三方應用安裝目錄。3. 根據權利要求2所述的方法,其特征在于,所述重設模塊被配置為在運行階段通過掛 鉤其所在的派生程序的進程的包名獲取函數,向該包名獲取函數返回所述的原包名。4. 根據權利要求3所述的方法,其特征在于,所述包名獲取函數為用于返回當前進程所 屬的包名的函數:getPackageName()。5. 根據權利要求1所述的方法,其特征在于,所述的鏡像中包含有 Androidmanifest. xml文件,該文件中所述原始安裝包的包名被替換為所述的新包名。6. 根據權利要求1所述的方法,其特征在于,所述的鏡像中的資源文件中的快捷圖標一 并被部分修改,以使所述派生程序安裝后形成的快捷圖標部分地區別于所述原始程序的快 捷圖標。7. -種派生程序生成裝置,其特征在于,包括: 確定模塊,用于響應于用戶操作指令,確定需要生成派生程序的原始程序安裝包; 裝配模塊,用于將具有原包名的原始安裝包反向為安裝包鏡像,為該鏡像配置異于原 始安裝包的新包名,向該鏡像中植入用于當派生程序的進程征詢時告知該進程其自身所屬 包名為所述的原包名的重設模塊; 封裝模塊,用于對所述鏡像進行重新打包簽名形成所述的派生程序并安裝之。8. 根據權利要求7所述的裝置,其特征在于,所述的原始程序安裝包存儲于系統應用安 裝目錄或者第三方應用安裝目錄。9. 一種派生進程駐存方法,其特征在于,包括如下步驟: 響應于用戶運行指令,運行已安裝的根據權利要求1至6任意一項所述的派生程序以啟 動所述的派生進程; 響應于所述派生進程獲取其自身包名的請求指令,接受其預置的重設模塊的調用而執 行用于重新確定派生進程的包名的解析函數; 由該解析函數向重設模塊傳遞與所述派生程序相對應的原始程序的原包名以返回給 所述的請求指令以確保派生進程得以運行。10. -種派生進程駐存裝置,其特征在于,包括: 啟動單元,用于響應于用戶運行指令,運行已安裝的根據權利要求7至8任意一項所述 的派生程序以啟動所述的派生進程; 調用單元,用于響應于所述派生進程獲取其自身包名的請求指令,接受其預置的重設 模塊的調用而執行用于重新確定派生進程的包名的解析函數; 返回單元,被配置為由該解析函數向重設模塊傳遞與所述派生程序相對應的原始程序 的原包名以返回給所述的請求指令以確保派生進程得以運行。
【文檔編號】G06F9/455GK105843668SQ201610141393
【公開日】2016年8月10日
【申請日】2016年3月11日
【發明人】李常坤, 劉星, 石浩然, 張海
【申請人】北京奇虎科技有限公司, 奇智軟件(北京)有限公司