Android应用隐私合规检测实现方案
一、准备工作
1、安装夜神模拟器安卓7.0版本,自带Xposed框架
二、编写Xposed模块
1、在Android Studio新建一个Android App项目
2、在build.gradle中添加xposed的编译依赖
dependencies {
compileOnly 'de.robv.android.xposed:api:82'
}
3、记得配置阿里云或者jcenter()仓库

4、在AndroidManifest.xml application标签下添加对应属性的设置
<!--告诉xposed框架这是一个xposed模块-->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!--模块描述-->
<meta-data
android:name="xposeddescription"
android:value="隐私合规检测工具" />
<!--模块支持Xposed的最低版本-->
<meta-data
android:name="xposedminversion"
android:value="53" />
5、新建一个类实现IXposedHookLoadPackage接口的handleLoadPackage方法
public class PrivacyHook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (loadPackageParam.packageName.startsWith("com.sswl")) {
XposedBridge.log("PrivacyHook has Hooked!");
//检测mac的获取
Class<?> NetworkInterfaceCls = XposedHelpers.findClass("java.net.NetworkInterface", loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(NetworkInterfaceCls, "getNetworkInterfaces", new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.w("Xposed", "=============================================================");
XposedBridge.log("调用getNetworkInterfaces");
StackTraceElement[] stackTrace = new Exception().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
Log.e("Xposed", "" + stackTrace[i]);
}
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
//获取IMEI
Class<?> Imei = XposedHelpers.findClass("android.telephony.TelephonyManager", loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(Imei, "getDeviceId", new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.w("Xposed1", "=============================================================");
XposedBridge.log("调用getDeviceId");
StackTraceElement[] stackTrace = new Exception().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
Log.e("Xposed", "" + stackTrace[i]);
}
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
//获取IMSI
Class<?> Imsi = XposedHelpers.findClass("android.telephony.TelephonyManager", loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(Imsi, "getSubscriberId",int.class, new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.w("Xposed2", "=============================================================");
XposedBridge.log("调用getSubscriberId");
StackTraceElement[] stackTrace = new Exception().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
Log.e("Xposed", "" + stackTrace[i]);
}
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
//检测androidId的获取
Class<?> SystemCls = XposedHelpers.findClass("android.provider.Settings$Secure", loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(SystemCls, "getStringForUser", ContentResolver.class, String.class, int.class, new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.w("Xposedadam", "=============================================================");
XposedBridge.log("调用getStringForUser");
StackTraceElement[] stackTrace = new Exception().getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
Log.e("Xposed", "" + stackTrace[i]);
}
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
}
}
}
6、根据需要hook的方法参数决定

7、在assets目录下新建文件名为:xposed_init 的文本文件,并将刚才新建的那个类的完整类名填写到第一行,比如:
com.sswl.xposed.PrivacyHook

8、将应用打包出来安装到模拟器上,然后点模块进行安装,然后重启生效

9、运行需要检测的应用,就可以在Android Studio查看日志打印
