無需Root也能Hook?——Depoxsed框架演示

2021-01-08 CSDN技術社區

CSDN移動將持續為您優選移動開發的精華內容,共同探討移動開發的技術熱點話題,涵蓋移動應用、開發工具、移動遊戲及引擎、智能硬體、物聯網等方方面面。如果您想投稿、參與內容翻譯工作,或尋求近匠報導,請發送郵件至tangxy#csdn.net(請把#改成@)。 

作者簡介:周聖韜,百度高級Android開發工程師,博客地址:http://blog.csdn.net/yzzst

之前我們介紹過rovo89在GitHub上的Xposed框架,也介紹了如何使用Xposed框架進行登錄劫持和廣告注入。但是,之後很多朋友都在問我,這個Xposed框架使用起來很確實很好用。可是就是有一個巨大的缺點,就是需要Root權限。很多設備都沒有Root權限,有沒有一個不需要Root權限的Hook框架。


答案是,肯定的。那就是目前的Alibaba的開源框架,Dexposed框架。

Github地址 : https://github.com/alibaba/dexposed

Dexposed

它的官方介紹如下:

它基於ROOT社區著名開源項目Xposed改造剝離了ROOT部分,演化為服務於所在應用自身的AOP框架,並在Apache 2.0協議下開源。

Xposed是XDA社區用戶rovo89開發並管理的一個項目,它通過修改Android Dalvik運行時的Zygote進程,使用Xposed  Bridge將第三方代碼注入到Android應用的方法調用中,實現非侵入式的在運行期動態修改系統和應用行為的能力。

Dexposed的原理也是很簡單,如它介紹中所說的。它是Xposed框架剝離掉了Root部分的功能。不熟悉Xposed原理的,可以看這裡。

沒有Root權限,那麼Xposed框架式無法替換app_process的,當然也就無法進行整個系統級應用程式的注入了。當然,對自我程序本身還是沒有問題的。

目前Dexposed的主要應用場景有以下幾種:

AOP編程 插樁 (如測試、性能監控等) 在線熱補丁 SDK hooking以提供更好的開發體驗

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

看到這裡,很多小夥伴估計都會產生疑問,我靠,不能進行登錄劫持了,不能注入廣告了,我用你來幹什麼。/(ㄒoㄒ)/~


AOP編程,在線熱補丁

沒錯,Dexposed框架主要的功能,還是提供作為AOP框架使用。這麼一來的話,我們之前也介紹過Android的插件實現方式。這裡我們所用Dexposed框架來實現的話,插件模型將會更加簡單。

首先先介紹一下,Dexposed框架也提供了一個與Xposed框架類似的方法。

/** * 該系統是否支持hook */public static synchronized boolean canDexposed(Context context)/** * 尋找並hook一個指定的方法 * @param clazz 類的class * @param methodName hook的方法名稱 * @param parameterTypesAndCallback 參數和返回callback * @return */public static Unhook findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback)

在線熱補丁實例

如何進行在線的熱補丁呢?我們這裡以Alibaba的Demo為例。如在主線版本中,我們有一個showDialog方法。已經發布出去了。但是,突然發現有一點Bug或者突發性需求,我們不能夠理解的發版更新。

這裡就能夠通過之前我們所說的DexClassLoader的方式,載入線上的插件Path.apk。  通過Dexposed框架,動態的Hook並替換主線版本中的showDialog函數方法。

具體的邏輯如下圖所示:

看到上面的效果說明圖之後,相信大家對Dexposed的在線熱補丁已經有一定的了解了,這裡我們也不用做過多的贅述。

當然,你可能想到很多使用熱補丁的應用方向,比如Bug補丁修復、插件功能等等。Dexposed框架原理很簡單,功能也算不上強大。但是,確實特別實用。我也是推薦各大Android開發者,特別是創業公司使用。

下面是主工程中與補丁工程中的邏輯實現。這裡,童鞋們可以對比著效果圖看一下。如果大家對動態的使用DexClassLoader載入一個apk代碼還存在疑問,可以clone一下dexposed的源碼學習學習。

主工程中,MainActivity showDialog方法的定義:

