共计 1819 个字符,预计需要花费 5 分钟才能阅读完成。
分析 Android 的 DeviceID 生产
前面已经把 web 端的分析了一些,要想实现其实容易也难,容易是规则很容易,难是时间生成控制很难, 我之前大概花了一周时间分析和梳理,然后行为测试,之前我已经讲过 canvas 中的 fp 生产,但是怎么生产唯一的 canvas base64,这个就要知道 webgl 了,具体我不阐述。下面我实现后的一些函数结构,大家可以参考
协议
授权协议:只允许研究、学习目的的分享、使用、修改,不允许任何商业用途。转载请注明出处,感谢。
生产出来的函数结构
本文主要讲 android 端的 deviceId 生产规则, 在一些请求的时候会提交这样的阐述,这是 android 端,ios 端类似,只是加密算法不一致而已,我也分析过了。
在 android 端实现,大概是通过 aes 加密,android 端 aeskey 如下
//aes | |
public static aesKey = Buffer.from([ | |
16, | |
-59, | |
20, | |
-5, | |
-54, | |
-85, | |
110, | |
61, | |
-51, | |
-99, | |
70, | |
-78, | |
11, | |
-44, | |
3, | |
5, | |
-120, | |
58, | |
-14, | |
74, | |
13, | |
-122, | |
35, | |
120, | |
14, | |
-60, | |
67, | |
73, | |
-58, | |
-90, | |
42, | |
112, | |
]); |
解密算法
如果我们解密 aes 后其实会得到这样一个对象数据,对象数据拆分,其实就是 0500keylenkeylen
大概是这的格式,每次上传 deviceId,会有一个时间戳,大概算法如下
/** | |
* 获取客户端时间 | |
*/ | |
public static getClientTime(): string {const date = new Date(); | |
let v = `${date.getUTCFullYear()} ${(date.getUTCMonth() + 1).toString().padStart(2, '0')} ${date.getUTCDate().toString().padStart(2, '0')} `; | |
v += `${date.getUTCHours().toString().padStart(2, '0')}:`; | |
v += `${date.getUTCMinutes().toString().padStart(2, '0')}:${date.getUTCSeconds().toString().padStart(2, '0')}.`; | |
v += `${date.getUTCMilliseconds()}`; | |
return v; | |
} |
反序列化函数大概长这样
/** | |
* 反序列化参数 | |
* @param str | |
*/ | |
public static deSerializationInfo(str: string): any {const map: any = {}; | |
let v = str.substring(4, str.length - 4); //0500 | |
const head = v.substring(0, 4); // 头部 | |
const mapLen = parseInt(head, 16); | |
v = v.slice(4); | |
for (let i = 0; i < mapLen; i++) { | |
//key | |
let keyHead = v.substring(0, 4); // 头部 | |
v = v.slice(4); | |
let len = parseInt(keyHead, 16); | |
const key = v.substring(0, len); | |
v = v.slice(len); | |
//body | |
keyHead = v.substring(0, 4); // 头部 | |
v = v.slice(4); | |
len = parseInt(keyHead, 16); | |
const val = v.substring(0, len); | |
v = v.slice(len); | |
map[key] = val; | |
} | |
return map; | |
} |
如果自己实现算法后,尽量要进行顺向加密和逆向解密,这样保证数据是完全没问题的,文本就点播到这里,后面可能会写 android 端 akamai 的生产规则,android 端代码分析比较烦,生产规则也比较复杂,涉及到非对称加密,所以验证起来也比较难。目前这个 akamai 的 bot sdk 大概完工了 2 个部分,一个部分是 web 端的,一个是 android 端的,后续我会开源一个球鞋监控系统和公众号,大家可以关注公众号接收最新的球鞋通知,nice
app 通过手动绑定账号 nice 帮你抢 snkrs 鞋,他们真聪明,账号钱也省了,出问题也不管自己的事,对吧,还可以测试一波自己的 bot 系统是否靠谱,厉害厉害。
博客: https://github.com/zhaojunlike