无需Root也能Hook?——Depoxsed框架演示
2016-03-09 10:09
218 查看
之前我们介绍过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原理的,可以看这里
/article/1460543.html
没有Root权限,那么Xposed框架式无法替换app_process的,当然也就无法进行整个系统
级应用程序的注入了。当然,对自我程序本身还是没有问题的。
目前Dexposed的主要应用场景有以下几种:
AOP编程
插桩 (如测试、性能监控等)
在线热补丁
SDK hooking以提供更好的开发体验
AOP为Aspect Oriented
Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程
序功能的统一维护的一种技术。
看到这里,很多小伙伴估计都会产生疑问,我靠,不能进行登录劫持了,不能注入广告
了。我用你来干什么。/(ㄒoㄒ)/~
![](http://img.blog.csdn.net/20150825005855623)
也介绍过Android的插件实现方式。这里我们所用Dexposed框架来实现的话,插件模型将
会更加简单。
首先先介绍一下,Dexposed框架也提供了一个与Xposed框架类似的方法。
如在主线版本中,我们有一个showDialog方法。已经发布出去了。但是,突然发现有一
点bug或者突发性需求,我们不能够理解的发版更新。
这里就能够通过之前我们所说的DexClassLoader的方式,载入线上的插件Path.apk
。
2. 通过Dexposed框架,动态的Hook并替换主线版本中的showDialog函数方法。
具体的逻辑如下图所示:
![](http://img.blog.csdn.net/20150825232235869)
看到上面的效果说明图之后,相信大家对Dexposed的在线热补丁已经有一定的了解了。
这里我们也不用做过多的赘述。
当然,你可能想到很多使用热补丁的应用方向,比如:
Bug补丁修复
插件功能
等等
Dexposed框架原理很简单,功能也算不上强大。但是,确实特别实用。我也是推荐各大
Android开发者,特别是创业公司使用。是墙裂推荐!!
下面是主工程中与补丁工程中的逻辑实现。这里,童鞋们可以对比着效果图看一下。
如果大家对动态的使用DexClassLoader载入一个apk代码还存在疑问。 可以clone一下
dexposed的源码学习学习。
当然,这里还是推荐大家去我的博客看看,Android的插件原理。
地址:/article/1460559.html
主工程中,MainActivity showDialog方法的定义
在线热补丁,Path.apk中的代码
原文地址: http://blog.csdn.net/yzzst/article/details/47954479
登录劫持,和广告注入。
但是,之后很多朋友都在问我,这个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原理的,可以看这里
/article/1460543.html
没有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或者突发性需求,我们不能够理解的发版更新。
这里就能够通过之前我们所说的DexClassLoader的方式,载入线上的插件Path.apk
。
2. 通过Dexposed框架,动态的Hook并替换主线版本中的showDialog函数方法。
具体的逻辑如下图所示:
看到上面的效果说明图之后,相信大家对Dexposed的在线热补丁已经有一定的了解了。
这里我们也不用做过多的赘述。
当然,你可能想到很多使用热补丁的应用方向,比如:
Bug补丁修复
插件功能
等等
Dexposed框架原理很简单,功能也算不上强大。但是,确实特别实用。我也是推荐各大
Android开发者,特别是创业公司使用。是墙裂推荐!!
下面是主工程中与补丁工程中的逻辑实现。这里,童鞋们可以对比着效果图看一下。
如果大家对动态的使用DexClassLoader载入一个apk代码还存在疑问。 可以clone一下
dexposed的源码学习学习。
当然,这里还是推荐大家去我的博客看看,Android的插件原理。
地址:/article/1460559.html
主工程中,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
相关文章推荐
- __all__=[]的作用
- 真机测试别人的demo才出现"The identity used to sign the executable is no longer valid"
- linux ACL
- CentOS7mini版本启动网卡、替换yum源
- Windows netstat 查看端口、进程占用、杀掉进程
- foreach 遍历 datatable中row
- Java集合框架(二)
- 学习记录条
- Android运用自己的标题栏
- HDUACM2018
- 世界上最遥远的距离是计算机不懂人类的时间
- ScrollView自由定位
- jQuery学习基础总结
- RecyclerView的使用之多种Item加载布局
- Android Layouts概述
- 关于UART的学习与应用
- Android 常用小知识之break/continue语句
- Android Studio代码混淆和破解apk
- SSH 显示中文乱码
- 关于数据库事务、隔离级别、锁的理解与整理(转)