某东log校验--应用参数获取
本文最后更新于 2024-07-06,文章内容可能已经过时。
下面带来京东log加密的第三部分,也是最后一部分京东App的部分了,该部分为从App获取用户手机信息。
解密JS
JS里面应该是最后一个跟App相关的变量初始化了,解密JS后发现getAppOs()
,该方法即为获取手机信息,可以很明显的看到熟悉JDAppUnite,我们可以直接打开Jadx查看对应的方法。
分析APK
找一下对应的方法,看一下逻辑
获取用户地址和经纬度
追一下getPhoneBasicInfoObj()
方法。
最后一大串put还没仔细看,上面就出现了奇奇怪怪的东西,看着地址和经纬度就感觉不太对,先把App强制停止运行,然后取消GPS权限,把frida掏出来看一下这两处到底获取了个啥(总不会强制获取权限,不给权限不给玩活动吧,不会吧?不会吧?)。
其中encryptAddr的入参如下,很明显应该就是没有获取到相关信息,全都是默认值。
{"Id":0,"IdProvince":0,"IdCity":0,"IdTown":0,"IdArea":0,"Name":"","Where":"","addressDetail":"","longitude":"","latitude":"","CoordType":"","addressDefault":false}
不过encryptAddr(String str)
方法里面有随机数生成,应该是每次都不一样,那么不用瞎搞了,老老实实用他的方法就好了,不然encryptAddr可以直接给上固定值了。
JDLocation不出所料,没获取到,那么最终结果里面的经纬度就全是0.0d
了.
获取用户设备ID
那么继续看StatisticsReportUtil.readDeviceUUID()
吧。
从上面代码可以看出来,读取出来的设备UUID有可能是AndroidId,也可能是一个去掉横线的UUID,不过第一个if条件不太明白是啥意思。直接frida打一下这个方法吧,看一下字符串长度就知道拿到的是UUID还是AndroidId了,毕竟AndoridId只是16位,长度还是很明显的。经过frida打印,该方法正常情况下应该返回的是AndroidId。
组装最终的设备信息
然后将AndroidId加密,初始化JDUUIDEncHelper.EncryptResult
随后处理一下方法最后的返回值封装,链式调用太长了,转成对应的JSON格式为:
{
"appVersion": "11.3.2", // 应用版本号
"addressGlobal": "", // 可以直接给空字符串
"lng": 0, // 可以直接给0
"ip": "192.168.0.110", // 直接给一个内网IP就好了,下面网络类型给wifi
"systemVersion": "11", // 系统版本,这里为Android 11
"uuid": "", // 就是上面通过AndroidId加密处理后重新拼接获取的字符串
"cAddressGlobal": "", // encryptAddr 地址的加密结果,有随机数和随机字符串参数
"appBuild": "98450", // AppBuild,每个版本都有自己对应的
"eufv": "1", // 固定值
"systemName": "android", // 安卓系统
"partner": "xiaomi001", // 这个不知道是啥,最终试用frida打出来是xiaomi001
"model": "Redmi K20 Pro", // 手机机型
"networkType": "wifi", // 网络类型: wifi/UNKNOWN
"brand": "Xiaomi", // 厂商
"aid": "", // AndroidId
"lat": 0, // 可以直接给0
"oaid": "" // oaid,和aid差不多,主要用于给我们精准投放广告吧
}
代码本地实现
将Apk代码拷走,中间aid、oaid随机生成一下就好了。不过拿出来的经纬度frida打印app的时候出来的是整形,然后Jackson拿出来还是浮点型,不管了,影响应该不大,直接把原本类型改掉就好了。
回归JS
上面扒出来其实还是为了给JS那边的变量赋值,最终参数log计算的时候有值。图片重新复制过来一份。
最终调用APP方法的时候,会将Et和Ot重新赋值,这个应该是标识状态。
然后再回调方法中赋值St和jt。
St是一个字符数组,里面值为[机型, 系统名称, 系统版本, APP版本, appBuild版本,aid加密重组后的字符串,固定值1]
jt是aid