whc2001 发表于 2019-1-27 07:09

SMP格式音频文件的解密(类型: 异或加密)

// 新人发帖, 没有什么技术, 如有错误请多包涵, 谢谢

亲戚的孩子刚上初中, 购买了一台复读机, 结果发现这台机器使用的格式是SMP格式, 无法用普通播放器播放, 来找我看能不能解决.

文件长这样:


转换日志, 没有什么发现:


将一个SMP文件拖入WinHex看看, 有点意思, 为什么这么多0xA7? (那些奇怪的背景色标识是之前逆向一个游戏资源的时候做的标记忘了删掉)


想到了异或加密, 使用编辑->修改数据, 对所有数据进行异或0xA7:


啊哈! ID3都出来了, 立刻保存为MP3格式测试:


正常播放! 再来看看旁边同名的HRC格式文件:


嗯, 没啥头绪, 不会也是异或0xA7吧, 试试再说:


还真是! 保存为LRC格式文件, 放在MP3同一目录下测试:


大成功!

兴奋之余, 我上论坛搜了一下, 发现之前似乎有不少人都提到了这种格式(特指插卡音箱/解码板中使用的SMP格式, 而不是游戏资源封包), 但似乎没有太多的解决方案.
例如: https://www.52pojie.cn/thread-851703-1-1.html
个人的思路是: 插卡音箱通常使用特定的解码芯片, 这类芯片有简单的可编程功能, 但无法做到复杂耗时的操作(除非像上面这个帖子二楼说的, 有的解码芯片方案可能带有硬件资源, 进行这种方案特有的加密, 就比较难办), 而大多数保护应当是较为简单可以快速完成的.
于是用同一种方法来看看上面这个帖子的文件:


哦, 这次没有0xA7了, 但是为啥多了这么多0x05603515?
会不会是四个字节一组, 第一字节异或0x05, 第二字节异或0x60, 第三字节异或0x35, 第四字节异或0x15, 第五字节异或0x05 ......?
试试吧, WinHex似乎只能对整个文件进行单个字节的异或, 那就一个一个来:


注意画圈的部分, 按顺序异或之后成功组成了MP3-ID3的帧头(ID3./0x49443303), 思路是对的!
那么写一个简单的手动解密工具吧, 人工找到密钥之后输入进去解密:
using System;
using System.Collections.Generic;
using System.IO;

namespace SmpXorDecrypt
{
    class Program
    {
      private static byte[] HexStringToByteArray(string hex)
      {
            if (hex.Length % 2 != 0)
                hex = "0" + hex;
            List<byte> bytes = new List<byte>();
            for (int i = 0; i < hex.Length; i += 2)
                bytes.Add(byte.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier));
            return bytes.ToArray();
      }

      static void Main(string[] args)
      {
            try
            {
                int idx = 0;
                byte[] key = HexStringToByteArray(args);
                byte[] file = File.ReadAllBytes(args);
                string outputExtention = args;
                for(long i = 0; i < file.Length; ++i)
                  file ^= key;
                File.WriteAllBytes($"{args.Substring(0, args.LastIndexOf('.'))}.{outputExtention}", file);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"错误: {ex}");
            }
      }
    }
}

使用:

没有输出说明转换成功, 出错会将异常信息输出到控制台.
下载: 链接: https://pan.baidu.com/s/1d7DiuJclZl1qvCkMYzU_GA 提取码: ifkc

完毕, 感谢观看.

whc2001 发表于 2019-1-28 15:52

shaokui123 发表于 2019-1-28 15:26
会不会是四个字节一组, 第一字节异或0x05, 第二字节异或0x60, 第三字节异或0x35, 第四字节异或0x15, 第五字 ...

对整个文件进行循环异或, 是第一字节异或0x05, 第二字节异或0x60, 第三字节异或0x35, 第四字节异或0x15, 第五字节异或0x05, 第六字节异或0x60......工作量很大, 建议使用我帖子最后给出的工具搞定. 以及不同的机器密钥可能不一样, 找密钥的方法是用十六进制编辑器打开SMP文件, 在文件头部和尾部找出现次数最多的那几个字节(因为文件头尾基本上有很多0), 便是密钥. 文件类型一般是MP3, 如果放不了可以把解密之后的文件再用十六进制编辑器打开找其他线索.

whc2001 发表于 2021-6-14 23:09

9998887776 发表于 2021-6-6 22:48
为什么我按你的方法和工具做了 转出了MP3没有声?   我用WINHEX打开发现密码是EBECEDEE,用你 的工具解 ...

你这个我看了一下,0xEBECEDEE第一眼看起来是密钥没错,但是确实无法正常播放,同时文件末尾部分有很多FF,想到是不是搞反了,对整个文件做了一下按位取反,末尾部分出现了明文信息(如图)并可以正常播放,说明密钥其实是NOT(0xEBECEDEE)=0x14131211

shaokui123 发表于 2019-1-28 14:08

好像是研究这个第一个有突破性进展的啊

whc2001 发表于 2019-1-28 15:19

shaokui123 发表于 2019-1-28 14:08
好像是研究这个第一个有突破性进展的啊

我看了一下好像大部分这种格式都是这种简单的异或加密, 密钥应该是预先写进品牌订购的解码芯片里的.
不过论坛里搜了一圈找到了这个帖子: https://www.52pojie.cn/thread-799890-1-1.html 这个SMP似乎比较特殊, 单次异或解密之后仍然不是明文, 稍微看了看卡壳了, 有时间研究一下

shaokui123 发表于 2019-1-28 15:26

会不会是四个字节一组, 第一字节异或0x05, 第二字节异或0x60, 第三字节异或0x35, 第四字节异或0x15, 第五字节异或0x05 ......?
试试吧, WinHex似乎只能对整个文件进行单个字节的异或, 那就一个一个来:


注意画圈的部分, 按顺序异或之后成功组成了MP3-ID3的帧头(ID3./0x49443303)


大神,这步怎么操作啊,0x05603515,第一步05,然后第二步实际出现的字符,四步完了再循环还是原来的数据,怎么组成帧头啊?

四个冬季 发表于 2019-1-29 10:14

感谢楼主,抽时间研究下孩子妈妈买的国学机

SVT诺天 发表于 2019-1-29 18:19

你好,请问bnl格式点读包能破解吗。有什么教程能看,能推荐吗,什么都不会,看不懂您的破解过程

SVT诺天 发表于 2019-1-29 18:23

怎么看出来A7多的,我看别的也不少

whc2001 发表于 2019-1-30 13:36

SVT诺天 发表于 2019-1-29 18:19
你好,请问bnl格式点读包能破解吗。有什么教程能看,能推荐吗,什么都不会,看不懂您的破解过程

点读机一般比较难办, 因为内容不是单个音频文件而是很多片段和索引坐标, 而且即使弄出明文来也没有什么意义, 因为还是要配合课本使用.

whc2001 发表于 2019-1-30 13:36

SVT诺天 发表于 2019-1-29 18:23
怎么看出来A7多的,我看别的也不少

通常明文文件头部和尾部会有很多0x00, 就在这些地方找, 感觉像的就试一下
页: [1] 2 3 4 5 6 7
查看完整版本: SMP格式音频文件的解密(类型: 异或加密)