轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
一起源码网 门户 安卓源码 查看主题

Xposed框架

发布者: 飞雪 | 发布时间: 2017-12-13 15:32| 查看数: 5666| 评论数: 1|帖子模式

有关Xposed框架的说明有一大堆,这篇blog写得比较详细。最近也在利用Xposed框架开发基于短信的应用,这里进行总结一下。
Xposed框架是是GitHUB上rovo89设计的一个针对Android平台的动态劫持项目。通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。与采取传统的Inhook方式相比,Xposed在开机的时候完成对所有的Hook Function的劫持,在原Function执行的前后加上自定义代码。
因为Xposed工作原理是在/system/bin目录下替换文件,在install的时候需要root权限,但是运行时不需要root权限。此外,需要在Android 4.0以上版本的机器中才能运行。
Xposed的部分核心源码在github上是开源的,主要的模块和包如下:

  1. XposedBridge.jar
    Xposed提供的jar文件,负责在native层和framework层进行交互,Android系统的/system/bin/app_process进程启动过程中会加载该jar包,Xposed框架所有Modules的开发与运行都是基于该jar包的支持

  2. Xposed
    Xposed框架中的C++部分,主要用来替换app_process文件,同时为XposedBridge提供JNI方法

  3. XposedInstaller
    Xposed的安装包,负责配置Xposed的工作环境,并提供管理框架模块、激活应用模块、下载应用模块、日志等功能

  4. XposedMod
    基于Xposed框架开发的模块(Module),如其中的AppSettings是一个可进行权限动态管理的应用

Xposed的hook原理

在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的Dalvik虚拟机实例。这也是Xposed选择替换app_process的原因。除此之外,Zygote进程在启动的过程中,还会将Java运行时库加载到进程中来,以及注册一些Android核心类的JNI方法到前面创建的Dalvik虚拟机实例中去。
Xposed框架通过替换系统目录下/system/bin/app_process进程,进而控制zygote进程,最后使得app_process进程在启动的过程中,加载其框架的XposedBridge.jar包,令每个Android应用程序启动时,都加载XposedBridge.jar包。XposedBridge.jar具有一个私有的Native(JNI)方法hookMethodNative,它提供一个方法对象,利用java中的反射机制进行对内置方法的覆写,从而实现对Android系统API的hook。
综上所述,Xposed框架实现hook的具体流程如下:
1) Android系统启动,zygote进程加载XposedBridge.jar包;
2) Xposed将所有需要替换的Method通过JNI方法hookMethodNative处理,将方法对象作为输入参数,并改变Dalvik虚拟机中对于该方法的定义,hookMethodNative会将该方法的类型变为native,同时,将此方法的实现链接到本地通用类的方法;
3) hookMethodNative将被hook的Method指向Native方法xposedCallHandler,使得Method被调用时,其通用类的方法运行,不影响其调用者;
4) xposedCallHandler转入handleHookedMethod,利用它传递Method相应的参数,控制方法执行流程,根据开发者输入的参数,在原方法执行之前或者之后运行替换的函数。

Xposed模块及相关方法介绍

在Android系统环境中对Xposed框架进行安装后,开发者可以通过编写Xposed模块的方式使用Xposed框架的接口。Xposed模块设定了部分特殊数据标志位,因此需要在应用程序的工程中进行相应的配置。
1) Xposed模块编写配置
具体应用实现中,需要在AndroidManifest.xml文件中添加如下内容:

<meta-data  android:name="xposedmodule"  android:value="true" />

同时需要将XposedBridge.jar包导入工程,并在assets目录下新建“xposed_init”文件,在文件中说明需要加载到XposedInstaller的入口类。完成相应的配置后,即可按照开发一般Android应用程序的方式进行开发,开发完成后在有Xposed框架的Android环境中安装,安装完成后激活相应的应用并重启,此模块就会依赖于Xposed框架正常运行。
2) Xposed接口方法介绍
Xposed提供了丰富的接口方法以便开发者调用,其中较为常用的接口方法有handleHookedMethod、findAndHookedMethod等,下面对这些较常用的方法进行说明。
IXposedHookLoadPackage中的handleLoadPackage方法主要用于加载应用程序包时执行用户的操作。类似于一个统一调度的Dispatch例程,在Xposed源码中,其对应的C++函数是xposedCallHandler。其函数原型如下:

public void handleHookedMethod(final LoadPackageParam lpparam)

其中参数lpparam是所加载的应用程序的基本信息,包括packageName、processName、APPInfo等。
XposedHelpers类中findAndHookedMethod方法主要用于寻找需要进行hook的类及其相应的方法,并在原方法调用前或调用后运行自定义的替换函数。其函数原型如下:

findAndHookMethod(
String className,//需要进行hook的类名
ClassLoader classLoader,//类加载器,可以为空
String methodName,// 需要进行hook的方法名
Object... parameterTypesAndCallback//参数集,目标方法的参数类及回调
)

其中,回调分为如下两种:
XC_MethodHook:在目标方法执行前/后运行相应的替换函数;
XC_MethodReplace:完全替换目标方法,执行用户自定义的新方法。
在findAndHookedMethod方法的XC_MethodHook回调中,有beforeHookedMethod和afterHookedMethod两种方法,其函数原型如下:

beforeHookedMethod(
MethodHookParam param
)

该方法在hook目标方法执行前调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息;

afterHookedMethod(
MethodHookParam param
)

该方法在hook目标方法执行后调用,其中,参数param指的是目标方法的相关参数、回调、方法等信息。
Xposed运行多个模块对同一个方法进行hook时,框架就会根据Xposed模块的优先级来排序,在具有a.before、a.after、b.before、b.after的情况下,运行的先后顺序如下:

a.before -> b.before ->originalMethod -> b.after -> a.after

XposedBridge类中hookAllMethods和log方法主要用于一次hook每个类的所有方法或够造函数。其原型如下:

hookAllMethods(
Class<?> hookClass,//需要进行hook的类
String methodName,//需要进行hook的方法名
XC_MethodHook callback//回调函数
)

最新评论

522177857 发表于 2022-5-5 13:37
免费音乐歌曲下载app

浏览过的版块

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表