From e1c382ddebc9b8fa1597e66b763136af7993046d Mon Sep 17 00:00:00 2001 From: Majjcom Date: Sat, 1 Jan 2022 20:24:33 +0800 Subject: [PATCH] 1.0.0 --- README.md | 21 ++++++++ ncmdump.py | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 ncmdump.py diff --git a/README.md b/README.md index b4fee9e..b19ad27 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,23 @@ # ncmDumper 解锁网易云ncm文件 + +## 特色 +使用多线程进行解锁,速度更快 + +## 使用 +在音乐目录下运行代码,将自动解锁该目录下的所有ncm文件,并存放在`./unlock`目录下 + +## 注意 +你可以使用release中提供的exe文件运行,也可以直接使用源代码文件运行程序 + +- 使用源代码文件时,请确保你的控制台运行目录与待解锁文件目录相同 +- 在使用前,请安装`pycryptodome`,这是必须的,如下: +```shell +pip install pip -U +pip install pycryptodome +``` +- 运行: +```shell +cd /.../你的ncm文件存放目录 +python3 /.../项目目录/ncmdump.py +``` diff --git a/ncmdump.py b/ncmdump.py new file mode 100644 index 0000000..3a1b407 --- /dev/null +++ b/ncmdump.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +import threading +import binascii +import struct +import base64 +import json +import time +import os +from Crypto.Cipher import AES +# pip install pycryptodome + +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') + header = f.read(8) + #字符串转十六进制 + assert binascii.b2a_hex(header) == b'4354454e4644414d' + 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_length = f.read(4) + meta_length = struct.unpack('