首页
/ 163MusicLyrics解密算法:QQ音乐API解析机制揭秘

163MusicLyrics解密算法:QQ音乐API解析机制揭秘

2026-02-04 05:20:36作者:秋阔奎Evelyn

你是否曾经遇到过想要获取QQ音乐的逐字歌词(Verbatim Lyrics),却发现官方API返回的都是加密数据?163MusicLyrics项目通过逆向工程和巧妙的解密算法,成功解析了QQ音乐的加密机制。本文将深入解析这一复杂的解密过程,带你了解背后的技术原理。

QQ音乐逐字歌词加密机制概述

QQ音乐为了保护其逐字歌词资源,采用了多重加密策略:

  1. 三重DES加密:使用自定义密钥进行三次DES加密
  2. 十六进制编码:将加密数据转换为十六进制字符串
  3. GZIP压缩:对最终数据进行压缩处理
  4. XML格式包装:将歌词内容包装在XML结构中

这种复杂的加密机制使得直接获取原始歌词变得异常困难。

解密算法核心流程

1. 外部DLL调用机制

163MusicLyrics项目通过调用外部DLL文件QQMusicVerbatim.dll来实现核心解密功能:

[DllImport("QQMusicVerbatim.dll", EntryPoint = "?Ddes@qqmusic@@YAHPAE0H@Z",
    CallingConvention = CallingConvention.Cdecl)]
private static extern void func_ddes(sbyte[] a, string b, int c);

[DllImport("QQMusicVerbatim.dll", EntryPoint = "?des@qqmusic@@YAHPAE0H@Z",
    CallingConvention = CallingConvention.Cdecl)]
private static extern void func_des(sbyte[] a, string b, int c);

2. 三重DES解密流程

flowchart TD
    A[获取加密的十六进制字符串] --> B[转换为sbyte数组]
    B --> C[第一轮DES解密<br>密钥: !@#)(NHLiuy*$%^&]
    C --> D[第二轮DES解密<br>密钥: 123ZXC!@#)(*$%^&]
    D --> E[第三轮DES解密<br>密钥: !@#)(*$%^&abcDEF]
    E --> F[转换为byte数组]
    F --> G[SharpZipLib解压缩]
    G --> H[解析XML获取歌词内容]

3. 核心解密代码实现

public QQMusicBean.LyricResult GetVerbatimLyric(string songId)
{
    var resp = SendPost("https://c.y.qq.com/qqmusic/fcgi-bin/lyric_download.fcg", 
        new Dictionary<string, string>
        {
            { "version", "15" },
            { "miniversion", "82" },
            { "lrctype", "4" },
            { "musicid", songId },
        });
    
    // 移除XML注释
    resp = resp.Replace("<!--", "").Replace("-->", "");

    var dict = new Dictionary<string, XmlNode>();
    XmlUtils.RecursionFindElement(XmlUtils.Create(resp), VerbatimXmlMappingDict, dict);

    var result = new QQMusicBean.LyricResult { Code = 0, Lyric = "", Trans = "" };

    foreach (var pair in dict)
    {
        var text = pair.Value.InnerText;
        if (string.IsNullOrWhiteSpace(text)) continue;

        // 十六进制字符串转换为sbyte数组
        var sz = MathUtils.ConvertStringToHexSbytes(text, out var sbytes);

        // 三重DES解密
        func_ddes(sbytes, "!@#)(NHLiuy*$%^&", sz);
        func_des(sbytes, "123ZXC!@#)(*$%^&", sz);
        func_ddes(sbytes, "!@#)(*$%^&abcDEF", sz);

        // 解压缩处理
        var decompressBytes = MathUtils.SharpZipLibDecompress(MathUtils.SbytesToBytes(sbytes, sz));
        var decompressText = Encoding.UTF8.GetString(decompressBytes);

        // XML解析获取歌词内容
        if (decompressText.Contains("<?xml"))
        {
            // 移除BOM标识
            string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
            if (decompressText[0] == byteOrderMarkUtf8[0])
            {
                decompressText = decompressText.Remove(0, byteOrderMarkUtf8.Length);
            }

            var doc = XmlUtils.Create(decompressText);
            var subDict = new Dictionary<string, XmlNode>();
            XmlUtils.RecursionFindElement(doc, VerbatimXmlMappingDict, subDict);

            if (subDict.TryGetValue("lyric", out var d))
            {
                var lyricContent = d.Attributes["LyricContent"].InnerText;
                switch (pair.Key)
                {
                    case "orig":
                        result.Lyric = LyricUtils.DealVerbatimLyric(lyricContent, SearchSourceEnum.QQ_MUSIC);
                        break;
                    case "ts":
                        result.Trans = LyricUtils.DealVerbatimLyric(lyricContent, SearchSourceEnum.QQ_MUSIC);
                        break;
                }
            }
        }
    }

    return result;
}

关键技术组件解析

1. 十六进制转换工具

public static int ConvertStringToHexSbytes(string s, out sbyte[] sbytes)
{
    sbytes = new sbyte[1024 * 1024];
    var sz = 0;

    for (var i = 1; i < s.Length; i += 2)
    {
        sbytes[sz++] = (sbyte)(ParseHex(s[i - 1]) * 16 + ParseHex(s[i]));
    }

    return sz;
}

2. GZIP解压缩实现

public static byte[] SharpZipLibDecompress(byte[] data)
{
    var compressed = new MemoryStream(data);
    var decompressed = new MemoryStream();
    var inputStream = new InflaterInputStream(compressed);

    inputStream.CopyTo(decompressed);
    return decompressed.ToArray();
}

3. XML解析映射表

private static readonly Dictionary<string, string> VerbatimXmlMappingDict = new Dictionary<string, string>
{
    { "content", "orig" },     // 原文歌词
    { "contentts", "ts" },     // 译文歌词
    { "contentroma", "roma" }, // 罗马音歌词
    { "Lyric_1", "lyric" },    // 解压后的歌词内容
};

解密过程的技术挑战

1. 密钥逆向工程

通过分析QQ音乐客户端的网络请求和内存数据,逆向工程团队成功提取了三组DES加密密钥:

解密轮次 密钥字符串 用途
第一轮 !@#)(NHLiuy*$%^& 初始解密
第二轮 123ZXC!@#)(*$%^& 中间解密
第三轮 !@#)(*$%^&abcDEF 最终解密

2. 数据格式处理

解密过程中需要处理多种数据格式转换:

flowchart LR
    A[十六进制字符串] --> B[sbyte数组]
    B --> C[三重DES解密]
    C --> D[byte数组转换]
    D --> E[GZIP解压缩]
    E --> F[UTF-8字符串]
    F --> G[XML解析]
    G --> H[歌词内容提取]

3. 错误处理机制

项目实现了完善的错误处理机制:

  • 网络请求超时重试
  • 数据格式验证
  • 解密失败回退
  • 歌词内容清洗处理

实际应用场景

1. 歌词批量下载

protected override ResultVo<LyricVo> GetLyricVo0(string id, string displayId, bool isVerbatim)
{
    QQMusicBean.LyricResult resp;
    if (isVerbatim)
    {
        resp = _api.GetVerbatimLyric(id);
        if (resp.Code == 0)
        {
            // 同时获取翻译歌词
            var resp2 = _api.GetLyric(displayId);
            if (resp2.Code == 0)
            {
                resp.Trans = resp2.Trans;
            }
        }
    }
    else
    {
        resp = _api.GetLyric(displayId);
    }
    
    return resp.Code == 0 ? new ResultVo<LyricVo>(resp.ToVo()) : ResultVo<LyricVo>.Failure(ErrorMsg.LRC_NOT_EXIST);
}

2. 多类型歌词支持

项目支持多种歌词类型处理:

歌词类型 处理方式 输出格式
原文歌词 直接解密 LRC格式
翻译歌词 Base64解码 LRC格式
逐字歌词 三重解密+解压缩 自定义XML格式
罗马音歌词 特殊处理 拼音格式

技术实现的价值意义

163MusicLyrics项目的QQ音乐API解密机制具有重要的技术价值:

  1. 逆向工程典范:展示了如何通过技术手段解析商业API的保护机制
  2. 跨平台兼容:支持Windows和跨平台版本,技术实现具有通用性
  3. 开源贡献:为音乐技术社区提供了宝贵的技术参考和实现方案
  4. 教育意义:深入理解加密算法、网络协议、数据解析等核心技术

总结与展望

QQ音乐API的解密机制是一个典型的技术案例,163MusicLyrics项目通过精湛的逆向工程技术成功解析了这一复杂系统。这种技术实现不仅解决了用户获取逐字歌词的实际需求,也为类似的技术挑战提供了可参考的解决方案。

随着音乐平台安全机制的不断升级,未来的技术挑战将更加复杂。但正是这种技术探索精神,推动着开源社区不断前进,为用户创造更多价值。

技术要点回顾

  • 三重DES加密算法的逆向工程
  • 外部DLL调用的巧妙运用
  • 多格式数据处理的完整性
  • 完善的错误处理机制
  • 跨平台兼容的技术架构

通过深入理解这些技术细节,开发者可以更好地应对类似的技术挑战,推动音乐技术领域的创新发展。

登录后查看全文
热门项目推荐
相关项目推荐