跳到主要内容

酷狗音乐

该项目实现了酷狗 PC 版的 KGMVPR 加密算法实现。虽然它们的后缀名不同,但是解密过程是相同的,仅有的区别为文件头以及密钥的校验值。

该项目实现的不是“码表”解密

在此之前尝试过基于明文的攻击,即通过对比源文件与加密后的文件的不同进行分析,得到了一个密码表(xor pad)来进行解密。该方法有一定的缺陷,如要求足够多的内存且需要使用工具进行压缩。

在此之后也对该密码表进行过攻击1,改进为使用三个 16 × 17 大小的密码表进行解码。缺陷则是随着文件大小的增加,越是在后面的内容越需要更多时间进行解密。

小鹦鹉加解操作密库实现的解密算法不依赖该密码表,而是采用了与 PC 客户端相同的解密实现。

加密格式

加密后的文件可以观测到文件顶部的内容更变。

加密文件头使用小端序(Little Endian)对数据进行编码,至少占用 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 版的客户端储存了一个密钥槽(slot key),通过文件头的 key_slot 值选择。

理论上来说,客户端可以储存各种不同的密钥。但实际上只有 1 号密钥槽有存储密钥。

加密类型

关于时间线…

以下内容的“当前”指的是 2022.11.01。

当前版本的酷狗 PC 客户端实现了三种加密类型,分别为 234

其中 2 号加密通过观察,至少在 2017 年时还在投入使用。

目前观测到样本主要采用的是 3 号加密。