如何從緩存白嫖網易雲音樂

如何從緩存白嫖網易雲音樂

本文僅供學習和交流!

一切的原由都得從一個神祕的夜開始...linux

那天小豬在剪視頻的時候,忽然想用幾首曲子做爲 BGM,因而興高采烈的想到了鍾愛的網易雲音樂。不過在小豬的印象中,不少年前,是能夠經過直接修改緩存文件的後綴名來白嫖音樂下載的。因而一個邪惡的計劃就此展開...android

後綴名?

首先咱們來到網易雲音樂在本地的緩存目錄,固然確定是一堆看起來奇奇怪怪的文件啦。git

netease-music-decoder-1.jpg

按照體積來看,這些 .uc 的文件應該就是 mp3 了。因而按照老方法,直接用播放器打開試試,結果發現沒法正確解碼。可達鴨眉頭一皺,發現事情並不簡單。看起來,這些緩存文件應該是通過了處理的。不過既然做爲本地緩存使用,那麼這個處理必定是可逆的,而且一般是不復雜的。咱們就嘗試來找找線索吧。github

選個姿式

首先就是,一般來講各類不一樣的文件類型都會有本身特定的格式。上網搜尋一番以後發現,mp3 文件開頭會都會有一個以 ID3 開始的標籤頭。因而抱着好奇心,咱們來查看一下這個 .uc 緩存文件看看:segmentfault

netease-music-decoder-2.jpg

能夠發現並不符合以前查到的格式。因吹斯汀~瀏覽器

結合咱們前面說的,這個處理必定可逆,而且可能不會很複雜。小豬這裏大膽猜想多是對於每個 byte 都進行了某種運算。接下來咱們對比一下正式下載下來的 mp3 和這個緩存文件的內容:緩存

netease-music-decoder-3.jpg

圖中左側爲緩存文件的內容,右側爲對應的 mp3 文件的內容。能夠發現右側數據確實是以 ID3 開頭的,驗證了以前搜索的內容。這裏其實咱們就獲得了一個由原始數據處處理後數據的對應表。能夠做爲後續解碼的線索。less

不過其實更讓小豬注意的是,咱們在 mp3 文件中會發現存在着一段 00 的內容,多是做爲頭部擴展標籤的預留位。不過在緩存文件中,這部份內容所有變成了 A3。因爲 00 這個值的特殊性(全都是 0 鴨),小豬下意識以爲這裏極可能就是一個突破口。electron

首先,根據這段數據的位置關係,咱們能夠猜想的是處理後的緩存文件中每一個 byte 都是原地修改數據,並不存在數據總體的先後移動。接下來,如何從 00 變爲 A3 呢?這裏可能有幾種很常見的運算,例如經過加法、或運算或者異或運算。假設是經過加法,那麼在編碼和解碼的時候還得處理數據溢出而後循環的問題;假設是經過或運算,那麼解碼的時候就沒法直接還原了,畢竟 0 | 1 與 1 | 1 都是 1;假設是經過異或,那麼還原只須要再作一次異或運算便可。看起來彷佛獲得一點線索了,咱們再驗證一下吧。學習

基於上面的線索,咱們回頭看看標籤頭部的值,緩存文件中是 EA、E七、90,mp3 文件中是 4九、4四、33。下面就是見證奇蹟的時刻啦:

(0xea ^ 0xa3) === 0x49
(0xe7 ^ 0xa3) === 0x44
(0x90 ^ 0xa3) === 0x33

感興趣的同窗能夠自行嘗試算一下上面 3 個判斷,會發現它們全都是 true。亦可賽艇!

到此彷佛線索已經明朗起來了,那麼咱們嘗試把整個文件都轉換一下吧。

NodeJS 模塊

在 NodeJS 中咱們能夠輕鬆的把文件的內容讀進內存,而後對每個 byte 進行上述運算處理,再將結果輸出。常見的方式有兩種,能夠基於 fs.open 去建立文件句柄,或者基於 fs.createReadStream 來建立讀取流。對於大文件來講,後者會比較有優點,不過對於常見的 mp3 歌曲,小夥伴們能夠看本身的喜愛咯。

這裏小豬實現了一個 repo 包含了上述功能,repo 地址在此。固然除了直接解碼 buffer 或者解碼文件以外,還支持經過緩存文件名自動獲取這首歌的歌名和歌手來做爲解碼後輸出的文件名。例如 repo 中的測試文件的結果以下:

netease-music-decoder-4.jpg

repo 中的代碼並不複雜,暴露的方法也很簡單,感興趣的小夥伴能夠自行查看。歡迎 STAR,歡迎 PR~ >.<

在線版本

瞭解小豬的小夥伴必定猜到啦,除了 NodeJS 模塊,小豬也提供了在線版本供使用。具體地址在此

該在線版本能夠選擇本地緩存文件,而後進行在線解碼,處理完以後自動觸發下載。效果以下圖所示:

netease-music-decoder-5.jpg

不過在線版本目前不支持自動獲取歌名和歌手名。其實雲服務的 serverless 那邊已經作好接口了,可是小豬測試的時候發現外網流量要計費,100 首歌就幾百兆啦。小豬最近經濟又比較拮据,因此決定先不支持啦。若是須要的小夥伴多的話,能夠等等小豬後續的桌面軟件版本。

後記

最終的代碼其實很是簡單,不過中間尋找線索的過程仍是挺有意思的。因此寫出來和小夥伴們分享一下。可是有不少環境尚未測試過,例如 macOS、linux、android、iOS 等平臺的緩存默認路徑啦,或者不一樣平臺的瀏覽器的兼容性啦。若是發現有問題,歡迎去 repo 中提 issue 便可。

加之最近發現 electron 已經發布了 9.0.0 了,而小豬之前用它來作正式項目的時候仍是不少年前的版本,因而想體驗一下如今究竟有哪些改變。因此就打算順便作一個桌面軟件版本。

固然本文也是有時效性的,若是網易雲音樂改了緩存文件的編碼方式,那麼可能就失效啦。不過到時候小豬應該也會更新 repo 的代碼的。

本文僅供學習和交流!

相關連接

qrcode_green.jpeg

相關文章
相關標籤/搜索