2024-02-08 01:26:49 +08:00
|
|
|
|
# NcmMiao :tada:
|
2024-08-17 22:30:42 +08:00
|
|
|
|
[](https://github.com/Lkhsss/NcmMiao/actions/workflows/build.yml)
|
|
|
|
|
|
|
2025-03-15 17:09:57 +08:00
|
|
|
|
一个使用Rust语言编写的ncm文件解密工具😆。
|
2024-02-08 01:26:49 +08:00
|
|
|
|
|
2024-02-08 01:16:34 +08:00
|
|
|
|
### 功能及特点
|
|
|
|
|
|
- 支持单一文件,多文件夹递归批量解密。
|
|
|
|
|
|
- 完善的日志功能
|
|
|
|
|
|
- Colorful
|
|
|
|
|
|
- 编译文件小,解密快
|
2025-03-15 17:09:57 +08:00
|
|
|
|
- 支持自动添加封面!
|
|
|
|
|
|
- 自动打开输出文件夹
|
|
|
|
|
|
- 简约美观
|
2024-02-08 01:16:34 +08:00
|
|
|
|
|
|
|
|
|
|
## 编译
|
|
|
|
|
|
```
|
|
|
|
|
|
cargo build -r
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 使用
|
|
|
|
|
|
支持单一文件,多文件夹递归批量解密。
|
|
|
|
|
|
```
|
2024-11-17 02:35:24 +08:00
|
|
|
|
ncmmiao [OPTIONS]
|
|
|
|
|
|
Options:
|
2025-03-23 01:05:07 +08:00
|
|
|
|
-w, --workers <WORKERS> 并发的最大线程数,默认为8线程(性能还行的话建议直接32-64,嘎嘎快)
|
|
|
|
|
|
-i, --input <输入文件/目录> 需要解密的文件夹或文件
|
|
|
|
|
|
-o, --output <输出目录> 输出目录 [default: NcmmiaoOutput]
|
|
|
|
|
|
-f, --forcesave 强制覆盖保存开关
|
|
|
|
|
|
-a, --autoopen 自动打开输出目录
|
2024-02-08 01:16:34 +08:00
|
|
|
|
```
|
2024-02-08 01:26:49 +08:00
|
|
|
|
|
2024-11-17 02:35:24 +08:00
|
|
|
|
~~输出文件夹在output。等我想写了再写命令行解析(bushi。~~ 写了写了
|
2024-02-08 01:26:49 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# TODO :construction:
|
2024-08-17 22:05:34 +08:00
|
|
|
|
- [x] 多线程支持
|
2024-11-17 02:35:24 +08:00
|
|
|
|
- [x] 自动添加封面
|
2025-01-07 00:34:16 +08:00
|
|
|
|
- [x] 解密进度条
|
2024-11-17 02:35:24 +08:00
|
|
|
|
- [x] 命令行解析
|
|
|
|
|
|
- [x] 自定义输出文件夹
|
|
|
|
|
|
- [x] 计时功能
|
2025-01-07 00:34:16 +08:00
|
|
|
|
- [x] 自动覆盖开关
|
2025-08-12 22:27:40 +08:00
|
|
|
|
- [x] 优化并发设置
|
|
|
|
|
|
- [x] 优化信息传递
|
2025-08-12 17:49:34 +08:00
|
|
|
|
|
2025-08-12 22:26:46 +08:00
|
|
|
|
|
2024-02-08 01:26:49 +08:00
|
|
|
|
---
|
2025-03-15 16:17:33 +08:00
|
|
|
|
# [Changelog](CHANGELOG.md)
|
|
|
|
|
|
---
|
2024-02-08 01:16:34 +08:00
|
|
|
|
|
|
|
|
|
|
# 附 - ncm文件结构
|
|
|
|
|
|
|信息|大小|作用|
|
|
|
|
|
|
|:-:|:-:|:-:|
|
|
|
|
|
|
|Magic Header|8 bytes|文件头|
|
|
|
|
|
|
|Gap|2 bytes||
|
|
|
|
|
|
|Key Length|4 bytes|RC4密钥长度,字节是按小端排序。|
|
|
|
|
|
|
|Key Data|Key Length|RC4密钥|
|
|
|
|
|
|
|Music Info Length|4 bytes|用AES128加密后的音乐相关信息的长度,小端排序。|
|
|
|
|
|
|
|Music Info Data|Music Info Length|Json格式音乐信息数据。|
|
|
|
|
|
|
|Gap|5 bytes||
|
|
|
|
|
|
|CRC校验码|4 bytes|图片的CRC32校验码,小端排序。|
|
|
|
|
|
|
|Image Size|4 bytes|图片的大小|
|
|
|
|
|
|
|Image Data|Image Size|图片数据|
|
|
|
|
|
|
|Music Data||音乐数据|
|
|
|
|
|
|
---
|
|
|
|
|
|
### Magic Header
|
|
|
|
|
|
### Key Data
|
|
|
|
|
|
用AES128加密后的RC4密钥。
|
|
|
|
|
|
1. 先按字节对0x64进行异或。
|
|
|
|
|
|
2. AES解密,去除填充部分。
|
|
|
|
|
|
3. 去除最前面'neteasecloudmusic'17个字节,得到RC4密钥。
|
|
|
|
|
|
### Music Info Data
|
|
|
|
|
|
Json格式音乐信息数据。
|
|
|
|
|
|
1. 按字节对0x63进行异或。
|
|
|
|
|
|
2. 去除最前面22个字节。
|
|
|
|
|
|
3. Base64进行解码。
|
|
|
|
|
|
4. AES解密。
|
|
|
|
|
|
6. 去除前面6个字节,后面数量为最后一个字节的字节数的垃圾数据,得到Json数据。
|
|
|
|
|
|
|
|
|
|
|
|
### Music Data
|
|
|
|
|
|
1. RC4-KSA生成S盒。
|
|
|
|
|
|
2. 用S盒解密(自定义的解密方法),不是RC4-PRGA解密。
|
|
|
|
|
|
|
|
|
|
|
|
|