1. 背景
xposed 对于很多安卓安全和逆向人员来说并不陌生,在对 app 的函数功能分析和拦截时经常会用到。本文以 xposed 修改某个应用的 IMEI 为例,作为一个简单入门介绍。供新手了解如何使用 xposed 编写自己所需的 hook 模块,以及简单介绍 xposed 在其他方面的应用场景。
2. 环境要求
手机系统:4.4.4-8.0 手机环境:必须为 root 环境 本文环境为:nexus 6P(android7.1.2)
3. xposed 环境配置所需文件
第三方 recovery:twrp-3.2.1-1-hammerhead.img 手机 root 管理:SR5-SuperSU-v2.82-SR5-20171001224502.zip xposed 框架:xposed-v89-sdk25-arm64.zip hook 模块管理 apk:XposedInstaller_3.1.4.apk
4. xposed 框架刷入步骤
4·1 刷入第三方 recovery:twrp (twrp-3.2.1-1-hammerhead.img)
可在 https://twrp.me/Devices/ 中查找你自己手机型号的版本。下载后将其 push 到手机 sdcard 根目录下。
a) adb reboot bootloader b) fastboot flash recovery twrp-3.2.1-1-hammerhead.img c) 不要重启,不要重启,不要重启,直接音量键选择进入 recovery 模式 d)刷入 twrp 成功的话,此时会进入 twrp 界面
4·2 xposed 框架的刷入
紧跟上一步:点击 Install 选择安装 xposed-v89-sdk25-arm64.zip 框架。
4·3 刷入获取 root 管理工具
提前将下载的 SR5-SuperSU-v2.82-SR5-20171001224502.zip 包 push 到 sdcard 根目录,同4·2步骤一样,选择 SR5-SuperSU-v2.82-SR5-20171001224502.zip 后刷入。
4·4 最后安装 XposedInstaller(可在 xposed 官网下载)
可通过 adb 命令进行安装:adb install XposedInstaller_3.1.4.apk
5. hook 模块的编写
以上环境搭建好了之后就可以编写我们的第一个 hook 模块了,我们以 Device Id 这个 app 为例进行篡改它的IMEI。
5·1 创建一个空的安卓工程
5·2 修改 AndroidManifest.xml 添加如下三个 meta-data
5·3 导入 Xposed api 库(XposedBridageApi-54.jar,xposed 官网提供下载)
XposedBridageApi.jar 复制到 app/libs 后,通过 build.gradle 引入。
5·4 编写 hook 模块的入口 MainHook 类,实现 IXposedHookLoadPackage 接口
5·5 配置文件 hook 模块主入口(告诉 xposed 从这里开始启动 hook 逻辑)
在 app/src/main/ 下创建文件夹 assets,并创建文件 xposed_init,将入口类全路径配置到该文件中。
6.开始编写 hook 代码
6·1 定位要 hook 的函数
我们修改软件的 IMEI 这一行作为目标测试,修改前如下图展示:
通过反编译工具确定获取 IMEI 的 api,对其进行 hook,通过反编译工具分析后确定 acr 类的 c 方法是返回 IMEI 的值,我们 hook 此方法修改返回值达到篡改 IMEI 的目的。
6·2 完整 hook 代码如下
当然还可以通过 hook 安卓获取 IMEI 的 api 来进行篡改 IMEI(一劳永逸,此处留给感兴趣的同学自己来实现)。
package com.phone.fakeimei;
import android.content.Context;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class MainHook implements IXposedHookLoadPackage {
private static final String TAG = "fakeimei";
//只对目标应用Device Id进行hook
public static String needHookApp = "com.evozi.deviceid";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if(!loadPackageParam.packageName.equals(needHookApp)){
return;
}
Log.d(TAG,"发现要hook的app包名:"+loadPackageParam.packageName);
//load要hook的类,判断是否存
Class<?> acrClazz = XposedHelpers.findClassIfExists("acr", loadPackageParam.classLoader);
if(null!=acrClazz){
Log.d(TAG,"发现要hook的app类:"+acrClazz.getSimpleName());
XposedHelpers.findAndHookMethod(acrClazz, "c", Context.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
//hook 之前操作:可以修改入参
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
//hook之后,可以修改返回值
String realImei =(String) param.getResult();
String fakeImei = "123456789";
Log.d(TAG,"真的IMEI:"+realImei+"假的IMEI:"+fakeImei);
//用假的替换真的IMEI 调用setResult方法
param.setResult(fakeImei);
}
});
}
}
}
6·3 编译 hook 模块打包为 apk,再勾选 hook 模块,然后选择重启设备(软重启在7.0手机上有时不生效)手机使 hook 模块生效
7. 模块生效后的 hook 效果
8. xposed 在其他方面的应用
xposed 作为一款 hook 工具它的应用场景有很多,并不仅仅只是一个工具而已,如上所述你可以用来修改手机的设备信息,来模拟一台新的手机。
8·1 保护个人隐私信息
比如,你不想接受电商推送的广告或者垃圾短信,由于安卓权限的开放泛滥,很多 app 都会收集手机号,联系人,最近通话记录等等,甚至有些收集短信内容。每当电商狂欢节时会收到一堆的所谓的优惠券垃圾短信。你可以利用 xposed 将关键信息 hook 掉,在某些 app 获取你的敏感信息时返回假的数据或者空,拦截骚扰短信等,以此保护个人隐私。
8·2 黑灰产的利用 xposed 一键新机
利用 xposed 配合成熟的设备模拟插件,可以实现一键新机,一台手机变多台,羊毛党常用来薅电商的羊毛,目前很多电商判断一个新注册用户是否为新用户的时候,往往会采集设备的一些信息,而非单一的从注册时间来判断。羊毛党们为了降低成本,通常会采用 xposed 不定期模拟出一台新设备的方式,甚至能模拟出手机的文件路径,地理位置,电量,和通话记录信息等等。
在618,双十一电商大战中的百亿补贴,不仅吸引了众多用户,更吸引了羊毛党,无数用户在准备下单时发现商品已处售罄的状态,然而真实情况可能是已经被羊毛党捷足先登,甚至于在今年的十月一时,某个电器旗舰店因此面临倒闭的风险。
8·3 app 的去广告,模拟点击等等
某些 app 的自动点击,关注,甚至视频类 app 的去广告,某些 app 的优惠活动,抢单之类等等,都会发现 xposed 的身影。