【问题标题】:clues, advices about how to decode a packet关于如何解码数据包的线索,建议
【发布时间】:2012-11-13 11:50:28
【问题描述】:

我去年收到了一份礼物,它是索尼 CMT700Ni 音频站,支持 wifi。它还具有类似于广播的功能,称为“PartyStreaming”。我目前正在挖掘内部,探索它,所以也许我可以结束拥有自己的“PartyStreaming”设备并免费拥有类似 AirPlay 的功能(挑战也很有趣)

PartyStreaming 是一个非常容易理解的基于 SOAP 的服务。有 4 个主要功能分为 2 组:服务器端和客户端。每组中的 2 个函数代表开始与对方的连接或结束连接(服务器的开始/停止,客户端的加入/离开)

实际上我已经走了很远,因为我现在能够访问服务器 - 音频站 - 在网络上传播的音频数据。似乎,在使用soap方法加入服务器后,客户端必须在端口3975上向服务器发送一个UDP数据包。收到后,服务器通过在同一端口上向客户端发送数据包来回复,持续30秒。

看了大约一百个之后,我发现一个典型的数据包长 1024 字节,其中有 64 字节的标头,64 字节的 0 填充,然后是 896 字节的声音数据。

我现在有了数据,但它看起来像是一堆随机写入的字节。没有编解码器信息,没有结构,没有“块格式”(就像在波形文件中一样)。我找不到任何关于协议或任何“PartyStreaming”相关技术资料的好文档。

我的问题是:“嘿 StackOverflow,有什么建议吗?有什么线索吗?我应该放弃还是你有一个可以测试的想法?”


可能有用的东西:


我现在要测试的东西:

  • 作为客户端捕获 UDP 数据包,然后启动服务器并将该数据发送到我的音频站,看看它是否可以读取它;也许有服务器端加密,如果是这样,我就卡住了

  • 建立一个1kHz的文件,并在音频站播放;捕获数据包并观察其字节,也许与用许多编解码器编码的同一文件进行比较以找到模式......

【问题讨论】:

  • 你使用什么编程语言?
  • 我使用python进行快速开发,但我可以使用其他任何东西

标签: audio udp protocols reverse-engineering network-protocols


【解决方案1】:

由于您的比特率非常高,数据可能未压缩。如果是这种情况,您的数据字节并不是真正随机的 - 至少它们不是均匀分布的。

尝试以不同的分辨率(8 位、16 位,也许介于两者之间)重建样本(即读取有符号整数)。对许多数据包执行此操作,计算并显示直方图(对于 8 位:计算有多少 -128,有多少 -126 ... 有多少 127)。

您应该为每个可能的值收集至少 100 个样本(例如 8 位:12,800 个样本)以获得良好的统计数据。然后查看您的直方图。如果它是平坦的并且所有值的出现次数大致相同,则它被压缩/加密,或者您每个样本选择了错误的位。如果某些值的出现次数明显多于或少:宾果游戏是未压缩的声音样本!

如果每个样本的所有位都得到平坦的直方图,那就更难了。您可以尝试将 100kb 的数据转储到文件中并通过 linux/unix file 命令运行它,看看它是否识别格式。它可能会识别压缩。然后,您必须解压缩并使用未压缩的流重复整个过程:分析直方图并运行 file

还可以尝试通过 vlc、mplayer、ffplay 运行它,它们利用丰富的库(如 ffmpeg)并可能识别流或在调试输出中为您提供有用的消息。

无论如何,如果它被加密了,你就完蛋了……或者至少我怀疑付出的努力是否值得;)

【讨论】:

  • 我已经尝试过使用最大数据转储的 vlc(问题中的第一个 cloudlyapp 链接)但没有成功。我的一个朋友刚刚在 Audacity 中打开并播放了它。他对我说,它在 32khz 16b 立体声中看起来有点慢,所以他正在考虑 ADPCM,但由于他没有任何参考资料,所以他可能是错的......
  • 试试 ffmpeg,加上 -f s16le -ar 44.1k -ac 2 explained。此外,如果您对它感到满意,您可以有问题地输出它 - 因为您提到了 python try pyo
  • 非常感谢。我会尽快尝试你的建议。顺便说一句,我可以很好地处理它,因为我已经确认再次将我的原始转储播放到 Audacity 并经过一些设置,并且耳朵很好,我可以听到一个词。这有点乱,但这给了我一个暗示,数据没有加密。在您的测试之后,我将尝试生成一个 1k 立体声正弦,仅 1k 左正弦,仅 1k 右正弦,pcm 44.1k 16b、32k 16b 中的 3 个、常规 mp3 以及其他一些东西;我将在服务器上播放它并捕获字节以找到模式
【解决方案2】:

您可能不得不猜测一种格式。首先,看看比特率。你每秒得到多少字节?这将帮助您计算它是 PCM 还是压缩格式。

您应该能够非常轻松地排除 PCM。将一堆音频包放入具有不同标头(例如 44.1kHz/32kHz、16kHz、16 位/8 位、单声道/立体声)的 WAV 文件中,看看您是否听到任何与您的音乐相似的声音。

如果这不起作用,您需要猜测压缩格式。 MP3 可能值得一试(您可以通过查看每个数据包中的前四个字节是否为 frame header 来识别它)。

您可能会发现它支持多种格式,因为文档似乎建议您可以从 Windows Media player 播放它。因此,您可以查看 64 字节的标头,看看当您向其发送以不同格式编码的文件时会发生什么变化。

【讨论】:

  • 码率不好计算,服务端连续30s向客户端发包。据我所知,它是 896 字节。我试着统计这段时间内的数据包数量,结果总是在 4300 个数据包左右。
  • 关于 mp3,我确定不是因为数据包数据部分的所有字节都在变化。我试图将音频站的源更改为不输出声音的东西(没有插入源的线路输入)并且所有数据字节都更改为 0x00,所以我确定没有一致的“帧头”东西
  • 嗯,这是相当大的数据量,大约 128kB/s 指向未压缩的 PCM。不过,44.1Khz 立体声 16 位还不够。但是,它非常接近 32kHz 16 位立体声。尝试将捕获的数据包写入具有该格式的 WAV 文件,看看是否正常。
  • 这正是我在 30 秒的日志记录后看到转储大小时的想法:~3.7MB...我很快就会尝试这个(几个小时)并让你更新我的结果。
  • 因为我有 5mns,我生成了一个空的 32kHz 16 位立体声波文件,带有 1s 无声的声音。我认为它可以帮助我快速识别标题。我看不到一些看起来很熟悉的标头字节。如果您查看波形文件的标题(5249 4646 3006 0200 5741 5645 666d 7420 1200 0000 0100 0200 007d 0000 00f4 0100),则我捕获的数据包的标题(5642 0001 0008 d97f)没有一种常见的模式0000 0540 0010 0001 f93f 034d 9522 0140 ac44 0100 0000) 0400 1000 0000 6461 7461 00f4 0100 0000
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2018-02-15
  • 2020-11-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多