閑來無事研究一下酷狗緩存文件kgtemp的加密方式

来源:http://www.cnblogs.com/KMBlog/archive/2017/05/19/6877752.html
-Advertisement-
Play Games

此貼為本人原創,轉載請註明出處 序 前幾天更新了被打入冷宮很久的酷狗,等進入之後就感覺菊花一緊————試 聽 居 然 都 要 開 通 音 樂 包(高品和無損)才行了,WTF! 這意味著以前緩存的都聽不了了,本著好馬不吃回頭草的原則,不打算去降級了,下載PJ版的又擔心被植入惡意代碼,心好累╮(╯▽╰) ...


此貼為本人原創,轉載請註明出處

前幾天更新了被打入冷宮很久的酷狗,等進入之後就感覺菊花一緊————試 聽 居 然 都 要 開 通 音 樂 包(高品和無損)才行了,WTF!

這意味著以前緩存的都聽不了了,本著好馬不吃回頭草的原則,不打算去降級了,下載PJ版的又擔心被植入惡意代碼,心好累╮(╯▽╰)╭

作為一個程式猿,豈能被你這小陰招就擊敗,定要給你點顏色看看!

探索

首先對比了一下緩存文件和下載好的mp3文件,發現緩存文件多了1024個位元組,而且對比了幾個緩存文件,前1024個位元組都一樣,看來使了個障眼法,去掉這1024個位元組應該就是原版的音頻數據了。

然後下圖是加密前後的對比:

加密前加密後

會發現加密前的一堆0x55 加密後變成 0xA9 0xE9 0xDA 0x52迴圈了,說明是用了4位元組的迴圈加密,然後切換成2進位研究

加密前 0x55 0x55 0x55 0x55   01010101 01010101 01010101 01010101

加密後 0xA9 0xE9 0xDA 0x52   10101001 11101001 11011010 01010010

對稱逐位元組加密的運算也就迴圈移位或者異或固定的數或者取反,但上面的幾組數迴圈移位和取反都不太像,就先假設是異或固定的數A B C D,接下來做填空題:

0x55 0x55 0x55 0x55   01010101 01010101 01010101 01010101

A       B      C      D        11111100 10111100 10001111 00000111

0xA9 0xE9 0xDA 0x52   10101001 11101001 11011010 01010010

得出:A B C D分別為0xFC 0xBC 0x8F 0x07 ,然後取開頭的數據驗證:

加密前 0x49 0x44 0x33 0x03   01001001 01000100 00110011 00000011

xor     0x3C 0xAC 0xEF 0x67   00111100 10101100 11101111 01100111

加密後 0x75 0xE8 0xDC 0x64   01110101 11101000 11011100 01100100

這次的A B C D分別為0x3C 0xAC 0xEF 0x67

納尼?不是固定的?WTF! 

兩組A B C D低4位的數字都是 C C F 7

看來最終結果確實是xor計算來的,只是高4位的數值要複雜一些。

根據0 xor X =X的性質,我找了一組全0的加密前後的對比,

加密前 0x00 0x00 0x00 0x00   00000000 00000000 00000000 00000000

加密後 0xAC 0xEC 0xDF 0x57   10101100 11101100 11011111 01010111

那A B C D高4位就對應 0xA 0xE 0xD 0x5

再用開頭的數據驗證:

加密前 0x49 0x44 0x33 0x03   01001001 01000100 00110011 00000011

xor     0xAC 0xEC 0xDF 0x57  10101100 11101100 11011111 01010111

加密後 0xE5 0xA8 0xEC 0x54 11100101 10101000 11101100 01010100

還是不對,而且發現一點:只要加密前的數的高4位=低4位,加密後的高4位都固定為0xA 0xE 0xD 0x5

這不就是xor 中的4個數的高4位嗎,由(0 xor X=X)和(X xor X=0)可知,高4位的演算法應該是這樣的:

分別取輸入數的高4位和低4位H,L, 然後取xor的高4位I 結果Y= H xor L xor I

帶入前面的3組數據驗算,都對了^_^

擼碼

既然加密演算法已經猜出來了,就擼碼驗證一下,看解密後的文件的MD5與緩存文件名是否相等:

