5.分析snkrs的Android的DeviceID生產規則

  • 2019 年 11 月 1 日
  • 筆記

分析Android的DeviceID生產

前面已經把web端的分析了一些,要想實現其實容易也難,容易是規則很容易,難是時間生成控制很難,我之前大概花了一周時間分析和梳理,然後行為測試,之前我已經講過canvas中的fp生產,但是怎麼生產唯一的canvas base64,這個就要知道webgl了,具體我不闡述。下面我實現後的一些函數結構,大家可以參考

協議

授權協議:只允許研究、學習目的的分享、使用、修改,不允許任何商業用途。轉載請註明出處,感謝。

生產出來的函數結構

2019-11-01-16-49-32

本文主要講android端的deviceId生產規則,在一些請求的時候會提交這樣的闡述,這是android端,ios端類似,只是加密演算法不一致而已,我也分析過了。
2019-11-01-16-51-43

在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,會有一個時間戳,大概演算法如下

2019-11-01-16-54-48

  /**     * 獲取客戶端時間     */    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;    }

2019-11-01-16-58-27

如果自己實現演算法後,盡量要進行順向加密和逆向解密,這樣保證數據是完全沒問題的,文本就點播到這裡,後面可能會寫android端akamai的生產規則,android端程式碼分析比較煩,生產規則也比較複雜,涉及到非對稱加密,所以驗證起來也比較難。目前這個akamai 的bot sdk大概完工了2個部分,一個部分是web端的,一個是android端的,後續我會開源一個球鞋監控系統和公眾號,大家可以關注公眾號接收最新的球鞋通知,nice app通過手動綁定帳號nice幫你搶snkrs鞋,他們真聰明,帳號錢也省了,出問題也不管自己的事,對吧,還可以測試一波自己的bot系統是否靠譜,厲害厲害。

部落格: https://github.com/zhaojunlike

Tags: