/bind
,其中DeviceToken,nonce,Token均爲POST中提交的數據。/bind/
請求的Initiator,發現只與vendor.*.js
與app.*.js
有關,且出現了webpackJsonp
、computed
、updateRoute
等字段,猜想該網站是使用vue-cli構建的。vendor.*.js
與app.*.js
,在app.*.js
中搜索/bind
,找到相關代碼。/bind
請求至後端,若是返回的結果中Success
字段爲true,則將數據中的DeviceToken
,DeviceKey
放到cookie中。而發送的DeviceToken
由newGuid()
函數生成。
registerApp
,搜索調用。registerApp
的代碼,根據上文watch
與methods
能夠判斷出這是一個vue的組件,監控到路由變化則調用registerApp
66_0x3458
中。newGuid
轉爲utf-8編碼,爲\x6E\x65\x77\x47\x75\x69\x64
,找到其在變量66_0x3458
的位置app.*.js
中搜索0xa3,找到定義。_0x6bc57['JiAvF']
與_0x6bc57['jybZN']
爲調用的其餘函數,分別搜索得出對應函數:newGuid
的代碼以下,生成一個32的uuid:function newGuid() { let uuid = "", i = 1; for (; i <= 32; i++) { uuid = uuid + Math.floor(16 * Math.random()).toString(16); if (!(8 !== i && 12 !== i && 16 !== i && i !== 20)) { uuid = uuid + "-"; } } return uuid; }
/bind
的代碼,請求中的data實際只有三個字段,與看到XHR請求中字段數量不一致,判斷是作了一個攔截器,而通常的vue-cli項目中使用的http請求庫爲axios,因此直接搜索interceptors找到攔截器代碼。['prototype']['uuid']
,找到函數定義:a66_0x39d4('0xb9')
是未知的,調用函數,找到對應數值爲'0123456789abcdef':function uuid() { let s = []; for (let i = 0; i < 36; i++) s[i] = '0123456789abcdef'.substr(Math.floor(16 * Math.random()), 1); s[14] = '4'; s[19] = '0123456789abcdef'.substr(3 & s[19] | 8, 1); s[8] = s[13] = s[18] = s[23] = '-'; return s.join(''); }
['prototype']['deleteKey']
找到deleteKey函數:function deleteKey(data) { for (let word in data) { if (data.hasOwnProperty(word)) { const val = data[word]; if (!(0 === val || val || "boolean" == typeof val)) { delete data[word]; } } } return data; }
- 搜索`setToken`找到setToken函數,初步判斷setToken主要是將Object類型的data根據必定格式轉爲字符串後加入混淆字符`OI2W_YeeUw%OHutl`後再加密:
- 搜索MbnVH
找到MbnVH函數,用來判斷變量類型
- 搜索_0x1e733e找到定義,發現其上方的與_0x591b6a有關。
- 在app.*.js
中搜索fZjL無果,轉到vendor.*.js
中搜索,找到定義:
- 繼續在vendor.*.js
中搜索jFbC,找到定義:
- 將未知量替換後,setToken代碼以下:vue
function setToken(data) { let c = Object.assign({}, data); let s = Object.keys(c).map(function (k) { return k.toLowerCase() + "/" + k + "=" + c[k]; }).sort().map((vo) => { return vo.substring(vo.indexOf("/") + 1); }).join("") + "OI2W_YeeUw%OHutl"; return encryption(s,1); }
- Token的值最終與encryption函數有關,將encryption轉爲utf-8編碼\x65\x6E\x63\x72\x79\x70\x74\x69\x6F\x6E,找到位置:
- 將174轉爲16進製爲0xae,在app.*.js
中找到定義:
- 傳入的參數值爲*,1時,只調用case 0x1中的代碼,看到['toString'](CryptoJS[a66_0x39d4('0xb0')]['Hex'])
,初步判斷是將字符串進行SHA1或MD5加密後,再進行Hex編碼。
- 搜索_0x33c78e找到定義,發現其與_0x7558ee有關,簡單搜索發現_0x7558ee的值爲_0xbc0af2('Ff/Y'):
- 在vendor.*.js
中搜索Ff/Y找到代碼:
- 根據_doReset中定義的數組與crypto-js中SHA1與MD5代碼比對,發現Ff/Y對應的是SHA1:
- 通過修飾,encryption函數的代碼以下,將字符串SHA1加密後再Hex編碼:webpack
function encryption(val) { return Crypto.SHA1(val.toString()).toString(Crypto.enc.Hex); }
/bind
請求測試,返回結果成功: