网易云音乐ncm文件加密格式解析

本文章内容不得用于商业用途,仅做学习交流。如作他用所承受的法律责任一概与作者无关。

NCM格式是网易云音乐独有的文件格式,且无法脱离网易云音乐程序播放。所以解码的逻辑一定就在网易云音乐的程序里面。可以从各个平台的客户端入手,寻找一下解密的痕迹。

开局一张图,剩下全靠编(码) —— NCM文件结构组成

按照文件结构,采用 Chain of Responsibility 模式构建解析过程。其中最核心的几个技术点:

  1. RC4算法
  2. Meta信息解析
  3. Meta后缀是flac但实际格式有可能是mp3

RC4、AES算法内容可以参考这本书 应用密码学:协议、算法与C源程序(原书第2版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
* RC4算法
*/
public class RC4
{
private readonly byte[] _box = new byte[256];

public void KSA(byte[] key)
{
var len = key.Length;
for (var i = 0; i < 256; i++) _box[i] = (byte)i;

for (int i = 0, j = 0; i < 256; i++)
{
j = (j + _box[i] + key[i % len]) & 0xff;
(_box[i], _box[j]) = (_box[j], _box[i]);
}
}

public void PRGA(byte[] data, int length)
{
for (var k = 0; k < length; k++)
{
var i = (k + 1) & 0xff;
var j = (_box[i] + i) & 0xff;
data[k] ^= _box[(_box[i] + _box[j]) & 0xff];
}
}
}

格式不匹配问题,是在用TagLib写入Meta数据的时候抛异常发现的。需要读取 File Signatures 来判断。

1
2
3
//兼容file signatures是mp3但后缀是flac的歌曲
if (BitConverter.ToString(ncmObject.MusicDataArray.Slice(0, 3).ToArray()).Equals("49-44-33"))
ncmObject.NeteaseCopyrightData.Format = "mp3";

其他地方没什么难度。话说回来,.Net跨平台任重道远。Mac上面跑只需要500MB+,Windows上面能用掉3G内存。

完整的代码在 这里 ,支持 Windows & MacOS。

编译成功后使用 -p,–path 参数传入目录即可。

使用 Sony NW-ZX300A 实测可以正常显示专辑封面,HiRes标志也正常显示,我又可以做回 Walkman