本文最后更新于 2024-07-06,文章内容可能已经过时。

下面带来京东log加密的第三部分,也是最后一部分京东App的部分了,该部分为从App获取用户手机信息。

解密JS

JS里面应该是最后一个跟App相关的变量初始化了,解密JS后发现getAppOs(),该方法即为获取手机信息,可以很明显的看到熟悉JDAppUnite,我们可以直接打开Jadx查看对应的方法。

image-20230117164250290.png

分析APK

找一下对应的方法,看一下逻辑

image-20230120104316197

获取用户地址和经纬度

追一下getPhoneBasicInfoObj()方法。

image-20230120110903384

最后一大串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()吧。

image-20230120113648176

从上面代码可以看出来,读取出来的设备UUID有可能是AndroidId,也可能是一个去掉横线的UUID,不过第一个if条件不太明白是啥意思。直接frida打一下这个方法吧,看一下字符串长度就知道拿到的是UUID还是AndroidId了,毕竟AndoridId只是16位,长度还是很明显的。经过frida打印,该方法正常情况下应该返回的是AndroidId。

组装最终的设备信息

然后将AndroidId加密,初始化JDUUIDEncHelper.EncryptResult

image-20230120114742172

随后处理一下方法最后的返回值封装,链式调用太长了,转成对应的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拿出来还是浮点型,不管了,影响应该不大,直接把原本类型改掉就好了。

image-20230120192519261

回归JS

上面扒出来其实还是为了给JS那边的变量赋值,最终参数log计算的时候有值。图片重新复制过来一份。

image-20230117164250290.png

最终调用APP方法的时候,会将Et和Ot重新赋值,这个应该是标识状态。

然后再回调方法中赋值St和jt。

St是一个字符数组,里面值为[机型, 系统名称, 系统版本, APP版本, appBuild版本,aid加密重组后的字符串,固定值1]

jt是aid