缘由:华为上架始终检测出,用户同意前获取Mac地址信息,但是第三方SDK的初始化都已经改成在用户授权之后了,因此需要检测是哪款SDK获取的Mac地址。
方法:通过Xposed检测不合规方法的调用情况。
一.安装模拟器
Xposed使用需要root权限。
有两种方案:
1.真机装VirtualXposed,但是这边使用后发现始终得不到结果。
2.下载带root权限的模拟器。亲测可行。
本次使用的模拟器为 逍遥模拟器 版本7.5.5
【逍遥安卓模拟器】安卓模拟器电脑版_安卓模拟器哪个好用_逍遥安卓模拟器下载官网
二.安装Xposed框架
xposed安装器下载-xposed框架模块下载-xposed框架安装器下载官方app(暂未上线)
下载后拖进模拟器安装。安装过后提示无法下载zip,这时需要手动安装。
下载对应版本,这边下载的是 xposed-v89-sdk25-x86.zip,下载后改名为xposed.zip.
打开模拟器,找到模拟器路径,我这是:E:\Program Files\Microvirt\MEmu(默认D盘安装)
将xposed.zip复制到这里,同时创建 install.bat。内容为:
adb root
adb remount
adb push ./xposed /system
adb shell su -c "cd /system/;sh memu-script.sh"
pause
创建好后双击执行。
执行完成后可以看到模拟器上的Xposed已下载到文件。
重启模拟器生效。
三.App中编码实现检测方案。
1.gradle中添加依赖(dependencies下)
provided 'de.robv.android.xposed:api:82'
2.创建检测类
public class HookApi implements IXposedHookLoadPackage {
private static final String TAG = "Xposed";
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws ClassNotFoundException {
try{
if (lpparam == null) {
return;
}
// 判断hook的包名
if (!your_application_id.equals(lpparam.packageName)) {
return;
} else {
Log.e(TAG, "API检测");
} // 固定格式
XposedHelpers.findAndHookMethod(
android.telephony.TelephonyManager.class.getName(), // 需要hook的方法所在类的完整类名
lpparam.classLoader, // 类加载器,固定这么写就行了
"getDeviceId", // 需要hook的方法名
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getDeviceId()获取了imei");
}
}
);
XposedHelpers.findAndHookMethod(
android.telephony.TelephonyManager.class.getName(),
lpparam.classLoader,
"getDeviceId",
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getDeviceId(int)获取了imei");
}
}
);
XposedHelpers.findAndHookMethod(
android.telephony.TelephonyManager.class.getName(),
lpparam.classLoader,
"getSubscriberId",
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getSubscriberId获取了imsi");
}
}
);
XposedHelpers.findAndHookMethod(
android.net.wifi.WifiInfo.class.getName(),
lpparam.classLoader,
"getMacAddress",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getMacAddress()获取了mac地址");
}
}
);
XposedHelpers.findAndHookMethod(
java.net.NetworkInterface.class.getName(),
lpparam.classLoader,
"getHardwareAddress",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getHardwareAddress()获取了mac地址");
XposedBridge.log(Log.getStackTraceString(new Throwable()));
}
}
);
XposedHelpers.findAndHookMethod(
android.provider.Settings.Secure.class.getName(),
lpparam.classLoader,
"getString",
ContentResolver.class,
String.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用Settings.Secure.getstring获取了" + param.args[1]);
// XposedBridge.log(Log.getStackTraceString(new Throwable()));
}
}
);
XposedHelpers.findAndHookMethod(
LocationManager.class.getName(),
lpparam.classLoader,
"getLastKnownLocation",
String.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("调用getLastKnownLocation获取了GPS地址");
}
}
);
}catch (Exception e){
XposedBridge.log(e.getMessage());
}
}
}
3.创建xposed_init,在main/assets目录下,创建名称必须是 xposed_init 的文本文件,里面内容为HookApi的完整路径入 com.xxx.xxxx.HookApi
4.在xml中加上以下代码
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="这是一个xposed应用"/>
<meta-data
android:name="xposedminversion"
android:value="82"/>
5.至此xposed相关内容添加完毕。
四.将项目通过Xposed检测
1.将项目安装到模拟器(模拟器路径下打开cmd,执行 adb.exe connect 127.0.0.1:21503 可连接AS)。
2.打开Xposed,左上角菜单中勾选安装的项目。然后重启模拟器。
3.模拟器重启后打开Xposed,模块 中点击对应项目运行。
4.项目运行后,打开Xposed菜单中的日志,查看是否有相关的获取手机信息的日志。
5.如果确实有日志,比如过去Mac地址,则在HookApi中Hook Mac地址的方法里加上
XposedBridge.log(Log.getStackTraceString(new Throwable()));
来查看具体的堆栈信息,找到对应的第三方SDK。
至此,检测就完成了,之后就是相应的修改了,我这边是友盟的SDK版本过低,即使没有调用初始化方法也获取了Mac地址,升级友盟SDK后即可解决。
参考文档:
Xposed无法载入可用的ZIP文件(Could not found ZIP files)_还吹着风、的博客-CSDN博客_无法载入可用的zip文件 请下滑试试
手动安装Xposed5.1.1框架zip包,解决Could not found ZIP files报错_韭零后程序猿的博客-CSDN博客_xp框架zip