原文出处——>[无需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函数方法。
具体的逻辑如下图所示:
![](http://img.blog.csdn.net/20150825232235869)
看到上面的效果说明图之后,相信大家对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屏幕刷新机制