2024-03-24 18:00:07 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
namespace libncmdump_demo_cli
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// NeteaseCrypt C# Wrapper
|
|
|
|
|
/// </summary>
|
|
|
|
|
class NeteaseCrypt
|
|
|
|
|
{
|
|
|
|
|
const string DLL_PATH = "libncmdump.dll";
|
|
|
|
|
|
|
|
|
|
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
|
|
|
|
|
private static extern IntPtr CreateNeteaseCrypt(IntPtr path);
|
|
|
|
|
|
|
|
|
|
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
|
2024-09-25 22:41:33 +08:00
|
|
|
|
private static extern int Dump(IntPtr NeteaseCrypt, IntPtr outputPath);
|
2024-03-24 18:00:07 +08:00
|
|
|
|
|
|
|
|
|
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
|
|
|
|
|
private static extern void FixMetadata(IntPtr NeteaseCrypt);
|
|
|
|
|
|
|
|
|
|
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
|
|
|
|
|
private static extern void DestroyNeteaseCrypt(IntPtr NeteaseCrypt);
|
|
|
|
|
|
|
|
|
|
private IntPtr NeteaseCryptClass = IntPtr.Zero;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创建 NeteaseCrypt 类的实例。
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="FileName">网易云音乐 ncm 加密文件路径</param>
|
|
|
|
|
public NeteaseCrypt(string FileName)
|
|
|
|
|
{
|
2024-04-06 12:10:56 +08:00
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(FileName);
|
|
|
|
|
|
|
|
|
|
IntPtr inputPtr = Marshal.AllocHGlobal(bytes.Length + 1);
|
|
|
|
|
Marshal.Copy(bytes, 0, inputPtr, bytes.Length);
|
|
|
|
|
Marshal.WriteByte(inputPtr, bytes.Length, 0);
|
|
|
|
|
|
|
|
|
|
NeteaseCryptClass = CreateNeteaseCrypt(inputPtr);
|
2024-03-24 18:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 启动转换过程。
|
|
|
|
|
/// </summary>
|
2024-09-25 22:41:33 +08:00
|
|
|
|
/// <param name="OutputPath">指定一个路径输出,如果为空,则输出到原路径</param>
|
2024-03-24 18:00:07 +08:00
|
|
|
|
/// <returns>返回一个整数,指示转储过程的结果。如果成功,返回0;如果失败,返回1。</returns>
|
2024-09-25 22:41:33 +08:00
|
|
|
|
public int Dump(string OutputPath)
|
2024-03-24 18:00:07 +08:00
|
|
|
|
{
|
2024-09-25 22:41:33 +08:00
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(OutputPath);
|
|
|
|
|
|
|
|
|
|
IntPtr outputPtr = Marshal.AllocHGlobal(bytes.Length + 1);
|
|
|
|
|
Marshal.Copy(bytes, 0, outputPtr, bytes.Length);
|
|
|
|
|
Marshal.WriteByte(outputPtr, bytes.Length, 0);
|
|
|
|
|
|
|
|
|
|
return Dump(NeteaseCryptClass, outputPtr);
|
2024-03-24 18:00:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修复音乐文件元数据。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void FixMetadata()
|
|
|
|
|
{
|
|
|
|
|
FixMetadata(NeteaseCryptClass);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 销毁 NeteaseCrypt 类的实例。
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void Destroy()
|
|
|
|
|
{
|
|
|
|
|
DestroyNeteaseCrypt(NeteaseCryptClass);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|