之前我们介绍过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框架类似的方法。

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 该系统是否支持hook*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">synchronized</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">canDexposed</span>(Context context)/*** 寻找并hook一个指定的方法* @param clazz 类的<span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span>* @<span class="hljs-title" style="color:#66066;box-sizing: border-box;">param</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">methodName</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">hook</span>的方法名称* @<span class="hljs-title" style="color:#66066;box-sizing: border-box;">param</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">parameterTypesAndCallback</span> 参数和返回<span class="hljs-title" style="color:#66066;box-sizing: border-box;">callback</span>* @<span class="hljs-title" style="color:#66066;box-sizing: border-box;">return</span> */
<span class="hljs-title" style="color:#66066;box-sizing: border-box;">public</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">static</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Unhook</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">findAndHookMethod</span>(<span class="hljs-title" style="color:#66066;box-sizing: border-box;">Class</span><?> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">clazz</span>, <span class="hljs-title" style="color:#66066;box-sizing: border-box;">String</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">methodName</span>, <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Object</span>... <span class="hljs-title" style="color:#66066;box-sizing: border-box;">parameterTypesAndCallback</span>)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

在线热补丁实例

如何进行在线的热补丁呢?我们这里以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方法的定义

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">MainActivity</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">extends</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Activity</span> {</span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">//..........一些忽略掉的代码</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">showDialog</span>() {AlertDialog.Builder builder = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> AlertDialog.Builder(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>);builder.setTitle(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Dexposed sample"</span>).setMessage(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Please clone patchsample project to generate apk, and copy it to \"/Android/data/com.taobao.dexposed/cache/patch.apk\""</span>).setPositiveButton(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"ok"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> DialogInterface.OnClickListener() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(DialogInterface dialog, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">int</span> whichButton) {}}).create().show();}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

在线热补丁,Path.apk中的代码

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 插件的补丁类*/</span>
<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">DialogPatch</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IPatch</span> {</span><span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handlePatch</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> PatchParam arg0) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {       <span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 获取主程序的ClassLoader</span>Class<?> cls = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 获取主程序的MainActivity类</span>cls= arg0.context.getClassLoader().loadClass(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.taobao.dexposed.MainActivity"</span>);} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">catch</span> (ClassNotFoundException e) {e.printStackTrace();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// hook并替换MainActivity中的showDialog方法</span>DexposedBridge.findAndHookMethod(cls, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"showDialog"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> XC_MethodReplacement() {<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> Object <span class="hljs-title" style="box-sizing: border-box;">replaceHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 弹出一个插件中的Dialog</span>Activity mainActivity = (Activity) param.thisObject;AlertDialog.Builder builder = <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> AlertDialog.Builder(mainActivity);builder.setTitle(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Dexposed sample"</span>).setMessage(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"The dialog is shown from patch apk!"</span>).setPositiveButton(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"ok"</span>, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> DialogInterface.OnClickListener() {<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(DialogInterface dialog, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">int</span> whichButton) {}}).create().show();<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">null</span>;                 }});}}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>

原文地址: http://blog.csdn.net/yzzst/article/details/47954479

