Xposed(也被称作Xposed框架、XP框架、Xposed framework),是运行于Android操作系统的一个著名的免费开源Hook框架。其通过替换Android系统的关键文件,可以拦截几乎所有Java函数的调用,并允许通过模块扩展方式来实现各种功能,模块中的自定义代码可以更改调用函数时的行为,常被用来修改Android系统和应用程序的功能。用户可以在一些应用商店或其自带的下载库来下载安装各种模块,相比于重新安装系统来获得新功能,Xposed提供了一种更便捷的方式[1][2]。Xposed模块可以很容易的开启和关闭。你只需要激活或者禁用Xposed模块,然后重启手机即可。
Xposed框架的标志
但如今,随着Android系统的不断更新,Xposed框架逐渐无法在新设备上运行。此时,EdXposed团队成为了后续版本研发的继任者。2019年1月,ElderDrivers完成了EdXposed的开发。EdXposed是一个Magisk模块,依赖于riru框架,成功将Xposed移植到了Android Pie上,成为最接近原版Xposed的框架。2019年9月,EdXposed正式支持Android Q。2020年1月,EdXposed与Xposed原开发团队达成共识,成为Xposed停止更新后的官方接任者[3]。
EdXposed有如下几个特点:
1. 完全支持Android Pie和Q,甚至也可以支持R。
2.EdXposed具有“应用列表”模式。可以选择要应用Xposed模块进行hook的的应用程序,而系统中的其他应用程序在完全干净的环境中运行。
3. EdXposed使用Riru注入,不修改libart和app_process。
安装和使用
对于Xposed,Xposed Installer是Xposed框架的官方安装器,可以在拥有root权限的设备上安装Xposed框架。Xposed Installer也提供模块的下载、管理、日志显示等功能[4]。鉴于Xposed已经不再适用于新的Android系统,并且网上已经有非常多的教程,在此就不再赘述了。下面着重介绍一下EdXposed的安装方法。
由于框架的核心点是系统进程注入技术,需要拥有设备的root权限,而且针对不同型号的设备和系统版本需要选择正确的框架版本,满足条件才能安装。
首先,我们需要解除手机的BL锁,对于不同品牌的手机,解锁方式有所不同。以小米手机为例,可以在官方网站进行申请,步骤较为简单[5]。
其次,需要在手机上安装第三方Recovery,此处以TWRP为例。
2.1. 下载并安装ADB/FASTBOOT支持,安装完成后启动手机进入fastboot模式,连接电脑。在命令行中输入fastboot devices并执行,如果显示当前的连接手机,则安装成功。
2.2. 打开TWRP官网[6],在Devices页面选择自己的机型对应的TWRP安装包,例如小米6,进入后点击对应的下载链接:
点击想要下载的版本,如twrp-3.4.0-0-sagit.img进行下载:
下载完成后,在命令行中输入“fastboot flash recovery D:\twrp-3.4.0-0-sagit.img”(刚刚下载的twrp路径)并执行。
提示刷入成功后,重启进入twrp Recovery页面,如小米是同时按开机键和音量上键进入。
2.3. 下载Magisk的zip卡刷包和apk安装文件(https://www.download-magisk.com),并使用数据线导入到手机中。在twrp首页,点击“安装”,选择刚刚下载的Magisk的zip包进行安装。
安装成功后,重启系统,安装Magisk的apk管理软件。
打开Manager应该可以看到安装成功的页面。
2.4. 参考EdXposed的官方文档的Install步骤[7],安装EdXposed:
2.4.1. 在Magisk Manager的“下载”中安装 Riru(Riru - Core)和 Riru - EdXposed 后重启手机。
2.4.2. 下载安装EdXposed Manager[8],安装完成后打开可以看到EdXposed框架已激活。
开发
本节中将介绍如何在AndriodStudio 4.0.1开发环境下创建一个简单的EdXposed模块。其实,EdXposed模块也是一个 Android 程序。与普通程序不同的是,编写EdXposed模块时需要完成以下4个任务:
1)让手机上的EdXposed框架知道我们安装的这个程序是个EdXposed模块。
2)模块里要包含有EdXposed的API的jar包,以实现下一步的Hook操作。
3)这个模块里面要有对目标程序进行Hook操作的方法。
4)要让手机上的EdXposed框架知道,我们编写的EdXposed模块中,哪一个方法是实现Hook操作的。
下面开始按步骤进行:
3.1. 新建项目,可以选择Empty Activity,进入项目页面,在项目目录中找到AndroidManifest.xml文件,插入如下代码:
本步骤主要对Xposed模块进行声明。
3.2. 手机连接Android Studio,运行刚刚编写的代码,在手机里会安装一个app,同时,EdXposed框架中会显示出这个模块。
3.3. 配置Xposed API的依赖。在AndroidStudio 4.0.1中,可以在项目目录中找到build.gradle,插入以下代码。完成之后,build.gradle会提示文件已经修改,点击 “sync now”进行同步。
本步骤设置了jcenter作为代码仓库,直接从这个仓库里远程寻找de.robv.android.xposed:api:82 的API。
3.4. 下面打开activity_main.xml,在界面上加入一个button,并在MainAcitiviy里插入以下代码:
本步骤在MainActivity界面上加入了一个按钮,打开app后点击按钮后会弹出一个toast提示,该提示的内容由 toastMessage() 方法提供,而toastMessage()的返回值为“我在正常运行”。
至此,我们已经搭建好一个app靶子,其中包含一个之后用来hook的按钮,在关闭和启动Xposed模块时会显示不同的toastMessage。
3.5. 下面编写hook代码。在MainActivity的路径下新建一个类“HookTest.java”,插入以下代码:
此处通过IXposedHookLoadPackage接口中的handleLoadPackage方法来实现Hook并篡改按钮的toastMessage。需要设置目标程序的包名,在XposedHelpers.findAndHookMethod中设置想要Hook的类和方法。在afterHookedMethod方法(用来定义Hook了目标方法之后的操作)中,修改了toastMessage()方法的返回值为“嘿嘿!你已被劫持!”,对应之前点击按钮后显示的文字提示。
3.6. 下面设置Xposed模块入口。在main文件夹中新建assets文件夹,并在其中新建文件xposed_init,文件类型text,并在其中填写刚刚编写的hook类路径“com.example.test.HookTest”。此时,EdXposed框架就能够从这个 xposed_init 读取信息来找到模块的入口,然后进行Hook操作了。
3.7. 在File -> Settings -> Build, Execution, Deployment ->Debugger找到hotSwap,把Enable hotswap的勾去掉。
3.8. 点击“运行”!在EdXposed框架里找到自己写的模块,打上勾启动模块,重启手机。
3.9. 打开app点击按钮显示劫持成功。
总结
本文介绍了EdXposed框架的前世今生,安装使用和模块编写,而EdXposed框架的强大不止于此,更多功能大家有兴趣可以自己体验。
Reference:
[1].https://www.xda-developers.com/xposed-framework-hub/
[2].https://github.com/rovo89/XposedBridge/wiki/Development-tutorial#how-xposed-works
[3].https://zh.wikipedia.org/zh-hans/Xposed_(%E6%A1%86%E6%9E%B6)
[4].https://repo.xposed.info/module/de.robv.android.xposed.installer
[5].http://www.miui.com/unlock/index.html
[6].https://twrp.me/
[7].https://github.com/ElderDrivers/EdXposed
[8].https://github.com/ElderDrivers/EdXposedManager/releases
作者:高宇
来源:51Testing软件测试网原创