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



之前我们介绍过rovo89在Githu上的Xposed框架,我们也介绍了如何使用Xposed框架进行

登录劫持,和广告注入。

但是,之后很多朋友都在问我,这个Xposed框架使用起来很确实很好用。可是就是有一

个巨大的缺点,就是需要Root权限。很多设备都没有Root权限,有没有一个不需要Root

权限的Hook框架。

答案是,确定的。就是目前的Alibab的开源框架,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原理的,可以看这里

http://blog.csdn.net/yzzst/article/details/47659987

没有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的源码学习学习。

当然,这里还是推荐大家去我的博客看看,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;
            }
        });
    }

}

/*

* @author zhoushengtao(周圣韬)

* @since 2015年8月26日 凌晨0:08:22

* @weixin stchou_zst

* @blog http://blog.csdn.net/yzzst

* @交流学习QQ群:341989536

* @私人QQ:445914891

/

版权声明:转载请标注:http://blog.csdn.net/yzzst 。 本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 16:55:36

无需Root也能Hook?——Depoxsed框架演示的相关文章

Android手机屏幕流畅投影到电脑进行演示(无需Root)

最近要在公司的会议上演示App,需要在投影仪上显示出来给大家演示.由于投影仪不是智能投影仪,只能将App先投影到自己的笔记本上,然后再将笔记本上的内容投影到投影仪上.该App是个游戏,实时交互性比较高,之前试过一些各种手机助手,比如腾讯的应用宝.360手机助手.豌豆荚手机助手等,这些手机助手可以在电脑上显示手机屏幕,但是非常卡顿,基本没法演示游戏App.我的手机是小米Note,最开始的时候用的是Android 4.4的系统,当时可以用小米助手链接小米Note,小米助手可以在PC上相对来说比较流畅

无需ROOT就能拿ANR日志

     File anrFile = null; String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { File sd = Environment.getExternalStorageDirectory(); String path = sd.getPath()+"/anrlog/" + sd_appName; FileReader

Android 无需root实现apk的静默安装

转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/50533137 Android的静默安装似乎是一个很有趣很诱人的东西,但是,用普通做法,如果手机没有root权限的话,似乎很难实现静默安装,因为Android并不提供显示的Intent调用,一般是通过以下方式安装apk: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFi

vivo6.0以上系统怎么无需root激活xposed框架的方法

在大多团队的引流,或业务操作中,理论上需要使用安卓的大神级xposed框架,近来,我们团队购买了一批新的vivo6.0以上系统,理论上都是基于7.0以上系统,理论上不能够获取root超级权限,即使小部分能但非常麻烦,甚至也有获取root超级权限后重启设备就恢复无root状态的情况出现,很是焦虑的一件事,导致无能正常激活xposed框架,从而大多模块也就无能正常工作.昨天晚上刚好看了一下琢石模拟器当前最新软件使用手册,居然发现新版本8.0以上版本可以兼容无ROOT设备下使用,手册也提供了对应无RO

红米机器如何无需Root激活Xposed框架的方法

在异常多应用室的引流或业务操作中,大多数需要使用安卓的黑技术xposed框架,这段时间,我们应用室买来了一批新的红米机器,大多数都是基于7.0以上系统,大多数不能够获取root权限,纵然有一些能但较为麻烦,甚至也有获取root权限后重启设备就恢复无root状态的情况出现,很是头疼的一件事,导致无法正常激活xposed框架,从而异常多模块也就无法正常应用.昨晚刚好找了一下琢石模拟器最新版本的软件使用手册,居然发现新版本8.0以上版本可以兼容无ROOT系统下使用,手册也提供了对应无ROOT系统激活X

(简单有效)三星手机怎么样无需ROOT激活Xposed框架

对于经常研究手机的玩家而言,Xposed框架当然都不陌生,很多功能强悍的App都基于Xposed框架下执行,但对于很多入门用户而言,却经常不清楚这是个什么框架,一听到Xposed框架激活真心头大,恰好近期在扣扣群里有群用户在问这事,而且最近我也正好都在研究这个Xposed框架,顺便写下一篇文章供入门用户玩家参考,希望有所帮助.说到这到底什么是xposed框架?Xposed框架是一个可以在不改动APK的情况下影响程序运行的框架服务.总之,xposed框架是一个功能牛逼的系统增强框架,而功能实现都是

【转】无需root Android 4.4现已支持显示电量百分比

原文网址:http://android.tgbus.com/shouji/news/201311/481145.shtml 现如今,大多数安卓设备.第三方ROM都可以在状态栏以百分比的形式精确显示剩余电量,还有很多软件可以做到这一点,但是原生的安卓一直没有这个非常基础的小功能,直到安卓4.4. 有人发现,Nexus 5上已经可以显示电量剩余XX%了,而且不需要Root,但它默认没有开启,而且隐藏得很深,需要通过ADB执行以下命令: adb shell content insert --uri c

Linux多安全策略和动态安全策略框架演示验证方案及结果分析

3演示验证方案及结果分析3.1演示验证方案3.1.1验证目标 该方案主要用于验证采用Flask体系结构实现的SELinux对系统的防护过程及相应的防护原理.3.1.2验证环境 操作系统:启用了SELinux的centos6.3 内核版本:2.6.32-279.e16.i686 策略类型:targeted 策略版本:policy.24 必要的软件包:setools.policycoreutil3.1.3技术原理 由于targeted策略只对网络服务进行保护,因此该验证场景就以www服务器为例来说明

Android 无线调试设备,无需Root方式

Android 真机设备调试,有事无法使用USB调试,或者用USB调试太麻烦,这时就需要使用无线调试 这种方式了. 无限调试分Root和非Root两种,市面上的无线ADB调试APP ,基本都是需要Root权限的,这就使没有Root的设备无法使用无线调试,进而需要使用非Root无限调试方法,废话不多说,下面介绍具体的方式. 准备工作 1.首先使用USB连接设备,并打开开发者模式的调试开关(通用调试方式,具体使用方法不赘述) 2.打开终端命令(Windows键+R,输入CMD ,回车) 3.输入 a