public class MainActivity extends Activity { //..........一些忽略掉的代碼 private void showDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Dexposed sample") .setMessage("Please clone patchsample project to generate apk, and copy it to \"/Android/data/com.taobao.dexposed/cache/patch.apk\"") .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create().show(); }}

在線熱補丁,Path.apk中的代碼:

/** * 插件的補丁類 */public class DialogPatch implements IPatch { @Override public void handlePatch(final PatchParam arg0) throws Throwable { // 獲取主程序的ClassLoader Class<?> cls = null; try { // 獲取主程序的MainActivity類 cls= arg0.context.getClassLoader().loadClass("com.taobao.dexposed.MainActivity"); } catch (ClassNotFoundException e) { e.printStackTrace(); return; } // hook並替換MainActivity中的showDialog方法 DexposedBridge.findAndHookMethod(cls, "showDialog", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { // 彈出一個插件中的Dialog Activity mainActivity = (Activity) param.thisObject; AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity); builder.setTitle("Dexposed sample") .setMessage("The dialog is shown from patch apk!") .setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create().show(); return null; } }); }}

預告: 2015中國移動開發者大會(MDCC 2015)將於10月15-16日在北京新雲南皇冠假日酒店召開。大會特設五大技術專場:平臺與技術iOS、平臺與技術Android、產品與設計、遊戲開發、企業移動化。此外,大會更是首次舉辦國內極具權威影響力的IoT技術峰會,特設硬體開發技術與虛擬實境兩大專場。大會將聚集國內最具實力的產品技術團隊,與開發者一道進行最前沿的探討與交流。

第一時間掌握最新移動開發相關信息和技術,請關注mobilehub公眾微信號(ID: mobilehub)。


相關焦點

  • 免root,免刷機,甚至免安裝 xposed 框架,也能用 xposed 框架及插件...
    大家都知道,用 xposed 框架必須要 root,但現在 root 成功率越來越低,大大提高了使用門檻。看似無解的問題,其實可以通過沙箱技術解決。  市面上典型利用沙箱技術的應用是雙開類應用,今天介紹的這塊應用,不僅穩定支持雙能開,更支持運行 xposed 框架+插件,真正做到免 root,甚至不用安裝 xposed 框架,就能玩轉各種插件了。
  • linux三劍客-sed
    它能執行與編輯器vi和ex相同的編輯任務,使用者只能在命令行輸入編輯命令、指定文件名,然後在屏幕上查看輸出。sed編輯器沒有破壞性,它不會修改文件,除非使用shell重定向來保存輸出結果。默認情況下,所有的輸出行都被列印到屏幕上。2.sed工作流程sed編輯器逐行處理文件(或輸出),並將輸出結果發送到屏幕。
  • 詳解Linux sed 命令語法、以及經典50例
    那能不能不打開文件就直接修改呢。你能想到的90%都被人實現了。那就看看SED吧。下文是老外都總結好了的,我機器(翻譯)成了中文。但例子還是得自己來一邊的。這樣自己才能學會。let's go.本教程基於GNU sed設計。因此,需要使用此版本的sed來練習本教程中顯示的示例。[root@zjt]$ sed --versionsed (GNU sed) 4.2.2.....
  • linux sed 示例總結
    >[root@dz shell]39;2,$d& sed -n &39; listroot 192.168.1.1 123root 192.168.2.1 123root 192.168.3.1 123root 192.168.4.1 123案例4:刪除第2行到最後一行[root@dz
  • Linux之sed命令詳解
    sedsed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法sed命令行格式為:sed [-nefri] 『command』 輸入文本
  • Linux sed命令完全攻略(超級詳細)
    sed 命令的基本格式如下:[root@localhost ~] sed &39; data4.txtThis is a test of the trial script.This is the second test of the trial script.
  • 利用sed實現文件指定行修改實踐優化tomcat目錄遍歷
    lt;param-name>listings</param-name> <param-value>true</param-value></init-param>2、操作指令---備份配置文件(加固前創建備份目錄,按照日期命名,以下操作請注意核實路徑)mkdir /root
  • 四種方法教你破解Linux(CentOS7.4)系統的root密碼
    一、前言作為站在系統頂端的那個人,偶爾也會發生忘記root密碼這樣的情況,對於老司機來說,這根本不用慌,有很多種辦法搞定!當然,我在此所說的情況僅限於能看到啟動界面能夠編輯grub配置的情況或者能夠掛載系統光碟進行修復的情況。其他場景並不是適用。想通過閱讀本文,然後破解其他遠程主機的小夥伴們在此可以繞道了,此文並不適用。
  • ...xposed 框架,也能用 xposed 框架及插件?分身大師 X 版強勢來襲!
    大家都知道,用 xposed 框架必須要 root,但現在 root 成功率越來越低,大大提高了使用門檻。看似無解的問題,其實可以通過沙箱技術解決。  市面上典型利用沙箱技術的應用是雙開類應用,今天介紹的這塊應用,不僅穩定支持雙能開,更支持運行 xposed 框架+插件,真正做到免 root,甚至不用安裝 xposed 框架,就能玩轉各種插件了。
  • 免安裝xposed 也能用xposed框架及插件
    大家都知道,用xposed框架必須要root,但現在root成功率越來越低,大大提高了使用門檻。看似無解的問題,其實可以通過沙箱技術解決。市面上典型利用沙箱技術的應用是雙開類應用,今天介紹的這塊應用,不僅穩定支持雙能開,更支持運行xposed框架+插件,真正做到免root,甚至不用安裝xposed框架,就能玩轉各種插件了。可謂是廣大機友的福音。
  • Linux文本處理三劍客之sed命令全面解析,一文就夠了
    作用sed命令是一個非交互式的行文本編輯器,它能對文件內容進行編輯,默認每次處理文本文件中所匹配到一行內容到模式空間,然後用後面的命令進行操作,操作完成之後,會把模式空間裡面的內容輸出到屏幕上,然後把模式空間中的內容刪除,同時把下一行所匹配到的內容讀入模式空間內,依次循環,直到讀取完整個文件。
  • 免root用Xposed框架!安卓用戶一定要學會
    相信經常玩機的小夥伴,一定對安卓系統上的Xposed框架比較熟悉。基於Xposed框架,我們可以給手機增加各種強大的應用模塊,如模擬位置、自動搶紅包、微信消息防撤回等等。可惜的是,要使用Xposed框架,就必須給手機root。如今,隨著安卓系統的更新,獲取root權限已經變得越來越困難。
  • Android Hook神器:XPosed入門與登陸劫持演示
    基於Xposed框架可以製作出許多功能強大的模塊,且在功能不衝突的情況下同時運作。此外,Xposed框架中的每一個庫還可以單獨下載使用,如Per APP Setting(為每個應用設置單獨的dpi或修改權限)、Cydia、XPrivacy(防止隱私洩露)、BootManager(開啟自啟動程序管理應用)對原生Launcher替換圖標等應用或功能均基於此框架。
  • Android上玩玩Hook:Cydia Substrate實戰
    Cydia Substrate框架如果使用過蘋果手機的用戶應該對Cydia Substrate框架來說一點都不會陌生,因為Cydia Substrate框架為蘋果用戶提供了越獄相關的服務框架。安裝Cydia Substrate框架Android本地服務首先就是在Android設備中安裝Cydia Substrate框架的本地服務應用substrate.apk,我們可以在其官網下載到。
  • 詳解Hook框架frida,讓你在逆向工作中效率成倍提升!
    一、frida簡介frida是一款基於python + javascript 的hook框架,可運行在androidioslinuxwinosx等各平臺,主要使用動態二進位插樁技術。本期「安仔課堂」,ISEC實驗室的彭老師為大家詳解frida,認真讀完這篇文章會讓你在逆向工作中效率成倍提升哦!
  • Linux常用命令 - sed
    sed 是一個流編輯器。它可以對文件和輸入流(如管道)執行基本的文本操作。使用 sed,您可以搜索、查找和替換、插入和刪除單詞和行。 它支持基本的和擴展的正則表達式,允許您匹配複雜的模式。接下來, 我將使用 sed 查找和替換字符串。我還將向您展示如何執行遞歸搜索和替換。
  • frida學習筆記3 之hook so中的方法
    hook so 常用工具SubstrateCydia-需rootfrida--需rootVA系列-非root(VA、VXP、SandVXposed)frida方式hook材料準備heibaobao.apk
  • python開發web服務 bottle框架
    開發功能不是特別複雜的web服務,可以考慮使用bottle框架。原因:一、Python開發效率高呀!不信你比比同樣的功能Python幾行可以搞定?換java試試?換C++試試?作為這幾種語言都使用過的我來說,用過java就儘量不用C++,用過Python就儘量不用java,真的不堪回首。使用bottle框架首先安裝。一個指令搞定。
  • 什麼是WebHook?
    1、解釋 :Webhook是一個API概念,並且變得越來越流行。我們能用事件描述的事物越多,webhook的作用範圍也就越大。Webhook作為一個輕量的事件處理應用,正變得越來越有用。webhooks是微服務api的使用方式之一,也被稱為反向api,即:前端不主動發送請求,完全由後端推送。