Android Hook框架Xposed原理与源代码分析
来源:互联网 发布:科比2000年季后赛数据 编辑:程序博客网 时间:2024/05/21 00:45
1 概述
Xposed是GitHUB上rovo89大大设计的一个针对Android平台的动态劫持项目,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
因为Xposed工作原理是在/system/bin目录下替换文件,在install的时候需要root权限,但是运行时不需要root权限。
2 原理
2.1 Zygote
在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。这也是Xposed选择替换app_process的原因。
Zygote进程在启动的过程中,除了会创建一个Dalvik虚拟机实例之外,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法来前面创建的Dalvik虚拟机实例中去。注意,一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。具体的实现可以看下文的Xposed源代码分析。
2.2 Hook/Replace
Xposed 框架中真正起作用的是对方法的hook。在Repackage技术中,如果要对APK做修改,则需要修改Smali代码中的指令。而另一种动态修改指令的技术需要在程序运行时基于匹配搜索来替换smali代码,但因为方法声明的多样性与复杂性,这种方法也比较复杂。
在Android系统启动的时候,zygote进程加载XposedBridge将所有需要替换的Method通过JNI方法hookMethodNative指向Native方法xposedCallHandler,xposedCallHandler在转入handleHookedMethod这个Java方法执行用户规定的Hook Func。
XposedBridge这个jar包含有一个私有的本地方法:hookMethodNative,该方法在附加的app_process程序中也得到了实现。它将一个方法对象作为输入参数(你可以使用Java的反射机制来获取这个方法)并且改变Dalvik虚拟机中对于该方法的定义。它将该方法的类型改变为native并且将这个方法的实现链接到它的本地的通用类的方法。换言之,当调用那个被hook的方法时候,通用的类方法会被调用而不会对调用者有任何的影响。在hookMethodNative的实现中,会调用XposedBridge中的handleHookedMethod这个方法来传递参数。handleHookedMethod这个方法类似于一个统一调度的Dispatch例程,其对应的底层的C++函数是xposedCallHandler。而handleHookedMethod实现里面会根据一个全局结构hookedMethodCallbacks来选择相应的hook函数,并调用他们的before, after函数。
当多模块同时Hook一个方法的时候,Xposed会自动根据Module的优先级来排序,调用顺序如下:
A.before -> B.before -> original method -> B.after -> A.after
源码参见:
Android Hook框架Xposed原理与源代码分析 - H.O.T-WxChevalier - 博客频道 - CSDN.NET
http://blog.csdn.net/wxyyxc1992/article/details/17320911
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed原理与源代码分析
- Android Hook框架Xposed详解:从源代码分析到开发指南
- Android Hook框架Xposed详解
- Android Hook框架Xposed入门
- Android Hook框架Xposed进阶
- Android Hook框架Xposed入门
- Android.Hook框架xposed篇
- Android Hook框架Xposed入门
- android hook 框架 xposed 如何实现注入
- Xposed Android hook框架入门 -开发步骤
- Xposed hook原理
- 阿里系产品Xposed Hook检测机制原理分析
- 删除数组重复元素的方法
- DIV结构的点击收缩展开左边栏代码(html+css+js)
- 【不定期更新】常用下载资源整合
- 幂等策略-尝试插入
- 在Android开发中使用ORMLite--篇一
- Android Hook框架Xposed原理与源代码分析
- Java 多维数组遍历详解
- 读取文件夹下的所有文件
- 关于数据结构中栈的若干使用
- MathType破解版中窗口灰色问题该怎样解决
- python登录认证HTTP并打印头信息
- idea下导出可执行的jar包并在windows中双击运行的解决方法
- phalapi-入门篇3(请求和返回)
- Spring中PROPAGATION_REQUIRED的意思?