检查 “同意用户隐私” 之前的隐私代码调用(epic > DexposedBridge)
最近在小米开放平台上线时,驳回报告中说在用户同意之前获取了设备ID。
一般来说,合规政策推出这么久了,又上线了这么多次,正常业务流程是不会再出现这种问题,就是怕一些第三方库在ContentProvider做初始化,然后调用了TelephonyManager的getDeviceId或getImei方法,这可能会导致未经用户同意就获取设备ID的情况。解决办法首先就是要找到调用这2个方法的代码位置,然后再避免在用户同意之前获取设备ID。
要找出这样的代码,或者要实现一些类似判断app是否调用了某些方法的情况,靠肉眼和逻辑分析可能会很难受,还需要借助工具来帮我们判断。
现在我要说的工具就是epic库中的DexposedBridge类,这个是它的中文说明文档:epic/README_cn.md at master · tiann/epic · GitHub 。这个库类在本文论述中的作用就是检测app中是否调用了某些方法。
下面我们直接上使用步骤。
一、库的引入
1、在工程级的build.gradle中添加:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
2、在主模块的build.gradle中添加:
implementation 'com.github.tiann:epic:0.11.2'
implementation 'com.github.tiann:epic:0.11.2@aar'
3、确保主模块的build.gradle中配置的CPU架构仅仅是:
abiFilters "arm64-v8a"
为什么只是它?因为上面那个链接里面有说:
4、确保你运行的设备的是 Android 5.0 ~ 11,原因见上图。
二、准备要监听的方法配置表
在主模块的assets目录新建一个叫privacy.json的文件,文件内容如下:
{
"methods": [
{
"className": "android.telephony.TelephonyManager",
"method": "getDeviceId"
},
{
"className": "android.telephony.TelephonyManager",
"method": "getImei"
}
]
}
这个代码的意思很明显了,就是要监听className这个类当中的method方法。在本例中,就是要检查下app是否调用了TelephonyManager的getDeviceId和getImei方法。
三、实现对方法的监听(专业点叫Hook)
import android.content.Context;
import android.util.Log;import com.lancoo.homework.util.JsonUtil;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;import de.robv.android.xposed.DexposedBridge;
import de.robv.android.xposed.XC_MethodHook;public class MyHook {public static void initPrivacy(Context context) {try {InputStream is = context.getAssets().open("privacy.json");Privacy privacy = JsonUtil.parseJson(getJson(is), Privacy.class);if (privacy == null) {Log.e("My", "没发现privacy.json,或者privacy.json里面没正确的东西");return;}ArrayList<PrivacyMethod> methods = privacy.methods;for (PrivacyMethod method : methods) {hookMethod(method.className, method.method);}} catch (IOException e) {e.printStackTrace();}}private static void hookMethod(String className, String method) {Class<?> clazz;try {clazz = Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();Log.e("My", "没发现privacy.json里面的className: " + className);return;}DexposedBridge.findAndHookMethod(clazz, method, new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);Log.e("My", "beforeHookedMethod: this:" + param.thisObject, new RuntimeException("stack"));}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}private static String getJson(InputStream is) {StringBuilder sb = new StringBuilder();try {BufferedReader reader = new BufferedReader(new InputStreamReader(is));String s;while ((s = reader.readLine()) != null) {sb.append(s);sb.append("\n");}reader.close();} catch (IOException e) {e.printStackTrace();}return sb.toString();}public static class Privacy {private ArrayList<PrivacyMethod> methods;}public static class PrivacyMethod {String className;String method;}
}
四、监听调用
在你的Application的onCreate方法的super.onCreate()下一行代码打上MyHook.initPrivacy(this)。
class App : MultiDexApplication() { override fun onCreate() {super.onCreate()MyHook.initPrivacy(this)// ...}
}
这样你就可以监听到所有调用被监听方法的地方了。
五、查看监听反馈
我们先看MyHook中的下面这句代码:
Log.e("My", "beforeHookedMethod: this:" + param.thisObject, new RuntimeException("stack"));
这句代码的意思就是,在app的业务代码中,如果有地方调用 TelephonyManager.getDeviceId 或getImei,都会被epic的beforeHookedMethod拦截到,我们只需要在beforeHookedMethod打印出堆栈,即可看到是谁调用的。打印堆栈也很简单,我们就让他抛出一个异常即可在LogCat中看到。
六、@#¥%……&*
说个秘密:这个思路我是从App 隐私合规代码排查思路!获得的,只不过我把坑都列出来了,这样一来,小伙子们只要原原本本按照我这个步骤就可以搞定了。
检查 “同意用户隐私” 之前的隐私代码调用(epic > DexposedBridge)相关推荐
- 苹果 M1 单核性能勇超 Intel 11 代 i7;经纬张颖:用户增长与保护隐私不矛盾;阿里云盘正式公测 | EA周报
EA周报 2021年3月26日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.6 名黑客因盗取区块链货币被抓,涉案 1450 万 2.2020 年,腾讯 ...
- 苹果手机隐私分析数据是什么_苹果公司以用户为中心的隐私保护方法能教给我们什么?
苹果手机隐私分析数据是什么 重点 (Top highlight) Moving beyond the rollercoaster of excitement and controversy Apple ...
- 个性化广告的未来:通过隐私计算技术实现用户个人信息及隐私全生命周期保护
2022年6月20日,<财经>商业治理研究院与中国社科院大学互联网法治研究中心联合发布了<个性化广告合规发展研究报告--从个人信息保护角度出发>(以下称<报告>). ...
- ios获取新数据要不要关_100%安卓APP都在获取用户隐私,网络隐私进入深入区
(图片来源:全景视觉) 经济观察网 记者 任晓宁 "很多时候用户对自己的隐私是麻木的,"腾讯社会研究中心总监王晓冰去年开始与DCCI一块合作做互联网数据隐私报告,今年1月底的报告发 ...
- HomeKit、米家、智汀智能家居应该如何确保用户的安全和隐私
智能家居行业发展迅速,各类智能家居设备在一点一点的步入我们的家庭中. 但智能家居设备毕竟是物联网设备,在网络安全和隐私泄漏方面,大家还是存有疑惑的,人们的担忧开始浮出水面.由于过度依赖云基础设施和互联 ...
- Android底层隐私数据,100%安卓APP都在获取用户隐私,网络隐私进入深入区
原标题:100%安卓APP都在获取用户隐私,网络隐私进入深入区 (图片来源:全景视觉) 经济观察网 记者 任晓宁"很多时候用户对自己的隐私是麻木的,"腾讯社会研究中心总监王晓冰去年 ...
- 【Google Play】Android 应用隐私政策 ( 生成隐私政策 | HTML 隐私政策模板 | Markdown 隐私政策模板 )
文章目录 一.生成隐私政策 二.HTML 隐私政策模板 三.Markdown 隐私政策模板 一.生成隐私政策 推荐使用 https://toolbox.yolo.blue/#/privacy-poli ...
- 隐私保护与隐私计算研讨会 | 余维仁:大数据时代下需要各界更新对个人隐私保护的固有认识
8月13日下午,由深圳市信息服务业区块链协会.陀螺研究院.矩阵元主办,中国生物识别与计算机视觉科技创新产业联盟.金砖国家未来网络研究院中国分院.中国船舶综合技术经济研究院.深圳市人工智能产业协会.深圳 ...
- 《三国塔防游戏》隐私政策》隐私政策
三国塔防游戏尊重和保护利用用户的隐私所有的服务.为了向您提供更准确,更人性化的服务,将三国塔防游戏使用和披露按照本隐私政策您的个人信息. 但是三国塔防游戏将是一个高度的勤勉,审慎义务对待这些信息.除本 ...
- 微信小程序获取用户收货地址 完整代码
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. 获取用户收货地址需要用户点击授权,所以有两种情况,确认授权.取消授权. 情况一,用户第一次访问用户地址授权,并 ...
最新文章
- AIX下镜像制作与取消,更换硬盘
- ifelse语句是否必须以else结尾?
- 常用打开新页面的方法
- .NET Core 2.0 Preview2 发布汇总
- HTML如何添加锚点,总结到位
- ITU衡量信息社会报告:我国ICT发展指数进入亚太前十
- gulp html页面路径,通过gulp-connect部署静态页面,html页面中include路径无法get!
- Box(-and-Whisker) Plot SPSS and Excel 箱图学习
- oracle regexp_instr,Oracle REGEXP_INSTR 用法
- selenium无头浏览器
- 高考方向计算机基础试题题库,计算机基础考试题库 计算机基础考试题库(含答案).doc...
- 牛人搜集的常用的资源类网站及68个各类资源网站汇总
- Testin云测:深耕企业应用服务
- 2010南非世界杯32强手绘海报
- 深度Linux怎样关闭休眠,deepin如何休眠,
- 大数据分析服务器硬件配置如何选择
- 古筝d调变降e调怎么办_古筝各个调式转调详细解读
- 三菱GX Developer+GX Simulator进行仿真调试
- C++初阶学习————二叉树进阶(二叉搜索树)
- python anaconda下载包_anaconda python 2.7