無需Root也能使用Xposed!

Xposed是Android系統上久負盛名的一個框架,它給了普通用戶任意 DIY 系統的能力;比如典型的微信防撤回、自動搶紅包、修改主題字體,以及模擬位置等等等等。不過,使用Xposed的前提條件之一就是需要Root。隨著Android系統的演進,這一條件達成越來越難了;那麼,能不能不用Root就可以享用Xposed的功能呢?

我們想一下,Xposed為什麼需要Root?從現在的實現來看,因為Xposed需要修改系統文件,而這些文件只有root許可權才能修改;但是這只是當前實現的特性(修改系統分區文件),而非根本原因。Xposed要實現的最終目的是在任意App進程啟動之前能任意載入 特定Xposed模塊 的代碼;這些特定的Xposed模塊中能在App進程啟動之前有機會執行特定代碼,從而控制任意進程的行為。歸根結底,Xposed需要控制別的進程,而沒有高級許可權(Root),越俎代庖是不行的。

有沒有別的實現方式?

雖然沒有辦法控制別的進程,但是在本進程內,幾乎是可以為所欲為的;如果換個方式,把別的App放在自己的進程裡面運行,然後Hook自己 不就打到目的了嘛?「把別的App放在自己的進程裡面運行」這種機制是容器,或者通俗點叫雙開;「Hook自己」這是典型的Dexposed的思路,不過Dexposed不支持ART——但前不久 epic 的出現完成了這最後一塊拼圖。(關於epic在ART上實現AOP Hook可以參考 我為Dexposed續一秒——論ART上運行時 Method AOP實現。

雙開的典型實現是lody的 VirtualApp,那麼來一看 `VirtualApp` 與 `epic` 結合會產生什麼樣奇妙的化學反應。

我們的思路很清晰:用 VirtualApp 去啟動別的App,在啟動過程中通過 epic Hook本進程,從而控制被啟動的App。同時,由於Xposed模塊已經比較成熟,而且有成千上萬的插件生態,最好能夠直接復用Xposed 的模塊,使得在雙開環境下,Xposed模塊就跟運行在Root手機中的Xposed環境中一樣。為此,我寫了一個 雙開環境下的Xposed兼容層:Exposed;同時,修改了 VirtualApp 的部分實現,使得它能夠在進程的啟動的時候載入 Exposed 這個兼容層,代碼在這:VAExposed。這樣,在雙開環境中,可以直接載入已有的Xposed模塊進而實現非Root模式下的Xposed的功能。更有趣的是,你還可以直接使用 XposedInstaller 安裝和管理任意的Xposed模塊,就跟你使用真正的Xposed一樣!

具體的代碼就不詳細講了,可以直接去看源碼:Exposed,VAExposed 我們以微信防撤回為例,看看具體的效果:

首先安裝VAExposed這個修改版的雙開APK,你可以clone源碼直接build,也可以使用我編譯好的版本 Github下載 百度網盤: pan.baidu.com/s/1mi89S8 密碼: bb18

然後安裝微信防撤回模塊:微信巫師,發布的主頁在這:WeChat Magician(微信巫師);直接下載 鏈接。

接下來需要確保你手機上的微信是微信巫師所支持的,目前支持微信的版本為 6.5.8~6.5.16;如果不是的話需要去下載一個支持的版本,比如 微信_6.5.8.apk 。

最後,你需要打開VAExposed這個雙開軟體,添加微信和微信巫師為雙開模塊,如下圖:

這樣,使用雙開中的微信,就能享受Xposed模塊的防撤回功能了!

另外,你還可以直接在雙開中使用 XposedInstaller,然後就可以方便滴下載和管理Xposed模塊了:

就這樣,我們在非Root手機下,就能享用Xposed模塊的功能,Have Fun :)

不過,在實現完這個功能之後,我不寒而慄:千萬不要在Root環境或者雙開環境下運行關鍵App,不然你的微信登錄密碼,支付寶支付密碼,銀行卡賬號,很有可能被盡收眼底。

PS:目前 Exposed 層的實現處於初級階段,個人精力非常有限(一般都是凌晨寫代碼);如果你對 實現非Root模式下的Xposed 感興趣,非常歡迎跟我一起組隊 :) 項目地址在這:github.com/android-hack


推薦閱讀:

實戰kotlin@android(三): 擴展變數與其它技巧
如果通過一根OTG線和一根普通MICRO USB數據線把兩台安卓手機連起來,會出現什麼現象?
2013 年 99% 的手機惡意軟體以 Android 設備為目標,此事會有何影響?
讓這款壁紙應用來發現你隱藏已久的藝術氣息

TAG:Android | Android开发 | XposedFramework |