App合规检测方法

缘由:华为上架始终检测出,用户同意前获取Mac地址信息,但是第三方SDK的初始化都已经改成在用户授权之后了,因此需要检测是哪款SDK获取的Mac地址。

方法:通过Xposed检测不合规方法的调用情况。

一.安装模拟器

Xposed使用需要root权限。

有两种方案:

1.真机装VirtualXposed,但是这边使用后发现始终得不到结果。

2.下载带root权限的模拟器。亲测可行。

本次使用的模拟器为 逍遥模拟器 版本7.5.5

【逍遥安卓模拟器】安卓模拟器电脑版_安卓模拟器哪个好用_逍遥安卓模拟器下载官网

二.安装Xposed框架

xposed安装器下载-xposed框架模块下载-xposed框架安装器下载官方app(暂未上线)

下载后拖进模拟器安装。安装过后提示无法下载zip,这时需要手动安装。

Index of /framework/

下载对应版本,这边下载的是 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

android 获取imei_Android隐私API合规策略及检测方法_Boa波雅的博客-CSDN博客

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值