您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
无需Root也能Hook?——Depoxsed框架演示
 
作者:周圣韬 来源:CSDN 发布于: 2015-08-31
  2665  次浏览      31
 

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

之前我们介绍过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;
}
});
}
}
   
2665 次浏览       31
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新活动计划
嵌入式软件架构设计 12-11[北京]
LLM大模型与智能体开发实战 12-18[北京]
嵌入式软件测试 12-25[北京]
AI原生应用的微服务架构 1-9[北京]
AI大模型编写高质量代码 1-14[北京]
需求分析与管理 1-22[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...