class Program
    {
        static void Main(string[] args)
        {

            byte[] key={0xAC,0xEC,0xDF,0x57};
            using (var input = new FileStream(@"E:\KuGou\Temp\236909b6016c6e98365e5225f488dd7a.kgtemp", FileMode.Open, FileAccess.Read))
            {
                var output = File.OpenWrite(@"d:\test.mp3");//輸出文件
                input.Seek(1024, SeekOrigin.Begin);//跳過1024位元組的包頭
                byte[] buffer = new byte[key.Length];
                int length;
                while((length=input.Read(buffer,0,buffer.Length))>0)
                {
                    for(int i=0;i<length;i++)
                    {
                        var k = key[i];
                        var kh = k >> 4;
                        var kl = k & 0xf;
                        var b = buffer[i];
                        var low = b & 0xf ^ kl;//解密後的低4位
                        var high = (b >> 4) ^ kh ^ low & 0xf;//解密後的高4位
                        buffer[i] = (byte)(high << 4 | low);
                    }
                    output.Write(buffer, 0, length);
                }
                output.Close();
            }
            Console.WriteLine("按任意鍵退出...");
            Console.ReadKey();
        }
    }

 

 

結果:輸出文件的MD5與緩存文件名相同,大功告成

總結

固定要異或的key={0xAC,0xEC,0xDF,0x57}

加密方式如下:

1.設輸入的數為x,輸出結果為y,迴圈變數為i;

2.分別取x的高4位和低4位h,l;  h=x >> 4 ; l=x & 0xf;

3.分別取key[i]的高4位和低4位kh,kl;kh=key[i] >> 4;kl=key[i] & 0xf;

4.y=h ^ l ^ kh;

5.y=y<< 4 | (l ^ kl);

解密方式如下:

1.設輸入的數為x,輸出結果為y,迴圈變數為i;

2.分別取x的高4位和低4位h,l;h=x >> 4 ; l=x & 0xf;

3.分別取key[i]的高4位和低4位kh,kl;kh=key[i] >> 4;kl=key[i] & 0xf;

4.y=l ^ kl;

5.y=(h ^ kh ^ y)<<4 | y;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、 2、 3、 4、 ...
  • SHELL中的變數 運行SHELL腳本中的單個命令自然有用,但這有其自身的限制。通常你會需要在SHELL命令使用其他數據來處理信息。這可以通過變數來實現。變數允許你臨時性地將信息存儲在SHELL腳本中,以便和腳本中的其他命令一起使用。 1 環境變數 SHELL維護著一組環境變數,用了記錄特點的系統信 ...
  • 文件的壓縮與解壓 常用命令和參數 1 gzip -c 將壓縮或解壓的結果輸出至標準輸出 -d 解壓縮,相當於guzip -# (1-9)指定壓縮比,預設為6。 zcat 不解壓縮的情況下查看文件。 壓縮:gzip FileName 解壓:gzip –d FileName.gz 2 bzip2 -d ...
  • 實在受不了在Windows下編程,所以自己就安裝了一個Ubutun,公司用的翻牆軟體shadowsocks在Windows上用起來很簡單很爽,但是在Ubutun上的安裝和配置就沒那麼簡單了,寫下這篇文章,希望需要的朋友能簡單快速的搞定shadowsocks的安裝和配置 1.安裝 在命令行執行上面的三 ...
  • 8.1 實例構造器和類(引用類型) 構造引用類型的對象時,在調用類型的實例構造器之前,為對象分配的記憶體總是先被歸零 。沒有被構造器顯式重寫的所有欄位都保證獲得 0 或 null 值。 構造器不能被繼承。不能使用以下修飾符: virtual,new,override,sealed和abstract. ...
  • IDE:VisualStudio 2017 Language:VB.NET/C# 圖形API:Win2D 游戲引擎:ExperDot.EDGameEngine 本文將向你介紹一種粒子系統(Partical System)模擬植物的簡單方法。 第一節 移動 粒子將按照某種規則移動,且始終保留移動軌跡。 ...
  • 本文內容是本人參考多本經典C 書籍和一些前輩的博文做的總結 儘管.NET運行庫負責處理大部分記憶體管理工作,但C 程式員仍然必須理解記憶體管理的工作原理,瞭解如何高效地處理非托管的資源,才能在非常註重性能的系統中高效地處理記憶體。 C 編程的一個優點就是程式員不必擔心具體的記憶體管理,垃圾回收器會自動處理所 ...
  • redis 介紹和常用命令 redis簡介 Redis 是一款開源的,基於 BSD 許可的,高級鍵值 (key-value) 緩存 (cache) 和存儲 (store) 系統。由於 Redis 的鍵包括 string,hash,list,set,sorted set,bitmap 和 hyperl ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...