订阅移动开发RSS CSDN首页> 移动开发

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

发表于2015-08-27 16:10| 次阅读| 来源CSDN| 0 条评论| 作者周圣韬

摘要:Xposed可以实现非侵入式的在运行期动态修改系统和应用行为的能力,但有着一个巨大的缺点,就是需要Root权限。本文作者介绍并演示了无需Root也能Hook的Alibaba开源框架Depoxsed方案。

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或者突发性需求,我们不能够理解的发版更新。

  1. 这里就能够通过之前我们所说的DexClassLoader的方式,载入线上的插件Path.apk。 
  2. 通过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)。


0
0
  • CSDN官方微信
  • 扫描二维码,向CSDN吐槽
  • 微信号:CSDNnews
程序员移动端订阅下载

微博关注

相关热门文章