好友
阅读权限25
听众
最后登录1970-1-1
|
// 新人发帖, 没有什么技术, 如有错误请多包涵, 谢谢
亲戚的孩子刚上初中, 购买了一台复读机, 结果发现这台机器使用的格式是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), 思路是对的!
那么写一个简单的手动解密工具吧, 人工找到密钥之后输入进去解密:
[C#] 纯文本查看 复制代码 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 | 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[0]);
byte [] file = File.ReadAllBytes(args[1]);
string outputExtention = args[2];
for ( long i = 0; i < file.Length; ++i)
file[i] ^= key[idx++ % key.Length];
File.WriteAllBytes($ "{args[1].Substring(0, args[1].LastIndexOf('.'))}.{outputExtention}" , file);
}
catch (Exception ex)
{
Console.WriteLine($ "错误: {ex}" );
}
}
}
}
|
使用:
没有输出说明转换成功, 出错会将异常信息输出到控制台.
下载: 链接: https://pan.baidu.com/s/1d7DiuJclZl1qvCkMYzU_GA 提取码: ifkc
完毕, 感谢观看. |
免费评分
-
参与人数 7 | 威望 +1 |
吾爱币 +15 |
热心值 +7 |
收起
理由
|
SNmw
| |
+ 1 |
+ 1 |
程序运行出错怎么破? 错误: System.IndexOutOfRangeException: 索引超出了. |
Hmily
| + 1 |
+ 7 |
+ 1 |
感谢发布原创作品,吾爱破解论坛因你更精彩! |
1051496412
| |
+ 1 |
+ 1 |
感谢发布原创作品,吾爱破解论坛因你更精彩!新技能已get√ |
qq364650531
| |
+ 1 |
+ 1 |
感谢发布原创作品,吾爱破解论坛因你更精彩! |
Seper
| |
+ 1 |
+ 1 |
热心回复! |
heyxiaoniu
| |
+ 1 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
初亦泽
| |
+ 3 |
+ 1 |
优秀 |
查看全部评分
|