xx課堂m3u8加密視頻下載


   1、各大視頻類網站的核心資產和競爭力莫過於視頻本身了,所以很多網站想盡一切辦法都要保護自己的視頻內容不會被爬取和盜用;最常見的保護辦法莫過於加密了:服務端把視頻數據加密,再把密文發給客戶端(這里一般都是瀏覽器或app),客戶端再根據事先約定好的加密方案和密鑰解密數據,得到明文,然后再播放!所以理論上講:既然客戶端能播放,說明客戶端一定有明文,那么爬蟲肯定也能解密得到明文!那么現在需要解決的兩個問題:

  • 加密算法是啥?
  • 密鑰是啥?

   本文以xx課堂為例,詳細展示破解加密算法后下載完整可播放視頻的方法;

  2、先登陸xx課堂,按F12鍵,選擇network分頁,然后隨便打開一個視頻觀看,下面馬上列舉出了瀏覽器請求的所有接口,這里目測有上百個;要想破解加密視頻,需要找到這么幾個要素:

  • 視頻文件的鏈接,換句話說瀏覽器是在哪個接口下載視頻文件的?
  • 加密方法
  • 密鑰

   xx課堂采用的m3u8格式編碼視頻文件,關於這種格式的詳細介紹請見參考1,這里不在贅述;m3u8編碼方案的一大特點:將一個大的媒體文件進行分片,將該分片文件資源路徑記錄於 m3u8 文件(即 playlist)內,其中附帶一些額外描述(比如該資源的多帶寬信息···)用於提供給客戶端;客戶端依據該 m3u8 文件即可獲取對應的媒體資源,進行播放。簡單點理解:服務器會把一個大文件切分成N多個小文件,小文件的路徑記錄在playlist內。瀏覽器根據播放進度向服務器請求playlist的小文件,然后解密小文件得到明文;小文件的后綴名是.ts,所以可以根據這個先選幾個ts文件看看,如下:

        

   這個接口(本質上是服務端的一個文件)后綴是ts,是不是ts文件了?先不管這些了,復制這個鏈接到瀏覽器,成功下載了ts文件,然后嘗試用windows自帶的media player打開,結果報錯如下:

         

   直接說不支持該文件類型!根據經驗判斷,肯定被加密了,遂用010Editor打開一看,果然文件頭信息已經被改地面目全非!(windwos下各種文件都有頭信息,來標注這是哪種類型的文件。比如最常見的PE頭,還有jpg等文件的頭部都有標注。)這里沒有任何文件頭信息,播放器能識別才怪了!到這里已經明確了兩點:

  •  視頻文件都在ts
  •    ts被加密了

         

   現在又面臨上面提到的那3個問題了:ts文件列表在哪? 哪中加密方式?密鑰是啥?

  3、(1)m3u8格式的一個特點:將一個大的媒體文件進行分片,將該分片文件資源路徑記錄於 m3u8 文件(即 playlist)內,其中附帶一些額外描述(比如該資源的多帶寬信息···)用於提供給客戶端;所以現在要先找到playlist!既然是m3u8格式,那么先根據關鍵詞搜一下,看看都有哪些接口。搜索結果如下,一共有3個接口有m3u8關鍵詞;先看第一個接口:接口名里面居然后playlist_m3u8,這個是不是傳說中的playlist了?

       

   馬上看看這個接口的返回,如下:返回了3種不同的分辨率(清晰度),每種清晰度后面緊跟着一個接口,也是m3u8;這個request URL(注意:這里是header里面的URL,不是response的URL)應該就是m3u8接口了,這個很重要,后續會根據這個接口下載視頻數據

    

     其中一種清晰度的內容:

#EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=232176,RESOLUTION=474x270
voddrm.token.dWluPTE0NDExNTIxNDY1ODI5Nzc5ODt2b2RfdHlwZT0wO2NpZD0yMjc3MzI7dGVybV9pZD0xMDAyNjg3NTY7ZXh0PTkxNzliODBiZTNjYTIxMzA5OTQ4OGJmYTgzZTVlMjBhNzBkN2M1MDVkNTkzOTlhNWE4OTRlMmQ3YzQ5MGY2YTE5ZWQzMTQ3N2VjNjA0N2U4ZGYxYTdkZTU2NzBlOTJlYTVjMGZkMmFmZDRmMzUxNzEyOTVjMzIwZWVjNDk5NTM4YzM3YWE1MzMyZGQ5NzBhNg==.v.f30739.m3u8?exper=0&sign=382269b9e17d37f914942ef7b14894d9&t=60949ee4&us=1981982863631918869

   (2)m3u8的playlist找到了,接着的問題是找到加密的方法和密鑰了;繼續看第二個接口的response,如下:

      

   這里從字面看也很明顯了:METHOD=AES-128:這是加密方法;接着是一大串的URI,這是啥了?暫時不知道,先復制URI到瀏覽器,下載下來再說,得到get_dk文件,從名字看,貌似是descypt_key、解密文件?

   繼續向后看,還能看到IV,這里就實錘了AES-CBC的加密方法了!這里吐槽一下:我也不知道xx課堂的開發人員是咋想的,所有ts的密鑰設置成一樣就算了,居然還把IV設置成0,這就有點匪夷所思了........

       

   這里response的格式也容易理解:第一行是加密的方法、密鑰(需要通過接口去服務器取,不是直接暴露的),第三行是ts文件的地址,也就是說:第三行這個ts文件解密的信息都放在第一行了

#EXT-X-KEY:METHOD=AES-128,URI="https://xxxx/cgi-bin/xxxx/get_dk?edk=CiDDCouW%2B5LTc3PK5i4SUfJ%2B1tEX%2BJb2GENRUeTo21edBBCO08TAChiaoOvUBCokOTMyNDg4YmItOWZjYS00MzFiLWJiYjItNjFmMDhjYjNlYmM3&fileId=5285890788170463121&keySource=VodBuildInKMS&token=dWluPTE0NDExNTIxNDY1ODI5Nzc5ODt2b2RfdHlwZT0wO2NpZD0yMjc3MzI7dGVybV9pZD0xMDAyNjg3NTY7ZXh0PTkxNzliODBiZTNjYTIxMzA5OTQ4OGJmYTgzZTVlMjBhNzBkN2M1MDVkNTkzOTlhNWE4OTRlMmQ3YzQ5MGY2YTE5ZWQzMTQ3N2VjNjA0N2U4ZGYxYTdkZTU2NzBlOTJlYTVjMGZkMmFmZDRmMzUxNzEyOTVjMzIwZWVjNDk5NTM4YzM3YWE1MzMyZGQ5NzBhNg%3D%3D",IV=0x00000000000000000000000000000000
#EXTINF:10.000000,
v.f30741.ts?start=0&end=351007&type=mpegts&exper=0&sign=382269b9e17d37f914942ef7b14894d9&t=60949ee4&us=1981982863631918869

      加密方法和IV都有了,密鑰了?剛才下載了get_dk文件,用010Editor打開,發現了一串16byte的數字,而16byte=128bit,剛好是METHOD=AES-128,所以這個是密鑰實錘了!

        

  這里強調幾句:從瀏覽器接口加載的順序看,是先請求了這3個接口,再請求ts文件的。邏輯也很簡單:通過請求m3u8接口,得到包含所有ts文件的playlist,和解密的方法、密鑰,然后請求ts文件,再在客戶端本地解密后播放

   (3)m3u8的接口找到,意味着所有ts文件的playlist找到了;加密方案和密鑰都找到了,接下來開始解密!先把密鑰復制成base64格式,010Editor的操作方法如下:Edit->Copy as->Copy as Base64;

       

   然后用到下面的這個軟件(下載地址見文章末尾的參考3):把m3u8鏈接(注意是那個request URL)、密鑰的base64格式和IV輸入,點擊go即可;

       

   下載進度:

       

        完成后在download目錄下能看到完整的mp4文件和接口信息:

        

  mp4文件能用播放器正常播放!

 

   這是所有原始的ts文件,都是解密后、可以正常播放的:

        

  隨便找個ts文件,用010Editor打開,這次能看到文件頭信息了:是FFmpeg格式的,所以播放器能正常播放!

        

 

 

參考:

1、https://www.jianshu.com/p/e97f6555a070    m3u8文件格式詳解

2、https://www.bilibili.com/video/BV1Lv411a7CP   快速爬取xx課堂

3、https://github.com/nilaoda/N_m3u8DL-CLI   m3u8下載器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM