App应用双开技术,Android沙盒
> App應(yīng)用雙開(kāi)(多開(kāi))技術(shù)
微信分身,微信多開(kāi),微信雙開(kāi)- http://blog.csdn.net/yunajie/article/details/50894488
Android應(yīng)用分身功能介紹- http://blog.csdn.net/maetelibom/article/details/52084085
-- LBE平行空間和市面上的其他應(yīng)用雙開(kāi)app有本質(zhì)區(qū)別,其他方案是通過(guò)改包名、改Framework等非常粗糙的方式達(dá)到目的,而 LBE是讓?xiě)?yīng)用在自己開(kāi)的虛擬機(jī)里面運(yùn)行,單獨(dú)的進(jìn)程單獨(dú)的環(huán)境來(lái)實(shí)現(xiàn)雙開(kāi);而機(jī)友精靈是把應(yīng)用通過(guò)復(fù)制改代碼重新生成APK文件來(lái)實(shí)現(xiàn)的;MIUI8。LBE平行空間的底層是一個(gè)完整的虛擬化引擎:MultiDroid更準(zhǔn)確的說(shuō),MultiDroid并不是硬件虛擬化或OS虛擬化 (譬如VMware, Xen, KVM),它也不是應(yīng)用層虛擬化(譬如XenApp, Wine),MultiDroid更類似容器(Container).LBE出品的平行空間(Parallel Space)。
? 現(xiàn)階段,已有許多安全公司研發(fā)出了較早時(shí)期的App雙開(kāi)技術(shù):LBE平行空間、卓盟雙開(kāi)助手、金山開(kāi)小號(hào),但是它們的原理無(wú)一例外的是插件化。
?- LBE MultiDroid的關(guān)鍵技術(shù)有:
? 1. Framework層的虛擬實(shí)現(xiàn)在Android環(huán)境中,每個(gè)應(yīng)用在運(yùn)行時(shí)都需要和Android framework打交道。Android系統(tǒng)的System-Server進(jìn)程提供了大部分的系統(tǒng)API。 應(yīng)用程序通過(guò)Binder IPC調(diào)用系統(tǒng)API。LBE之前在安全大師產(chǎn)品中,也就是通過(guò)對(duì)System-Server的hook來(lái)實(shí)現(xiàn)主動(dòng)防御和權(quán)限管理,但MultiDroid在設(shè)計(jì)之初的一個(gè)最重要的目標(biāo)就是不需要root權(quán)限,從而不能通過(guò)hook的方式來(lái)實(shí)現(xiàn)虛擬化。為此,我們需要自行實(shí)現(xiàn)一套完整的System-Server API,這就是MultiDroid的核心,工作量非常大,更麻煩的是,我們的設(shè)計(jì)目標(biāo)是支持所有Android 4.0以上版本,而每個(gè)版本的Framework實(shí)現(xiàn)又千差萬(wàn)別……
? 2. 文件系統(tǒng)虛擬化程序在運(yùn)行的時(shí)候,會(huì)加載文件系統(tǒng)上的程序指令和程序數(shù)據(jù)。要建立虛擬的應(yīng)用程序運(yùn)行環(huán)境,需要模擬一個(gè)獨(dú)立的文件系統(tǒng),在這個(gè)獨(dú)立的文件系統(tǒng)中,再針對(duì)不同的虛擬應(yīng)用的主目錄進(jìn)行區(qū)分和權(quán)限控制;
? 3. Android系統(tǒng)組件管理一個(gè)Android應(yīng)用基本上是由Android四大組件(Activity, Service, Broadcast Receiver,Content Provider)構(gòu)成。在Android環(huán)境中,System-Server和應(yīng)用通過(guò)進(jìn)程間通信交互,Android系統(tǒng)負(fù)責(zé)了四大組件的管理,包括創(chuàng)建,激活,銷(xiāo)毀等。MultiDroid引擎實(shí)現(xiàn)了一套Android組件管理系統(tǒng),用來(lái)模擬系統(tǒng)對(duì)Android組件的管理。每個(gè)運(yùn)行在虛擬環(huán)境中的應(yīng)用,會(huì)把自己的組件注冊(cè)給MultiDroid引擎,由MultiDroid引擎負(fù)責(zé)各個(gè)組件的生命周期維護(hù);
? 4. 應(yīng)用進(jìn)程管理Android本身在應(yīng)用和進(jìn)程之間做了隔離,應(yīng)用幾乎不需要感知進(jìn)程的存在,只需要關(guān)注應(yīng)用自身的四大組件。但是應(yīng)用本身還是需要在Dalvik進(jìn)程中運(yùn)行。虛擬環(huán)境中的進(jìn)程仍然是一個(gè)Dalvik進(jìn)程, MultiDroid引擎負(fù)責(zé)了虛擬應(yīng)用進(jìn)程的創(chuàng)建,進(jìn)程ID的分配,進(jìn)程的銷(xiāo)毀等;
??
?- MultiDroid的未來(lái)發(fā)展:
?目前的MultiDroid引擎已經(jīng)相當(dāng)完善,可以很好的運(yùn)行市面上的絕大部分App,而且在耗電和內(nèi)存使用上都做了非常多的優(yōu)化,但這只是起步,我們期望下一版的MultiDroid引擎將會(huì)從某種程度上改變Android本身的生態(tài)環(huán)境和使用體驗(yàn),譬如支持整個(gè)虛擬環(huán)境的快照和恢復(fù),發(fā)燒友就不用為了嘗試各種新鮮玩法而反復(fù)刷機(jī)了,當(dāng)然,還有虛擬環(huán)境內(nèi)應(yīng)用數(shù)據(jù)的云備份,類似iCloud,雖然有Android廠商也支持類似功能,但跨廠商的設(shè)備同步目前還沒(méi)有;再譬如代碼動(dòng)態(tài)優(yōu)化,雖然目前的MultiDroid引擎并沒(méi)有性能問(wèn)題,但我們希望可以借鑒ART的做法,通過(guò)在虛擬環(huán)境中的代碼預(yù)優(yōu)化和動(dòng)態(tài)轉(zhuǎn)換,來(lái)提升應(yīng)用加載速度;同時(shí),我們已經(jīng)找到了一個(gè)辦法把具有某些特征的dex字節(jié)碼片段在虛擬環(huán)境中轉(zhuǎn)為native指令來(lái)運(yùn)行,性能的提升非常夸張。總之,MultiDroid打開(kāi)了一個(gè)盒子,里面有無(wú)窮可能。
-- 實(shí)現(xiàn)雙開(kāi)(多開(kāi))的幾種方案:
?1.靜態(tài)修改APK包名,然后重打包
作為廠商肯定不推薦這個(gè)方式拉,可能存在法律風(fēng)險(xiǎn)
?2.動(dòng)態(tài)修改APK包名
對(duì)原生代碼修改量小,兼容性差,部分APP需單獨(dú)適配
?3.動(dòng)態(tài)修改進(jìn)程的實(shí)例
對(duì)原生代碼修改量大,兼容性一般,可能會(huì)導(dǎo)致系統(tǒng)一些亂七八糟的BUG
?4.通過(guò)多用戶機(jī)制實(shí)現(xiàn)
MIUI的實(shí)現(xiàn)機(jī)制,更多的是修改多用戶在相關(guān)的代碼
?5.通過(guò)動(dòng)態(tài)加載(運(yùn)行)的機(jī)制來(lái)實(shí)現(xiàn)(LBE的平行空間)
作為第三方開(kāi)發(fā)者,不能ROOT,不能修改系統(tǒng)源碼,逼的LBE用這種方式,也是難為他們了
-- 不管是平行空間還是雙開(kāi)助手還是其他的類似實(shí)現(xiàn),都離不開(kāi)Hook技術(shù)。幾種Hook技術(shù):
1.Binder Hook,DroidPlugin;
2.Handler Hook,去看看ActivityThread.mH是干啥的就知道了;
3.Native Hook。就是文件系統(tǒng)Hook,比如:
?open("/data/data/${pkg}/", flag) ==>open("/data/data/http://com.lbe.xxx/yy/${pkg}/", flag); LBE用的是inline hook
-- 企業(yè)空間和原本用戶空間
? 使用Android原生接口,實(shí)現(xiàn)“應(yīng)用雙開(kāi)”,源代碼可以從 https://github.com/bobohuang1985/android-utils-api 下載,具體代碼位置在utils.bobo.com.boboutils.MultiApp包內(nèi),
-- APK多開(kāi)原理- https://segmentfault.com/a/1190000005139577
?packageName 在代碼中使用,通常在 AndroidManifest.xml中指定,applicationId 則只是用于程序的標(biāo)識(shí),通常在 build.gradle 中指定。這樣有一個(gè)好處,假如你想發(fā)布一個(gè)免費(fèi)版,一個(gè)收費(fèi)版,你只需要在 build.gradle 中把a(bǔ)pplicationId 后面加上免費(fèi)版的后綴包名(如".free"),收費(fèi)版加上收費(fèi)版的后綴即可,而不需要修改你的其他代碼。?
你可以通過(guò)使用以下的 Gradle DSL 方法,為不同的flavors和構(gòu)建類型修改你的應(yīng)用程序的 ApplicationId:
?productFlavors {
? ? ? ? pro {
? ? ? ? ? ? applicationId = "com.example.my.pkg.pro"
? ? ? ? }
? ? ? ? free {
? ? ? ? ? ? applicationId = "com.example.my.pkg.free"
? ? ? ? }
? ? }
? ? buildTypes {
? ? ? ? debug {
? ? ? ? ? ? applicationIdSuffix ".debug"
? ? ? ? }
? ? }
?改掉主配置文件中的包名和smali文件相關(guān)的包名后,雖然可以安裝,但是并不能運(yùn)行,最直接的一點(diǎn)就是改掉了主配置文件的包名,那些像百度地圖,極光推送,環(huán)信聊天等第三方SDK就都不能用了,因?yàn)檫@些都是在開(kāi)發(fā)者中心注冊(cè)ID的,和包名是綁定的,所以用ApkTool工具反編譯的APK并不是雙開(kāi)實(shí)現(xiàn)的工具。
-- 三星MY KNOX不僅僅是一個(gè)軟件這么簡(jiǎn)單,它具有兩大特性。首先就是安全沙盒機(jī)制,My Knox功能可以為需要安全保護(hù)的APP應(yīng)用(如:微信、支付寶等)和信息(如:通訊錄、相冊(cè)等)提供一個(gè)獨(dú)立的、與外界隔離的空間,從使用場(chǎng)景來(lái)看就是應(yīng)用雙開(kāi);其次是Root操作熔斷機(jī)制,如果有人企圖非法獲取系統(tǒng)管理權(quán),一旦觸發(fā)Root操作,手機(jī)主板上的Knox“保險(xiǎn)絲”會(huì)物理熔斷,且不可逆轉(zhuǎn)。
> DroidBox安卓沙盒
Android 雙開(kāi)沙箱 VirtualApp 源碼分析(三)App 啟動(dòng)- http://blog.csdn.net/ganyao939543405/article/details/76177392
針對(duì)Android沙盒的“中間APP攻擊”- http://blog.csdn.net/qq_27446553/article/details/56674931
? App沙盒/雙開(kāi)技術(shù)是現(xiàn)在仍處于發(fā)育時(shí)期的未成熟技術(shù),它的目標(biāo)是使一個(gè)未安裝的APK直接運(yùn)行在一個(gè)容器當(dāng)中,與外部環(huán)境部分隔離(或完全隔離),處于沙盒之中的App無(wú)法覺(jué)察到自己的環(huán)境與普通運(yùn)行時(shí)的環(huán)境有所不同,并能夠與沙盒之中的其它App進(jìn)行交互。概念上來(lái)講,它類似Docker。
??
-- App沙盒的難點(diǎn)主要有:
?1.欺騙 App,讓其認(rèn)為自己運(yùn)行在正常的環(huán)境中。
?2.完整得驅(qū)動(dòng)四大組件。
?3.讓組件的進(jìn)程分布與實(shí)際完全一致。
?4.隨時(shí)與處在沙盒外部的容器和宿主(Host)進(jìn)行同步的遠(yuǎn)程通信。
?5.兼容不同系統(tǒng)API版本的設(shè)備。
?6.SD卡隔離(Native IO Redirect)。
?
總結(jié)
以上是生活随笔為你收集整理的App应用双开技术,Android沙盒的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ABAC权限模型的设计
- 下一篇: TP-Link wr886n 路由器插上