网易云音乐加密分析
網易云音樂加密分析
網易云的加密網上已經寫爛了,并且網易云的程序員似乎并沒有更新加密的想法,這幾乎是唯一一家了,也許人家根本不在乎你能模擬加密。
當初第一次你想網易云的時候,就遺留了一些問題,不過當時技術有限,湊湊別人的代碼倒也能實現,現在回來再看,打算完整地分析一遍,解決當時的疑惑。
首先加密位置很容易找到的。現在想來,當時為什么網易云JS分析也覺得這么有難度,我不理解。
hook的方法
要獲取這四個參數具體的值話,有三種辦法:
想使用一下第三種辦法,在瀏覽Source面板改完如下
控制臺輸出效果
加密函數
跟進加密函數,關鍵加密邏輯就幾行代碼
這里的d,e,f,g就是我們打印的那四個參數
函數a代碼很簡單
function a(a) {var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,e = Math.floor(e),c += b.charAt(e);return c}生成16位隨機字符串,這個也是可以寫死的,但是偽裝就裝得像一點。使用Python改寫的話也是十分簡單。
CHARS = string.ascii_letters + string.digitsdef random_str(cnt: int) -> str:return ''.join(random.choices(CHARS, k=cnt))b函數,AES加密,CBC模式,直接調庫就好了,不多說。
更多關于AES加密的內容可以查AES加密
重點看看c函數,RSA加密,這也是我最初學習的時候疑惑的一個點,網上的文章都有一個逆序明文的操作,當時并沒有弄明白。要搞清楚,關鍵在encryptstring方法。改寫得好看了一點,函數邏輯沒有變化
function encryptedString(a, b) {/* 取明文的ascii碼到c數組 */for (var f, g, h, i, j, k, l, c = [], d = b.length, e = 0; d > e;) {c[e] = b.charCodeAt(e);e++;}/* 補0到a.chunkSize,經調試,achunkSize為常量126 */for (; 0 !== c.length % a.chunkSize;) {c[e++] = 0;}/* 外層for循環其實只會被執行一次 */for (f = c.length, g = "", e = 0; f > e; e += a.chunkSize) {/* 大整數 */for (j = new BigInt, h = 0, i = e; i < e + a.chunkSize; ++h) {j.digits[h] = c[i++];j.digits[h] += c[i++] << 8;}k = a.barrett.powMod(j, a.e);l = 16 === a.radix ? biToHex(k) : biToString(k, a.radix);g += l + " ";}return g.substring(0, g.length - 1) }舉例說明一下這里的BigInt(只針對網易云JS),digits數組元素為16位的int型,相當于每個元素可以表示16位二進制數,逆序拼接(元素為0的不拼入)成一個二進制數即為實際表示的大整數,說逆序只是為了好理解,實際過程用偽代碼表示應該是
ret = 0 for i in range(len(digits)):ret += digits[i] << (16 * i)如大整數digits數組為[1, 1, 0, 0]表示實際的二進制數0000_0000_0000_0001_0000_0000_0000_0001
十六進制的字符串"10001"表示成二進制數就是0001_0000_0000_0000_0001,在表示成BigInt就是digits[1, 1],即十進制的65537
同樣的,十六進制串"596934344e6d",表示成BigInt為[5969(十六進制), 3434,(十六進制), 4e6d(十六進制)]
接下來看看encryptedstring函數中將隨機字符串例如轉換成大整數,以"Yi44Nm"為例,步驟如下
但是在Python中,都是按照正常順序處理的,這就是為什么我們需要將隨機串逆序了,理論上來說,"10001"也是要逆序的,不過這是個回文串,也就無所謂了。
import binasciis = "Yi44Nm"[::-1] # 6d4e34346959 hex_str = binascii.hexlify(s.encode()).decode() int(hex_str, 16)網上的文章幾乎都是一句倒序操作,就沒了下文了。
關于登錄的二維碼
想完成網易云二維碼登錄功能來著,像平常一樣直接抓包,結果怎么找也沒找著二維碼圖片在哪,之前碰到的二維碼真的就是一張圖片,網易云是JS在Canvas上繪制出來的。這樣我們沒法通過請求去獲取這張二維碼。
這里直接記錄一下解決辦法
附上chromediver的參數配置列表
總結
- 上一篇: QBXT 2018春季DP图论班 201
- 下一篇: 项目管理IPD产品开发