前不久上市场遇到“违规获取用户隐私”相关调整,所以看到一文章(Android 违规获取用户隐私(获取MAC地址)整改)。 用Hook系统方法来实现实现功能,但觉得有点麻烦,需要每个Activity和Service都要调用特定方法。就想有没有全局hook的实现,最后找到 Whale这个hook库还比较方便,但 只支持Android5.0.0 ~ 9.0.0,不过作为调试工具也够用了。 在自己项目,我是建了个调试用的hook分支,来排查用户同意协议前哪里调用了id类方法,然后做相应修改。完成后代码提交到master分支,hook相关逻辑仅在hook分支。
作者提供了所有代码,让用户直接复制到项目中使用,有点麻烦。我Fork了一份代码,然后增加了个whale-jitpack打包
implementation 'com.github.DonaldDu:whale:1.0.0'
以下是hook的逻辑代码,尽早调用WhaleHook.init(),以确保在能hook到对就方法。
object WhaleHook {
fun init() {
hookAndroidId()
}
private fun hookAndroidId() {
XposedBridge.log("start androidId")
//android.provider.Settings.Secure#getString
val clazz = android.provider.Settings.Secure::class.java
val getString = clazz.getDeclaredMethod(
"getString", android.content.ContentResolver::class.java, java.lang.String::class.java
)
XposedBridge.hookMethod(getString, object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
val key = param.args.last()
if (key == android.provider.Settings.Secure.ANDROID_ID) {
val msg = "hookAndroidId to 0"
println(msg)
Exception(msg).printStackTrace()//print call StackTrace
param.result = "0"
}
}
})
}
}