吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1591|回复: 10
收起左侧

[Python 转载] 解码ncm文件为mp3文件

[复制链接]
icer233 发表于 2024-10-6 22:22
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*- coding: utf-8 -*-
 
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')
    header = f.read(8)
    #字符串转十六进制
    assert binascii.b2a_hex(header) == b'4354454e4644414d'
    f.seek(2,1)
    key_length = f.read(4)
    key_length = struct.unpack('<I', bytes(key_length))[0]
    key_data = f.read(key_length)
    key_data_array = bytearray(key_data)
    for i in range(0, len(key_data_array)):
        key_data_array[i] ^= 0x64
    key_data = bytes(key_data_array)
    cryptor = AES.new(core_key, AES.MODE_ECB)
    key_data = unpad(cryptor.decrypt(key_data))[17:]
    key_length = len(key_data)
    key_data = bytearray(key_data)
    key_box = bytearray(range(256))
    c = 0
    last_byte = 0
    key_offset = 0
    for i in range(256):
        swap = key_box[i]
        c = (swap + last_byte + key_data[key_offset]) & 0xff
        key_offset += 1
        if key_offset >= 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('<I', bytes(meta_length))[0]
    meta_data = f.read(meta_length)
    meta_data_array = bytearray(meta_data)
    for i in range(0, len(meta_data_array)):
        meta_data_array[i] ^= 0x63
    meta_data = bytes(meta_data_array)
    meta_data = base64.b64decode(meta_data[22:])
    cryptor = AES.new(meta_key, AES.MODE_ECB)
    meta_data = unpad(cryptor.decrypt(meta_data)).decode('utf-8')[6:]
    meta_data = json.loads(meta_data)
    crc32 = f.read(4)
    crc32 = struct.unpack('<I', bytes(crc32))[0]
    f.seek(5, 1)
    image_size = f.read(4)
    image_size = struct.unpack('<I', bytes(image_size))[0]
    image_data = f.read(image_size)
    file_name = f.name.split("/")[-1].split(".ncm")[0] + '.' + meta_data['format']
    m = open(os.path.join(os.path.split(file_path)[0], file_name), 'wb')
    chunk = bytearray()
    while True:
        chunk = bytearray(f.read(0x8000))
        chunk_length = len(chunk)
        if not chunk:
            break
        for i in range(1, chunk_length+1):
            j = i & 0xff
            chunk[i-1] ^= key_box[(key_box[j] + key_box[(key_box[j] + j) & 0xff]) & 0xff]
        m.write(chunk)
    m.close()
    f.close()
    return file_name
 
 
if __name__ == '__main__':
    file_list = ['董小姐.ncm']
    for file in file_list:
        filepath = "./"+file
        dump(filepath)


将需要解码的ncm文件和python文件放在同一目录下
把ncm文件名填入第80行中即可
记得安装依赖库
Crypto.Cipher库安装可能会出现问题,请自行百度

免费评分

参与人数 5吾爱币 +5 热心值 +4 收起 理由
igfpxnb + 1 + 1 谢谢@Thanks!
快乐的小驹 + 1 + 1 谢谢@Thanks!
han163426 + 1 热心回复!
helian147 + 1 + 1 热心回复!
1783780690 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| icer233 发表于 2024-10-7 10:33
快乐的小驹 发表于 2024-10-7 09:23
Crypto.Cipher库安装也无法解析啊!

https://blog.csdn.net/sinat_34989392/article/details/132237650           一般用前两步就能解决
快乐的小驹 发表于 2024-10-7 09:23
wsasecy 发表于 2024-10-7 10:04
快乐的小驹 发表于 2024-10-7 09:23
Crypto.Cipher库安装也无法解析啊!

一顿操作猛如虎,行了没、再报。
Alanguth 发表于 2024-10-7 19:52
无损音乐能转成flac吗?
 楼主| icer233 发表于 2024-10-7 20:33
Alanguth 发表于 2024-10-7 19:52
无损音乐能转成flac吗?

理论是可以的,但是这段代码是转mp3的
xfmiao 发表于 2024-10-8 16:08
https://blog.csdn.net/m0_50869837/article/details/139929696
这个楼主本人吗,代码一样的
chinaxndd 发表于 2024-10-9 08:50
学习了,原来python代码如此精简
 楼主| icer233 发表于 2024-10-11 22:15
xfmiao 发表于 2024-10-8 16:08
https://blog.csdn.net/m0_50869837/article/details/139929696
这个楼主本人吗,代码一样的

源代码是在github上看到的,所以投了转载
spawn_fly 发表于 2024-12-3 20:43
谢谢,刚试了ncm文件,确实可以
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-12 20:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表