QMC 2
当前 QQ 音乐使用的主流加密格式。
后缀名
目前看来有以下几种后缀名:
mgg
- ogg 文件mflac
- flac 文件
有些客户端会在后缀名的后面再添加一位数字,如 mgg0
或 mflac1
。没有任何特殊意义。
文件结构
文件分为两部分:
- 加密后的音频流
- 加密元信息(含有 Embed Key)
目前已知的元信息有三种,其中两种含有加密后的嵌入密钥。
安卓客户端生成的加密元信息
使用大端序。
其中可能包含两种数据,通过结尾的 tag
字段进行判断,数据结构如下:
struct QMAndroidTag {
char csv_row[variable]; // 使用逗号分隔的文字,可以分解为 3 段。
uint32_t sizeof_csv_row; // 上述字符串的大小(大端序)
char tag[4]; // 文件类型标记
}
QTag
当 QMAndroidTag.tag
为 "QTag"
时,csv_row
由下述三段组成:
encrypted_key
- 长度可变,加密后的嵌入密钥。song_id
- 曲目 ID,数字形式的文本。unknown
- 未知数据,该值恒定为'2'
。
样例:
1d
00
A
00
01
02
03
04
05
06
07
08
09
0a
0b
0c
0d
0e
0f
00
45
6e
63
72
79
70
74
65
64
4b
65
79
2c
31
32
33
E
n
c
r
y
p
t
e
d
K
e
y
,
1
2
3
10
34
35
36
2c
32
00
00
00
15
51
54
61
67
4
5
6
,
2
.
.
.
.
Q
T
a
g
STag
当 QMAndroidTag.tag
为 "STag"
时,csv_row
由下述三段组成:
unknwon_1
- 纯数字,可能是song_id
。unknown_2
- 未知数据,该值恒定为'2'
。unknown_3
- 可能是media_id
,不确定。
因为 STag
标签的文件没有再内置密钥,因此未深入研究该类加密。
初步怀疑加密算法未进行更变,但是密钥存储在应用的私有目录下。
PC 客户端生成的加密元信息
使用小端序。
encrypted_key
- 长度可变,加密后的文件密钥。encrypted_key_size
- 4 字节,指定encrypted_key
的字节数量。
其中 encrypted_key
是加密后的密钥。
样例:
14
00
A
00
01
02
03
04
05
06
07
08
09
0a
0b
0c
0d
0e
0f
00
45
6e
63
72
79
70
74
65
64
4b
65
79
48
65
72
65
E
n
c
r
y
p
t
e
d
K
e
y
H
e
r
e
10
10
00
00
00
.
.
.
.
支持
库可以正常解密部分使用该加密方案的文件。
未测试 iOS / Mac 平台,已知不支援安卓客户端生成的 STag
标签的加密文件。