原文出處——>[無需Root也能Hook?——Depoxsed框架演示](http://blog.csdn.net/yzzst/article/details/47954479)
之前我們介紹過rovo89在Githu上的Xposed框架,我們也介紹了如何使用Xposed框架進行登錄劫持,和廣告注入。
但是,之后很多朋友都在問我,這個**Xposed框架**使用起來很確實很好用。可是就是有一個巨大的缺點,就是**需要Root權限**。很多設備都沒有Root權限,有沒有**一個不需要Root權限的Hook框架**。
答案是,確定的。就是目前的Alibab的開源框架,**Dexposed框架**。
github地址 :[dexposed](https://github.com/alibaba/dexposed)
#### **Dexposed**
* 官方介紹如下:
它基于ROOT社區著名開源項目Xposed改造剝離了ROOT部分,演化為服務于所在應用自身的AOP框架,并在Apache 2.0協議下開源。Xposed是XDA社區用戶rovo89開發并管理的一個項目,它通過修改Android Dalvik運行時的Zygote進程,使用Xposed Bridge將第三方代碼注入到Android應用的方法調用中,實現非侵入式的在運行期動態修改系統和應用行為的能力。
* 缺點:
不支持ART,時間久,無人維護和更新,目前看到更新時間是2015,所以了解技術即可,實用性不高。
Dexposed的原理也是很簡單,如它介紹中所說的。它是Xposed框架剝離掉了Root部分的功能。
不熟悉Xposed原理的,可以看這里[Xposed源碼剖析——概述](http://blog.csdn.net/yzzst/article/details/47659987)
沒有Root權限,那么Xposed框架式無法替換app_process的,當然也就無法進行整個系統級應用程序的注入了。當然,對自我程序本身還是沒有問題的。
目前Dexposed的主要應用場景有以下幾種:
* AOP編程
* 插樁 (如測試、性能監控等)
* 在線熱補丁
* SDK hooking以提供更好的開發體驗
>[info] 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或者突發性需求,我們不能夠理解的發版更新。
1. 這里就能夠通過之前我們所說的DexClassLoader的方式,載入線上的插件Path.apk。
2. 通過Dexposed框架,動態的Hook并替換主線版本中的showDialog函數方法。
具體的邏輯如下圖所示:

看到上面的效果說明圖之后,相信大家對Dexposed的在線熱補丁已經有一定的了解了。這里我們也不用做過多的贅述。
當然,你可能想到很多使用熱補丁的應用方向,比如:
* Bug補丁修復
* 插件功能
* 等等
Dexposed框架原理很簡單,功能也算不上強大。但是,確實特別實用。我也是推薦各大Android開發者,特別是創業公司使用。是強烈推薦!!
下面是主工程中與補丁工程中的邏輯實現。這里,童鞋們可以對比著效果圖看一下。
如果大家對動態的使用DexClassLoader載入一個apk代碼還存在疑問。 可以clone一下dexposed的源碼學習學習。當然,這里還是推薦大家去我的博客看看,Android的插件原理。[Android插件開發初探——基礎篇](http://blog.csdn.net/yzzst/article/details/45582315)
**主工程中,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;
}
});
}
}
~~~
- 前言
- Android系統的體系結構
- Dalvik VM 和 JVM 的比較
- Android 打包應用程序并安裝的過程
- Android ADB工具
- Android應用開發
- Android UI相關知識總結
- Android 中window 、view、 Activity的關系
- Android應用界面
- Android中的drawable和bitmap
- AndroidUI組件adapterView及其子類和Adapter的關系
- Android四大組件
- Android 數據存儲
- SharedPreference
- Android應用的資源
- 數組資源
- 使用Drawable資源
- Material Design
- Android 進程和線程
- 進程
- 線程
- Android Application類的介紹
- 意圖(Intent)
- Intent 和 Intent 過濾器(Google官網介紹)
- Android中關于任務棧的總結
- 任務和返回棧(官網譯文)
- 總結
- Android應用安全現狀與解決方案
- Android 安全開發
- HTTPS
- 安卓 代碼混淆與打包
- 動態注入技術(hook技術)
- 一、什么是hook技術
- 二、常用的Hook 工具
- Xposed源碼剖析——概述
- Xposed源碼剖析——app_process作用詳解
- Xposed源碼剖析——Xposed初始化
- Xposed源碼剖析——hook具體實現
- 無需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid應用
- 四、Hook原生應用程序
- 五、Hook 檢測/修復
- Android 應用的逆向與加固保護技術
- OpenCV在Android中的開發
- Android高級開發進階
- 高級UI
- UI繪制流程及原理
- Android新布局ConstraintLayout約束布局
- 關鍵幀動畫
- 幀動畫共享元素變換
- Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解
- Android中為什么主線程不會因為Looper.loop()里的死循環卡死?
- 為什么 Android 要采用 Binder 作為 IPC 機制?
- JVM 中一個線程的 Java 棧和寄存器中分別放的是什么?
- Android源碼的Binder權限是如何控制?
- 如何詳解 Activity 的生命周期?
- 為什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了嗎?
- Android屏幕刷新機制