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