背景
Xposed,是Android平台上最负盛名的一个逆向分析框架,使用这个框架,我们可以加载很多插件App,这些插件App可以直接或间接操纵系统层面的东西,比如操纵一些本来只对系统厂商才开放的功能。例如,使用插件APP可以hook到系统任意一个Java进程(zygote,systemserver,systemui好不啦!)。
当然,Xposed功能的确很强大,但也有缺点,需要root,所以每次为它启用新插件APP都需要重新启动。但最新的VirtualXposed 则不需要Root。
目前,Xposed支持32位和64位的dalvik以及ART,同时支持selinux。其中:
- 32位dalvik上非selinux模式下的xposed实现原理;
- 64位、selinux模式其实难度不在虚拟机上,而是在selinux上。
VirtualXposed
VirtualXposed是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现,支持Android5.0到8.1版本。是为了修复Xposed需要Root才能Hook的缺陷,官网地址为:https://github.com/android-hacker/VirtualXposed。
首先到 VirtualXposed发布页面 下载最新的VAExposed安装包安装到手机上,其使用上和Xposed的使用相似,打开 VirtualXposed,在里面安装要使用的APP,以及相应的Xposed模块即可。
注意:所有的工作(安装Xposed模块,安装APP)必须在VirtualXposed中进行,否则Xposed模块不会有任何作用!比如,将微信直接安装在系统上(而非VirtualXposed中),防撤回安装在VirtualXposed中;或者把微信安装在VirtualXposed上,防撤回插件直接安装在系统上;或者两者都直接安装在系统上,均不会起任何作用。
不过,目前VirtualXposed也还存在一些兼容性问题。由于暂不支持资源HOOK,因此资源钩子不会起任何作用;使用资源HOOK的模块,相应的功能不会生效。部分插件的兼容性有问题,比如QX模块。
Xposed工程简介
Xposed是一个庞大的工程,包含多个项目,项目主要使用Java和C、C++来实现。项目的源代码可以通过https://github.com/rovo89/Xposed和https://github.com/android-hacker/XposedBridge来获取。Xposed包含如下几个工程:
-
XposedInstaller:Xposed的插件管理和功能控制APP,也就是说Xposed整体管控功能就是由这个APP来完成的,它包括启用Xposed插件功能,下载和启用指定插件APP,还可以禁用Xposed插件功能等。注意,这个app要正常无误得运行必须能拿到root权限。
-
Xposed:这个项目属于Xposed框架,其实它就是单独搞了一套xposed版的zygote,这个zygote会替换系统原生的zygote。所以,它需要由XposedInstaller在root之后放到/system/bin下。
-
XposedBridge:这个项目也是Xposed框架,它属于Xposed框架的Java部分,编译出来是一个XposedBridge.jar包。
-
XposedTools:Xposed和XposedBridge编译依赖于Android源码,而且还有一些定制化的东西。所以XposedTools就是用来帮助我们编译Xposed和XposedBridge的。
1,编译Xposed
1.1 下载支持库
根据XposedTools的说明,我们先要修改下AOSP源码里的.repo,关于如何下载ASOP,可以参考网上的介绍,本文以Android4.4.4源码进行讲解。
下面就下载支持库的具体步骤如下:
-
进入AOSP/.repo目录。
-
在.repo目录下新建local_manifests目录。
-
把XposedTools/local_manifests/下的目标文件拷贝过去。local_manifests/目录下是各种API版本(即SDK=19,21之类)对应的xml文件。由于本例对应的SDK版本是19,所以需要把该目录下xposed_sdk19.xml文件拷贝到.repo/local_manifests/目录下。
其中,
-
remote:新添远程仓库地址为github。
-
第一个project:为frameworks/base/cmds/下新增加xposed工程。当然,这个工程我们刚才下载过了。你可以直接copy到指定目录下。
-
remove-project:移除AOSP/build目录。xposed有自己的处理。
-
第二个project:下载xposed自己的build。path=”build”,表示下载路径就是AOSP/build。
配置好后,请在AOSP目录下执行repo sync。这样它会根据manifests更新AOSP源码。当然,也可以只是下载frameworks/base/cmds/xposed工程和更新build工程。
注意,repo sync是一个重型操作,会导致所有工程都进行一次同步。所以,最好的办法是直接下载和更新对应的工程,比如,下载xposed工程,用repo sync frameworks/base/cmds/xposed即可。
1.2 修改build.conf
下面我们进入XposedTools目录,然后修改其中的build.conf文件。该文件用于指示AOSP源码等参数。XposdTools提供了一个build.conf.sample模板,图2中的build.conf文件是在这个模板基础上修改而来。红框中是我修改的结果。其他选项没有变化。
1.3 执行build.pl
到XposedTools目录下,执行:./build.pl -t arm:19命令,这表明我要编译arm平台上SDK=19版本的xposed框架。注意,./build.pl –help会打印出使用方法。build.pl是一个perl脚本。
可以发现build.pl跑到AOSP源码目录下,执行了:
-
. build/envsetup.sh:初始化AOSP编译环境。
-
lunch aosp_flo-userdebug:选择交叉编译平台。注意,这一块我是修改了XposedTools/xposed.pom,使它单独为我的nexus
7编译,而不是针对ARM平台做generic的编译。
-
make -j4 xposed libxposed_dalvik:编译xposed和libxposed_dalvik这两个目标文件。
在使用build.pl时,它还依赖一些Perl的类库,这些库包括:
-
sudo apt-get install libconfig-inifiles-perl
-
sudo apt-get install libio-all-perl
-
sudo apt-get install libfile-readbackwards-perl
-
sudo apt-get install libfile-tail-perl
-
sudo apt-get install libtie-ixhash-perl
build.pl执行过程中,如果报还有其他依赖库未找到,请通过下面命令
apt-cache search perl XXX 1
来查找需要apt-get install哪个目标库。XXX是build.pl执行过程中报错时提供的库信息。
编译结果是一个xposed-v65-arm-custom-build-xyz-20151030.zip包,这个包可以通过recovery刷到手机上。包的内容就是files文件夹下的内容,包含:
-
system/bin/app_process_xposed:xposed版zygote。
-
system/bin/libxposed_dalvik.so:xposed框架的native层。
-
system/xposed.prop:xposed框架信息,包含版本号等。
2, XposedInstaller
XposedInstaller是Xposed的App,用于管理Xposed框架和插件App。本节我们主要讨论它是如何安装Xposed框架和插件App的。
2.1 安装Xposed框架
郑重声明:手机安装xposed框架有变砖的风险,慎重!!!
首先,在安装xposed需要Root系统,在Android5.0版本以下可以直接安装。
从Android 5.0开始,谷歌使用ART替换Dalvik,所以xposed安装有点麻烦,分为两个部分:xposed*.zip和XposedInstaller_3.1.apk。zip文件是框架主体,需要进入Recovery后刷入,apk文件是xposed模块管理应用,主要用于下载、激活、是否启用模块等管理功能。
1,首先,根据需要下载xposed*.zip 文件,源码下载地址为:http://dl-xda.xposed.info/framework/。
根据自己的Android版本来选择对应的sdk版本,然后根据自己手机cpu的位数,如果是64位cpu则下载 arm64 文件夹中的文件,否则下载arm文件夹中的,x86一般是模拟器用的。博主下载的是xposed-v86-sdk23-arm64.zip。sdk21 是 Android 5.0,SDK22 是 Android 5.1,SDK23 是 Android 6.0,SDK27 是 Android 8.0.
2,接着下载XposedInstaller_xxx.apk ,例如下载XposedInstaller_3.1.1.apk
3,刷入TWRP
Android 的 Recovery 可以简单理解为windows的PE系统,PE系统有很多,像番茄花园、雨林木风之类的,那么Android里面呢,我们用TWRP这个Recovery系统。相关介绍可以从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机
到这里选择你的设备对应的twrp recovery版本去下载。
注意:一定要下载你的设备对应的twrp版本
接着刷入twrp,先连接手机,进入开发者模式,打开usb调试,用下面的命令:
adb reboot bootloader1
进入bootloader,接着用下面的命令刷入twrp,例如本机刷入的是twrp-3.0.2-2-angler.img镜像。
fastboot flash recovery twrp-3.0.2-2-angler.img1
4,用TWRP刷入xposed*.zip
成功输入TWRP之后,将我们下载的xposed*.zip文件放到sdcard上,博主以xposed-v86-sdk23-arm64.zip为例,接着进入Recovery。
关机后同时按住电源键和音量下键3秒钟,就会进入bootloader,接着按两下音量减键,看到recovery,电源键确认进入,此时屏幕下方会有一个滑动条,向右拉即可:
点击安装,选择我们放在sdcard上的xposed-v86-sdk23-arm64.zip,然后把滑动条拉到右边即可开始安装:
5,安装XposedInstaller_3.1.1.apk
刷入完毕后,第一次开机可能要优化应用,这是正常的,接着安装XposedInstaller_3.1.1.apk就可以开始愉快的使用xposed啦。
2.2 安装xposed插件
xposed插件,在xposed世界里我们说它是插件,但是放到Android世界里它就是一种特殊的APP。这种类型的APP由xposed框架识别并加载,然后hook到其他的App进程。