请问怎么把酷狗的kgtemp的文件转换成mp3文件啊 财富不多求大神

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问怎么把酷狗的kgtemp的文件转换成mp3文件啊 财富不多求大神相关的知识,希望对你有一定的参考价值。

可以使用格式工厂将文件转换成mp3格式。

准备工具:

格式工厂

转换具体步骤:

1、运行格式工厂,如下图中内容所表示。

2、点选左侧音频,所有转为MP3,如下图中内容所表示。

3、点选添加文件,如下图中内容所表示。

4、浏览选择视频文件,如下图中内容所表示。

5、选择输出文件夹,确定,如下图中内容所表示。

6、点击开始,完成转换,如下图中内容所表示。

参考技术A

首先对比了一下缓存文件和下载好的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;

参考技术B 不可能,你当酷狗音乐是白痴?人家不用养家糊口,那个文件生成的方式只有内部人员知道,想要转化必须交钱给酷狗音乐。想要破解的话那就是想多了,可能别人每天都换一种算法生成kgtemp文件。死心吧。。 参考技术C 我的答案最标准,而且有效果,简单。(准备工作是先把你需要下载的哪一首歌在IE打开,然后把Internet临时文件全部清理掉),然后在IE里开始放歌,拖动进度条,大概10多秒后会产生几十个文件,按大小顺序排列,最大的那个就是了,要快速复制到桌面(其他地方也可以,方便找到就行)然后看能不能播放,如果不能那就把文件后缀名改成mp3,这方法错不了的。 参考技术D

注意,此方法截止18年6月止 是唯一有效方法,其它我试过无数都瞎扯淡,下载一个HXD软件,用软件把酷狗的缓存文件打开,找到00000400这一行,把08那一列的定义数值,改成06后,然后点击另存为自定义名字 后缀必须是.mp3,如XXX.mp3,再打开酷狗,清空播放列表,把改好的文件拖到播放列表,点击播放,这时会播放不了,显示红色歌名文件,右键点击选下载,或右边3个小点里有选项下载,直接就能下载了。

酷狗歌曲缓存kgtemp转mp3工具

kgtemp文件是某款音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名。

kgtemp解密

kgtemp文件前1024个字节是固定的包头信息,解密方案详细可以参见(http://www.cnblogs.com/KMBlog/p/6877752.html):

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();
        }
    }

这样解密出来就是mp3文件了

读取ID3信息

解密出来的文件还需要手动命名,不是很方便,可以读取ID3V1信息重命名文件。
ID3V1比较简单,它是存放在MP3文件的末尾,用16进制的编辑器打开一个MP3文件,查看其末尾的128个顺序存放字节,数据结构定义如下:
char Header3; /标签头必须是"TAG"否则认为没有标签/
char Title[30]; /标题/
char Artist[30]; /作者/
char Album[30]; /专集/
char Year4; /出品年代/
char Comment[30]; /备注/
char Genre; /类型,流派/

解析代码比较简单,注意中文歌曲用GBK编码就可以了:

  private static Mp3Info FormatMp3Info(byte[] Info, System.Text.Encoding Encoding)
        {
            Mp3Info myMp3Info = new Mp3Info();
            string str = null;
            int i;
            int position = 0主要代码jia,; //循环的起始值
            int currentIndex = 0; //Info的当前索引值

            //获取TAG标识
            for (i = currentIndex; i < currentIndex + 3; i++)
            {
                str = str + (char)Info[i];
                position++;
            }
            currentIndex = position;
            myMp3Info.identify = str;

            //获取歌名
            str = null;
            byte[] bytTitle = new byte[30]; //将歌名部分读到一个单独的数组中
            int j = 0;
            for (i = currentIndex; i < currentIndex + 30; i++)
            {
                bytTitle[j] = Info[i];
                position++;
                j++;
            }
            currentIndex = position;
            myMp3Info.Title = ByteToString(bytTitle, Encoding);

            //获取歌手名
            str = null;
            j = 0;
            byte[] bytArtist = new byte[30]; //将歌手名部分读到一个单独的数组中
            for (i = currentIndex; i < currentIndex + 30; i++)
            {
                bytArtist[j] = Info[i];
                position++;
                j++;
            }
            currentIndex = position;
            myMp3Info.Artist = ByteToString(bytArtist, Encoding);

            //获取唱片名
            str = null;
            j = 0;
            byte[] bytAlbum = new byte[30]; //将唱片名部分读到一个单独的数组中
            for (i = currentIndex; i < currentIndex + 30; i++)
            {
                bytAlbum[j] = Info[i];
                position++;
                j++;
            }
            currentIndex = position;
            myMp3Info.Album = ByteToString(bytAlbum, Encoding);

            //获取年
            str = null;
            j = 0;
            byte[] bytYear = new byte[4]; //将年部分读到一个单独的数组中
            for (i = currentIndex; i < currentIndex + 4; i++)
            {
                bytYear[j] = Info[i];
                position++;
                j++;
            }
            currentIndex = position;
            myMp3Info.Year = ByteToString(bytYear, Encoding);

            //获取注释
            str = null;
            j = 0;
            byte[] bytComment = new byte[28]; //将注释部分读到一个单独的数组中
            for (i = currentIndex; i < currentIndex + 25; i++)
            {
                bytComment[j] = Info[i];
                position++;
                j++;
            }
            currentIndex = position;
            myMp3Info.Comment = ByteToString(bytComment, Encoding);

            //以下获取保留位
            myMp3Info.reserved1 = (char)Info[++position];
            myMp3Info.reserved2 = (char)Info[++position];
            myMp3Info.reserved3 = (char)Info[++position];

            //
            return myMp3Info;
        }

转换小工具

写了一个小工具,来进行转换

技术分享图片

下载地址:https://pan.baidu.com/s/1o7FIsPk

转换后mp3可以放到云盘等地方存储,方便试听

技术分享图片


作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

以上是关于请问怎么把酷狗的kgtemp的文件转换成mp3文件啊 财富不多求大神的主要内容,如果未能解决你的问题,请参考以下文章

怎样查看酷狗音乐里面歌曲的链接地址

怎么把QQ音乐里面VIP下的歌转换格式,让它能在MP3上播放?

酷狗缓存文件kgtemp的加密方式

酷狗的专属格式KGM格式转换破解,急求一个

闲来无事研究一下酷狗缓存文件kgtemp的加密方式

怎么把音乐WAV格式转换为MP3格式