酷狗音乐
该项目实现了酷狗 PC 版的 KGM
与 VPR
加密算法实现。虽然它们的后缀名不同,但是解密过程是相同的,仅有的区别为文件头以及密钥的校验值。
该项目实现的不是“码表”解密
在此之前尝试过基于明文的攻击,即通过对比源文件与加密后的文件的不同进行分析,得到了一个密码表来进行解密。该方法有一定的缺陷,如要求足够多的内存且需要使用工具进行压缩。
在此之后也对该密码表进行过攻击1,改进为使用三个 16 × 17 大小的密码表进行解码。缺陷则是随着文件大小的增加,越是在后面的内容越需要更多时间进行解密。
小鹦鹉加解操作密库实现的解密算法不依赖该密码表,而是采用了与 PC 客户端相同的解密实现。
加密格式
加密后的文件可以观测到文件顶部的内容更变。
加密文件头使用小端序对数据进行编码,至少占用
0x3c
个字节。
文件头格式
struct file_header {
// 偏移: 0x00
BYTE magic[0x10]; // 固定内容
// 偏移: 0x10
DWORD offset_to_data; // 到加密数据处的文件偏移
DWORD encryption_type; // 加密类型,可以是 2 / 3 / 4 这三个值之一。
DWORD key_slot; // 密钥槽号
// 偏移: 0x1c
BYTE key_challenge[0x10]; // 文件密钥合法性验证
BYTE key[0x10]; // 文件密钥
// 偏移: 0x3c
BYTE padding[self.offset_to_data - 0x3c];
}
密钥槽
PC 版的客户端储存了一个密钥槽,通过文件头的
key_slot
值选择。
理论上来说,客户端可以储存各种不同的密钥。但实际上只有 1
号密钥槽有存储密钥。
加密类型
关于时间线…
以下内容的“当前”指的是 2022.11.01。
当前版本的酷狗 PC 客户端实现了三种加密类型,分别为 2
、3
与 4
。
其中 2 号加密通过观察,至少在 2017 年时还在投入使用。
目前观测到样本主要采用的是 3 号加密。