Android检测获取MAC权限--基于Xposed的方法检测

Posted 黄毛火烧雪下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android检测获取MAC权限--基于Xposed的方法检测相关的知识,希望对你有一定的参考价值。

android获取敏感信息整改—基于Xposed的方法检测

一、前言

前段时间315针对获取敏感的隐私信息(MAC地址)第一次要求整改时,我们参考了网上的方案:

使用Hook&反射去拦截可能存在的其他第三方调用。

提交后审核还是不通过,我们只能认为:

Hook&反射去拦截的方案是无效的,检测时只要调用获取MAC的方法就会被认为是违规的。

因此我们需要把App首次启动时所有会调用获取MAC的方法,放在同意隐私权限后再初始化。

但是App启动时会默认初始化几十个库&第三方服务,我们需要知道那些库初始化会获取MAC的方法。

二、Xposed

通过查阅各种技术博客得知,Xposed具有这个功能,具体方案流程是:

  • 1.安装Xposed虚拟机VirtualXposed。
  • 2.基于Xposed库开发自定义模块。
  • 3.将Xposed自定义模块添加到Xposed虚拟机中。
  • 4.将我们需要检测的App添加到Xposed虚拟机中。
  • 5.在VirtualXposed中先后启动:Xposed Installer—>Xposed自定义模块—>需要检测的App。
  • 6.将Xposed Installer中的日志导出,并分析。

1.安装Xposed虚拟机

下载页面:VirtualXposed

需要注意的是:VirtualXposed再0.18.2版本之后只支持64位的App。
如果你的App目前还是32位的,只能使用32位 VirtualXposed_0.18.2.apk

下载后安装到手机待用。

2.基于Xposed库开发自定义模块

可以直接下载XposedHook示例代码,修改后编译运行即可。

也可以参照下面的方法自己新建项目后,自定义。

  • 1.引入Xposed库
  implementation 'de.robv.android.xposed:api:82'
  implementation 'de.robv.android.xposed:api:82:sources'
  • 2.自定义Xposed模块代码

如下我们使用XposedHelpers.findAndHookMethod检测获取MAC的方法:getMacAddress&getHardwareAddress,并输出日志。

public class XposedHook implements IXposedHookLoadPackage {
    private static final String TAG = "HookLogin";

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
        if (lpparam == null) {
            return;
        }

        Log.e(TAG, "Load app packageName:" + lpparam.packageName);
        XposedHelpers.findAndHookMethod(
                android.net.wifi.WifiInfo.class.getName(),
                lpparam.classLoader,
                "getMacAddress",
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) {
                        XposedBridge.log("调用getMacAddress()获取了mac地址");
                    }

                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log(getMethodStack());
                        super.afterHookedMethod(param);
                    }
                }
        );

        XposedHelpers.findAndHookMethod(
                java.net.NetworkInterface.class.getName(),
                lpparam.classLoader,
                "getHardwareAddress",
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) {
                        XposedBridge.log("调用getHardwareAddress()获取了mac地址");
                    }

                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log(getMethodStack());
                        super.afterHookedMethod(param);
                    }
                }
        );

    }

    private String getMethodStack() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

        StringBuilder stringBuilder = new StringBuilder();

        for (StackTraceElement temp : stackTraceElements) {
            stringBuilder.append(temp.toString() + "\\n");
        }

        return stringBuilder.toString();
    }
}
  • 3.注册Xposed自定义模块

在main下新建assets资源文件,并新建名为xposed_init文件,在这个文件里面添加 Xposed模块的包名+类名。
如:

com.tsl.app.XposedHook

在AndroidManifest.xml中添加:

 <application>
        <meta-data
          android:name="xposedmodule"
          android:value="true" />

        <!--模块说明,一般为模块的功能描述-->
        <meta-data
          android:name="xposeddescription"
          android:value="这个模块是用来检测用户隐私合规的,在用户未授权同意前,调用接口获取信息属于违规" />

        <!--模块兼容版本-->
        <meta-data
          android:name="xposedminversion"
          android:value="54" />
    </application>

3.将Xposed自定义模块添加到Xposed虚拟机中

编译运行项目,安装到手机。

启动VirtualXposed—>点击菜单:

  • 1.添加应用—>找到Xposed模块应用—>选中后安装
  • 2.模块管理—>勾选—>重启VirtualXposed

4.将需要检测的App添加到Xposed虚拟机中

启动VirtualXposed—>点击菜单–>添加应用—>找到你需要检测的App—>选中后安装

5. 在VirtualXposed中开始检测

在VirtualXposed中先后启动:Xposed Installer—>Xposed自定义模块—>需要检测的App

6. 将Xposed Installer中的日志导出,并分析

已我们的App的日志为例,分析日志中App启动会获取MAC的第三方有:

  • 1.阿里百川淘宝电商sdk
com.taobao.wireless.security.adapter.datacollection.j.c(Unknown Source:11)
com.taobao.wireless.security.adapter.datacollection.j.g(Unknown Source:23)
com.taobao.wireless.security.adapter.datacollection.DeviceInfoCapturer.doCommandForString(Unknown Source:335)
  • 1.MobSdk
com.mob.commons.m.a(TokenFetcher.java:210)
com.mob.commons.m.c(TokenFetcher.java:117)
com.mob.commons.m.b(TokenFetcher.java:96)
com.mob.commons.authorize.a.a(Authorizer.java:709)
com.mob.commons.authorize.a.a(Authorizer.java:49)
com.mob.commons.authorize.a$5.run(Authorizer.java:953)

将这些第三方库都放到同意隐私权限后再初始化,再次按照上面的方法使用Xposed检测。
直到日志中App启动后已经没有任何地方调用获取MAC的方法即可。

三、参考文档

四、GitHab

- XposedHook

以上是关于Android检测获取MAC权限--基于Xposed的方法检测的主要内容,如果未能解决你的问题,请参考以下文章

Android Xpose Hook

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

NR - iOS / Android 相机/相册/日历/定位 等权限 检测+申请代码

MAC认证和MAC旁路认证

Android获取wifi MAC,关闭的wifi不能获取