閑來無事研究一下酷狗緩存文件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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...