IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> App合规检测方法 -> 正文阅读

[移动开发]App合规检测方法

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

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

一.安装模拟器

Xposed使用需要root权限。

有两种方案:

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

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

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

https://www.xyaz.cn/

二.安装Xposed框架

https://os-android.liqucn.com/rj/123789.shtml

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

https://dl-xda.xposed.info/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 (!"cn.globalph.housekeeper".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后即可解决。

参考文档:

https://blog.csdn.net/fanhenghao/article/details/117441230

https://blog.csdn.net/qq_34627459/article/details/117382475

https://blog.csdn.net/weixin_42430341/article/details/113043216

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:36:36  更:2021-07-24 11:38:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 4:17:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码