受这篇文章——《定制Xposed框架》启发,决定自己也尝试一下。
尝试的过程中发现,文章写得太“简约”了,基本上毫无细节,后人想下手或复现非常困难,对Xposed
各模块之间的关系也没有介绍,有点“干”,不易于理解,于是有了此文。
本文细节非常多,相当于手把手,篇幅过长所以分拆成三篇:
部分附件(镜像、刷机文件等)位于我的github:https://github.com/r0ysue/AndroidSecurityStudy 的FART/picC
文件夹中。
话不多说,进入正题,既然想要抹掉XPOSED
框架的特征,那么首先得知道XPOSED
框架有哪些特征,才能有的放矢、对症下药。
从Xposed
官方发布频道得知,sdk27
版本(也就是安卓8.1)的Xposed
还是beta
的状态:
最新的正式版是sdk25
(也就是安卓7.1),已经是2017
年的了:
当然最重要的还是Github
主页上开源的版本只到v89
,也就是安卓7.1
;而不是安卓8
的v90
系列。
Xposed
今后应该也不会更新了,我们以android-7.1.2_r8
版本来进行编译。
首先只需要收集特征,我们先下载其线程的谷歌镜像进行刷机即可:
在Link
上右键复制链接地址,可以直接黏贴到国内环境的浏览器里下载的,也可以直接wget
:
下载完成后进行解压:
如果电脑里没有安装fastboot
,可以先下载一下:
解压并将fastboot
命令加入当前终端的路径中去:
测试一下当前终端中有fastboot
命令了么?如果有,会打印出一堆帮助信息。
将手机进入bootloader
模式,这里以pixel
一代sailfish
为例,刚刚下载的镜像也是专为sailfish
这个型号准备的。首先完全关闭手机(可以等关机息屏后再等待一分钟),然后按住音量向下键,再按开机键开机,手机会进入如图状态,就是bootloader
模式:
usb
线连接到电脑后,可以使用fastboot
命令检测到:
如果系统是在VMware
里,那么要确保usb
口连接到VMware
里的Linux
系统。
最终就是进入刚刚解压出来的sailfish
镜像文件夹,运行其中的flash-all.sh
命令即可。
安装成功就会出现finished
字样,并且手机重启,进入系统。
貌似Magisk
环境与XPOSED
是有冲突的,不然不会有[Magisk] Systemless Xposed v89.3/v90.2-beta3 (SDK 21-27)这种产物了,所以幸亏我们选择的是7.1.2
,用老牌的SuperSU
还是支持的。
SuperSU
官网提供的下载已经无法下载了,所以在其他网盘里找到个能用的SR3-SuperSU-v2.82-SR3-20170813133244.zip,用TWRP
刷进这个SuperSU
就行了。
TWRP
则使用这个版本:twrp-3.2.1-0-sailfish.img,先都下载了。
选择Reboot System
→ Do Not Install
即可。
下载安装最新版xposed.installer_3.1.5_apkmirror.com.apk),下载完安装和打开,然后安装Xposed
的底包,具体流程见下图。
安装、重启完成后,须出现“Xposed
框架89版已激活”字样,绿色勾勾(而不是红色或黄色)。在Xposed Installer
的“下载”模块里找到GraviryBox[N]
安装和激活,然后让状态栏文字变成如图绿色康康(原来为白色)。
到这里框架和插件都安装成功并正常使用了。
从手机里把底包抽出来,也就是xposed-v89-sdk25-arm64.zip
,应该就是服务器上的https://dl-xda.xposed.info/framework/sdk25/arm64/xposed-v89-sdk25-arm64.zip
,解压康康发现里面东西很多。
这个里面最关键的就是安装包文件做了什么,这里只取最关键的康康,其余拷贝证书之类的,心里有数就好:
也就是说该脚本的实质,把确保安装包没有下错,跟系统环境是匹配的,以及把不同的文件放到相应的位置上去。这里我们有了基本的概念,至少我们最终编译出来的可以刷机的包,得包含下列文件,他们最终会被放在系统的system/bin/
、system/framework/
、system/lib64/
位置上。
简单地搜下字符串,可以看到几乎所有的二进制文件中都含有xposed
的字符串,我们最终的目标最起码要拿掉xposed
的字符串特征。
这些文件的用途及与源码的比对我们下一章再详细介绍。
Xposed
插件在运行的时候会输出日志,如下图:
可以提取出来看个完整的:
可以观察到主要涉及的文件也就是/system/framework/XposedBridge.jar
,也就是前文中放到/system/framework/
的XposedBridge.jar
文件,可见XposedBridge.jar
文件在Xposed
插件的运行中起到了关键的作用。
根据官方tutorial
,典型的插件开发流程分为:
比如编写下述java
的hook
代码,最终效果就是改变系统时钟颜色:
可以看到引入的包都位于de.robv.android.xposed
包中,当然这也是引入Xposed Framework API
时被包含进项目的:
官网最新的版本还是api-82.jar
、api-source-82.jar
。
下载来看下里面的内容,一个是.class
字节码,一个是.java
源代码而已。
随便打开个文件来康康,IXposedHookLoadPackage.java
:
里面的各种xposed
特征字符串到处都是。
也就是说,如果我们更改了xposed
的字符串特征,也要制作这样的一份api-82.jar
、api-source-82.jar
,供开发者编写代码时进行调用。
并且开发者在编码时,使用的系列API
中,至少不存在xposed
字样。
到这里正常的Xposed
插件开发及使用流程中可以搜集到的特征就都有了,接下来看一个专业检测Xposed
的App
,看看它主要检测哪些方面。
作者已经将源码开源:XposedChecker,安装包位于app
目录中,名字叫Xposed Checker 4.apk
,先装上去跑一下,申请root
权限时点击“同意”,结果如下图所示,可信度竟然5/9,我的GravityBox
插件还在跑着,状态栏还变着色:
这个结果肯定是不准确的,那四个绿色的项目中,只有“检测虚拟Xposed环境”是对的,毕竟我们不是VirtualXposed
,而是真实的Xposed
。其他三项出现了失误,可以看看它的源码怎么写的,主要的检测逻辑位于app\src\main\java\ml\w568w\checkxposed\ui\MainActivity.java
文件中,定义了以下功能:
Android逆向之旅---破解某支付软件防Xposed等框架Hook功能检测机制
阿里系产品Xposed Hook检测机制原理分析
美团出品-Android Hook技术防范漫谈
看雪出品-企业壳反调试及hook检测分析
支付宝小专栏-无需 Root 也能使用 Xposed
抖音短视频检测 Xposed 分析(一)
抖音短视频检测 Xposed 分析(二)
检测Android虚拟机的方法和代码实现
以上每一篇都看过来之后,发现文章还是比较过时的,现在大部分风控都是写在so
中,检测项目可能多达成百上千项,并且Ollvm
甚至自家vmp
来混淆下,不会让你轻易地找到并patch
的;只是他们收集了环境特征后只是加密上传,并不会把app
退掉让你发现而已。
针对这种加固/风控的行为特征,可能比较好的方案就是修改aosp
系统源码,打更多的埋点,收集so
的检测项目,形成一个checklist
;或者unicorn
来模拟执行,只是现在对抗unicorn
的技术也越来越多,unicorn
的终极形态,就是一个完整的安卓系统;所以不如直接改系统。
当然我们不用分析那么远,只需要简单修改XPOSED
的字符串,过简单的根据字符串特征的XPOSED
检测是没有问题的。
在下一篇中我们将介绍XPOSED
框架之间的关系,以及如何编译使用原版XPOSED
框架,最后一篇中再来简单更改特征。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!