无需Root也能Hook?——Depoxsed框架演示相关推荐

  1. 重磅!VirtualXposed,让你无需Root也能使用Xposed框架!

    VirtualXposed 是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现(支持5.0~8.1).一直以来Xposed框架最大的入门难度就在于设备需要Root, ...

  2. Android免Root环境下Hook框架Legend原理分析

    0x1 应用场景 现如今,免Root环境下的逆向分析已经成为一种潮流! 在2015年之前的iOS软件逆向工程领域,要想对iOS平台上的软件进行逆向工程分析,越狱iOS设备与安装Cydia是必须的!几乎 ...

  3. 干货|Android免Root最全Hook插件(免Root Hook任意App)

    支持276个API接口的Hook,覆盖Android系统级API和50个常见开源框架的Hook,包括对网络.算法.TextView.WebView.JSONObject等API接口的Hook支持,可以 ...

  4. 太极root权限_太极下载无需root

    太极下载无需root app是一款不需要刷机也不需要ROOT就能使用的系统工具.在这里随时都能帮助用户们使用安卓XP框架的安卓插件,并且不需要ROOT就能直接在线运行,还支持对收集去进行解BL刷机等多 ...

  5. C++版Android实时投屏软件系统源码,安卓手机投屏软件源码,无需root权限

    QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制.无需root权限. 同时支持 GNU/Linux ,Windows 和 MacOS 三大主流桌面 ...

  6. screenrecord 使用_【玩机组出品】无需ROOT,教你adb shell screenrecord录屏

    [adb录屏优点] 01.无需ROOT手机,理论上适用Android 4.4及以上系统: 02.录屏视频质量高,不易出现,卡帧和闪屏情况. [adb录屏不足] 01.必须要借助电脑: 02.不能同步录 ...

  7. 手机录屏录音不用愁,这些方法无需ROOT就能内录声音!

    现在不少人喜欢用视频分享生活,除了外拍视频,或多或少也有需要内录视频的时候,比如录个操作步骤啊.游戏视频啊,或者录个网课.录首歌啥的- 之前也有不少粉丝留言问过我这个问题,所以今天就打算来和大家简单分 ...

  8. Nexus5 Android6.0.1 MOB30H 刷机、获取ROOT、刷入xposed框架

    Nexus5 Android6.0.1 MOB30H 刷机.获取ROOT.刷入xposed框架 本文仅供学习交流使用,如侵立删! 知识准备 刷机之前需要了解的一些知识 ROM刷机 ROM是ROM im ...

  9. OEA 框架演示 - 快过原型的开发

    OEA框架经过几次较大的重构后,已经慢慢地变得成熟. 09年末.10年初的时候,我们发布了<OEA1.0>.至今也一年多了,中间我们并没有发布它最新的源码.所以有些朋友问到是不是这个框架已 ...

最新文章

  1. Centos-安装Docker并使用Docker安装mysql遇到的问题以及解决方法
  2. 驰骋工作流程引擎案例-水质检测工作流程设计开发实现过程
  3. 创新、颠覆、引领,从 0 到百亿美元市值的创操作指南
  4. 利用JDBC连接数据库(MySQL)
  5. 用计算机桁架各杆内力,运用AUTO CAD求解桁架内力?
  6. 小白vue_web前端开发:新手学习前端应该先学vue还是react?
  7. Android,EditText,InuputType
  8. Skin++ For VS2010 使用教程
  9. 机器学习-随机森林之回归
  10. CentOS 5和6的启动流程
  11. vue中进度条写法_Vue进度条progressbar组件功能
  12. Java烤地瓜简单小案例
  13. 怎么看懂晦涩难懂的书
  14. 南大周志华教授入围院士候选!计算机领域共计7人
  15. 微型计算机系统与接口重要吗,微型计算机系统与接口 马宏锋 等编著 第六章
  16. Facebook产品的开发流程
  17. python 百度云不限速版_现在各位是怎么应对百度网盘限速的?
  18. VM虚拟机局域网搭建
  19. 【人才盘点九宫格】你还不来学一学人才九宫格,知道领导在做人才梯度结构盘点时把你划分为属于哪一类人才吗?
  20. 基于PCA的图像压缩实现

热门文章

  1. 《JavaScript语言精髓与编程实践》读书笔记二
  2. Server Tomcat v6.0 Server at localhost was unable to stat within 45 seconds
  3. 问题小结(6)-listview滚动条相关
  4. 将keepalived添加到系统服务中
  5. STM32—— AHB、APB详解
  6. linux中系统调用和库函数的区别
  7. [云炬创业管理笔记]第五章打磨最有效的商业模式测试1
  8. [云炬创业基础笔记]第二章创业者测试18
  9. USTC English Club Note20171015
  10. 阴差阳错2019-12-13