跳到主要内容

QMC 2

当前 QQ 音乐使用的主流加密格式。

后缀名

目前看来有以下几种后缀名:

  • mgg - ogg 文件
  • mflac - flac 文件

有些客户端会在后缀名的后面再添加一位数字,如 mgg0mflac1。没有任何特殊意义。

文件结构

文件分为两部分:

  • 加密后的音频流
  • 加密元信息(含有 Embed Key)

目前已知的元信息有三种,其中两种含有加密后的嵌入密钥。

安卓客户端生成的加密元信息

使用大端序(Big Endian)

其中可能包含两种数据,通过结尾的 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 客户端生成的加密元信息

使用小端序(Little Endian)

  • 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 标签的加密文件。

下一步