ovhmhmk 发表于 2019-10-17 20:21:11

Android逆向之Xposed详解

## 背景

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。

首先到 (https://github.com/android-hacker/VirtualXposed/releases) 下载最新的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包含如下几个工程:

- (https://github.com/rovo89/XposedInstaller):Xposed的插件管理和功能控制APP,也就是说Xposed整体管控功能就是由这个APP来完成的,它包括启用Xposed插件功能,下载和启用指定插件APP,还可以禁用Xposed插件功能等。注意,这个app要正常无误得运行必须能拿到root权限。

- (https://github.com/rovo89/Xposed):这个项目属于Xposed框架,其实它就是单独搞了一套xposed版的zygote,这个zygote会替换系统原生的zygote。所以,它需要由XposedInstaller在root之后放到/system/bin下。

- (https://github.com/rovo89/XposedBridge):这个项目也是Xposed框架,它属于Xposed框架的Java部分,编译出来是一个XposedBridge.jar包。

- (https://github.com/rovo89/XposedTools):Xposed和XposedBridge编译依赖于Android源码,而且还有一些定制化的东西。所以XposedTools就是用来帮助我们编译Xposed和XposedBridge的。

## 1,编译Xposed

### 1.1下载支持库

根据XposedTools的说明,我们先要修改下AOSP源码里的.repo,关于如何[下载ASOP](http://blog.csdn.net/u012914419/article/details/58113659),可以参考网上的介绍,本文以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 XXX1
```

来查找需要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 ,例如下载(https://forum.xda-developers.com/attachment.php?attachmentid=3921508&d=1477916609)

3,刷入TWRP

Android 的 Recovery 可以简单理解为windows的PE系统,PE系统有很多,像番茄花园、雨林木风之类的,那么Android里面呢,我们用TWRP这个Recovery系统。相关介绍可以[从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机](http://blog.csdn.net/fuchaosz/article/details/52473660)
到这里选择你的设备对应的(https://twrp.me/Devices/)去下载。

**注意:一定要下载你的设备对应的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,电源键确认进入,此时屏幕下方会有一个滑动条,向右拉即可:

![这里写图片描述](https://img-blog.csdn.net/20180316110839727)

点击安装,选择我们放在sdcard上的xposed-v86-sdk23-arm64.zip,然后把滑动条拉到右边即可开始安装:

![这里写图片描述](https://img-blog.csdn.net/2018031611093937)

5,安装XposedInstaller_3.1.1.apk

刷入完毕后,第一次开机可能要优化应用,这是正常的,接着安装XposedInstaller_3.1.1.apk就可以开始愉快的使用xposed啦。

### 2.2 安装xposed插件

xposed插件,在xposed世界里我们说它是插件,但是放到Android世界里它就是一种特殊的APP。这种类型的APP由xposed框架识别并加载,然后hook到其他的App进程。

页: [1]
查看完整版本: Android逆向之Xposed详解