寻找包描述语言(最好使用C#实现)

时间:2011-06-30 16:25:11

标签: c# parsing networking packet

我正在开发一个具有一些数据包嗅探和解码功能的专用网络工具。我正在寻找旨在帮助解剖/解码任意数据包格式的语言。理想情况下,解决方案应基于开放标准。有关于SO的相关问题,但大多数涉及数据包嗅探的整个生命周期(我不太关心捕获,还有其他库可以做到这一点)。

一般来说,我正在寻找的是一种语言和支持框架,用于分组格式的明确定义和相应的运行时解码。因为这个问题可以推广到任何非网络二进制数据,所以对任意二进制流执行此操作的解决方案也将在范围内。我有点惊讶,目前在成熟和稳健的状态下没有这样的标准(至少我能找到) - 虽然似乎有很多有趣但不完全正确且几乎有项目(见下文)。也许这说明了问题的困难,或者可能是缺乏需求。

举例来说,我对以下类似的技术和想法很感兴趣(没有特别的顺序):

  • Packet.Net - 从二进制数据包表示转换为结构的工作,但解剖器都是硬编码的,似乎无法处理更复杂的格式。
  • DFDL - 我一直在关注这个问题,甚至在大约一年前参加电话会议。该标准似乎已达到成熟,但实施似乎具有挑战性。我并不介意弄脏自己的手,但我不确定我是否已经获得了这个项目的资源,为此目的从头开始实施这样一个广泛的标准。
  • Network Monitor Open Source Parsers - 此项目使用类似C语法的数据包描述Microsoft Network Monitor使用的数据包。它已经定义了很多数据包,语言看起来足够强大,可以支持复杂的结构。不幸的是,执行引擎的唯一实现是在NetMon中,虽然语言的语法可能是逆向工程的,但实现处理引擎可能非常困难。我还担心,由于解析器语言和NetMon工具之间的明确联系,语言的非一般方面会使其不适合在其他工具中使用。
  • NetPDL - 这个看起来非常有趣,但发展似乎已经衰弱了。如何在自己的环境之外使用执行引擎也不是很清楚。
  • Wireshark Dissectors - 我考虑过为此目的包装/使用原生Wireshark Dissector,但它们与Wireshark本身紧密相关。解剖器也使用代码来执行大部分解码,这与我正在寻找的东西有点相反 - 我更喜欢一些更具说明性的东西(尽管显然存在平衡,因为复杂的数据包结构通常需要切换和其他判断最终化妆的逻辑。)
  • BSDL - 与DFDL概念相似的学术语言(见上文)。有趣且正确的方向,但在几篇论文之外似乎没有别的东西存在。

我不一定在这里寻找一个完整的解决方案(但如果有人知道我没有涉及的那个,那就太棒了)。我对我上面提到的技术的评论或轶事更感兴趣,以及我没有想到或涵盖的路线的指针或想法。

2 个答案:

答案 0 :(得分:0)

Wireshark解剖器框架非常强大。请在此处阅读说明 -

http://www.wireshark.org/docs/wsdg_html_chunked/ChapterDissection.html#ChDissectWorks

我必须为你解决类似的问题。对我来说,协议必须与实际的传输介质无关(主要是udo或top),但在测试期间它只是在内存ipc中。

所以我使用protobuf以结构化的方式定义了一个协议 -

http://code.google.com/p/protobuf/

然后自己定义了一个解剖器,但不完全像 - http://code.google.com/p/protobuf-wireshark/

所以我可以在测试时使用直接内存分析解剖,并在线上进行wireshark解剖。当然,因为协议是使用protobuf定义的,所以在内存解析器和wireshark解析器之间有很多代码重用。

答案 1 :(得分:-1)

在Windows中尝试Winsock2界面。在Windows XP(SP2之前)或Windows Server变体中,对创建原始套接字,检查数据包内容等没有任何限制......