分析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