diff --git a/README.md b/README.md new file mode 100644 index 0000000..0ee8d87 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# Netease Cloud Music Copyright Protection File Dump (Python version) + +## 简介 + +早就在算计网易云ncm文件,不过一直没什么机会,前些天突然看到已经有大佬 [anonymous5l/ncmdump ](https://github.com/anonymous5l/ncmdump)实现了,因为好奇加密算法就用Python移植了下,啊大佬不愧是大佬,感激!测试发现转换出来的媒体文件都已包含媒体信息,故未再实现原repo中的写tag操作。还有Python实现比C++慢不少。仅供学习交流,请勿传播扩散。用Python处理字节真让人头大emmm + +## 依赖 + +``` +pip(3) install pycrypto +``` + +## 使用 + +``` +python(3) ncmdump.py [files ...] +``` \ No newline at end of file diff --git a/ncmdump.py b/ncmdump.py new file mode 100644 index 0000000..422da51 --- /dev/null +++ b/ncmdump.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Jul 15 01:05:58 2018 + +@author: Nzix +""" + +import binascii +import struct +import base64 +import json +import os +from Crypto.Cipher import AES + +def dump(file_path): + + core_key = binascii.a2b_hex("687A4852416D736F356B496E62617857") + meta_key = binascii.a2b_hex("2331346C6A6B5F215C5D2630553C2728") + unpad = lambda s : s[0:-(s[-1] if type(s[-1]) == int else ord(s[-1]))] + + f = open(file_path,'rb') + + # magic header + header = f.read(8) + assert binascii.b2a_hex(header) == b'4354454e4644414d' + + # key data + f.seek(2, 1) + key_length = f.read(4) + key_length = struct.unpack('= key_length: + key_offset = 0 + key_box[i] = key_box[c] + key_box[c] = swap + last_byte = c + + # meta data + meta_length = f.read(4) + meta_length = struct.unpack(' 1: + for file_path in sys.argv[1:]: + try: + dump(file_path) + except: + pass + else: + print('please input file path!')