酷狗缓存文件kgtemp的加密方式
[转自:http://www.cnblogs.com/KMBlog/p/6877752.html]
首先对比了一下缓存文件和下载好的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(, SeekOrigin.Begin);//跳过1024字节的包头
byte[] buffer = new byte[key.Length];
int length;
while((length=input.Read(buffer,,buffer.Length))>)
{
for(int i=;i<length;i++)
{
var k = key[i];
var kh = k >> ;
var kl = k & 0xf;
var b = buffer[i];
var low = b & 0xf ^ kl;//解密后的低4位
var high = (b >> ) ^ kh ^ low & 0xf;//解密后的高4位
buffer[i] = (byte)(high << | low);
}
output.Write(buffer, , 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;
酷狗缓存文件kgtemp的加密方式的更多相关文章
- 闲来无事研究一下酷狗缓存文件kgtemp的加密方式
此贴为本人原创,转载请注明出处 序 前几天更新了被打入冷宫很久的酷狗,等进入之后就感觉菊花一紧----试 听 居 然 都 要 开 通 音 乐 包(高品和无损)才行了,WTF! 这意味着以前缓存的都听不 ...
- 酷狗.kgtemp文件加密算法逆向
该帖转载于孤心浪子--http://www.cnblogs.com/KMBlog/p/6877752.html 酷狗音乐上的一些歌曲是不能免费下载的,然而用户仍然可以离线试听,这说明有缓存文件,并且极 ...
- 开源小工具 酷狗、网易音乐缓存文件转mp3工具
发布一个开源小工具,支持将酷狗和网易云音乐的缓存文件转码为MP3文件. 以前写过kgtemp文件转mp3工具,正好当前又有网易云音乐缓存文件需求,因此就在原来小工具的基础上做了一点修改,增加了对网易云 ...
- 酷狗音乐盒缓存文件夹KuGouCache的设置方法
1.每次一打开酷狗总能在E盘里找到这个 KuGouCache 文件夹 ,是自动生成的MV缓存文件 .按照常规 ,可以修改这个文件的办法是 找到C盘里的:用户\administrator\AppDate ...
- Python爬虫:通过做项目,小编了解了酷狗音乐的加密过程
1.前言 小编在这里讲一下,下面的内容仅供学习参考,切莫用于商业活动,一经被相关人员发现,本小编概不负责!读者切记切记. 2.获取音乐播放列表 其实,这就是小编要讲的重点,因为就是这部分用到了加密. ...
- 3d轮播图(另一种方式,可以实现的功能更为强大也更为灵活,简单一句话,比酷狗优酷的炫)
前不久我做了一个3d仿酷狗的轮播图,用的技术原理就是简单的jquery遍历+css样式读写. 这次呢,我们换一种思路(呵呵其实换汤不换药),看到上次那个轮播吗?你有没有发现用jquery的animat ...
- 用vuejs写了一个酷狗的webApp
这几天在学习vueJS,学了半个月,觉得是不是该写点什么呢?于是 .脑子一抽,仿了一个酷狗的webapp. 项目截图: 由于是单页应用,切换路由时音乐不会停止,算是一个小亮点吧. 技术栈: vuejs ...
- 仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)
转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出 ...
- DotNet加密方式解析--非对称加密
新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上班两天了,公司大部分人还在休假,而我早已上班, ...
随机推荐
- CUDA编程札记
const int N = 33 * 1024; const int threadsPerBlock = 256; const int blocksPerGrid = imin( 32, (N+thr ...
- EXCEL在使用中,jar导入问题
报错:The type org.apache.poi.ss.usermodel.Workbook cannot be resolved. It is indirectly referenced fro ...
- SQL中的重要语句
1.查询每个数据库有多少空间被浪费 如果你想知道在你数据库设计后,每页有多少空间浪费掉,你可 以通过下列动态管理视图(DMV)查询下缓冲池:sys.dm_os_buffer_descriptors 从 ...
- Unity 逻辑层通知UI 通过接口消除他们通信的switch判断
需求如何: 用户名字长度为2-12之间, 如果错误在界面上弹出一个消息框 写烂一点 public void PostRename(string name) { if (string.IsNullO ...
- 老生常谈:DEDECMS安全设置问题分享
Dedecms安全问题已经是老生常谈了.虽然无忧主机php虚拟主机安全性是很高的,但是黑客总是利用dedecms的漏洞进行注入.其实有些时候,是我们对dedecms的安全设置不到位导致的.今天无忧主机 ...
- CSS3使用Animation为同一个元素添加多个动画效果
本篇文章由:http://xinpure.com/css3-animation-for-the-same-element-multiple-animation-effects/ CSS3 Animat ...
- 基于leveldb,levigo做二次开发
Leveldb是一个C++库,它有提供标准的C接口,头文件在include/leveldb/c.h中 levigo是leveldb 的一个go wrapper,它主要基于Leveldb中inlude/ ...
- 基于C#的控制台的进度提示实现
在网上搜了很多关键词,比如C#控制台如何删除上一行输出,C#如何控制台删除部分内容,但是都没有很好的教程. 所以自己动手研究一下.也不是什么高深的东西,如下: 用C#开发了一个爬虫下载器,为了知道还剩 ...
- SQL中的join操作总结(非常好)
1.1.1 摘要 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等.如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的 ...
- 3.3v转5v开关电源芯片LM2731
方案一 输入3.3(可为2.7~14v):输出5v,700ma.已经过实际验证. 其中:C1,C2为贴片陶瓷电容,Cf也为贴片陶瓷电容,L1为6.8uH 电感 输出值只和R1,R2的值有关,但手册中又 ...