我一直在尝试对此进行研究,而且似乎几乎所有内容都已过时。该站点和其他资源上的先前答案提到了一个名为Canape的工具,该工具似乎已不再维护,或者是netzob工具,该工具多年未更新。虽然我确实设法使它运行起来,但它似乎并不是非常有用。
#1 楼
查看Kaitai Struct。基本上,您在YAML中定义了一种二进制格式,它将生成代码以对该格式进行反序列化。有一个github存储库,其中有很多现有的定义,其中包括UDP的定义。
它还有一个简单的十六进制查看器,非常适合可视化-它会在您四处移动时突出显示格式部分/结构/字段。或者,您也可以使用生成的代码编写自己的程序以进行查看,分析,测试等。
一旦您熟悉了定义语言,它就可以让您更多地专注于弄清协议或文件格式,而更少有关如何解析的信息。
#2 楼
可能有必要检查一下Wireshark的解剖器。这是使用Lua的很好的教程。评论
但是,请记住,Lua解剖器-除了最简单的解剖器之外-往往会减慢整个捕获和显示过程。去过也做过。但我喜欢它们的原型。
– 0xC0000022L♦
12月1日8:49
#3 楼
每个人都想要一个魔术工具,它使逆向未知二进制协议的工作变得不那么繁琐。我希望我们会在接下来的12个月中看到一些实现此目的的方法。基于文本(认为JSON有效负载)的协议通常更容易逆转,因为作为人类,您可以检查数据并至少了解片段的类型和字段之间的边界。二进制协议对于类型和字段边界都是模棱两可的。这4个字节是IEEE Float还是2个无符号短裤或4个ASCII字符?它可能很繁琐且需要时间,但是您或一组工程师可以完成它。因此,如果您无权访问该程序,而您所拥有的只是一些网络跟踪或流量限制,赔率对你不利。我认为您还没有看到现代工具的原因是因为它很困难且花费更少的精力,您可以坚持使用诸如JSON /任何ASCII之类的文本协议格式,或者通过进行二进制程序检测和分析来获得更多收益。确定程序本身的格式。
那么,您可以尝试什么呢?以下假设您有很多消息,并且已将它们分组为纯格式,这意味着每条消息的字段布局完全相同,只有值不同。长度相同还是不同?
如果长度相同,则样本中没有可变长度字段。
如果长度不同,是否总是以2或4为单位?还是长度上有偶数和奇数差异?这样可以告诉您消息的可变长度部分的单位大小。消息与消息开始处有特定偏移量的消息?这些可以帮助您确定相对于消息开始位置而言具有变化值的字段的开始位置。
是否有任何对应于消息长度的字节区域?
如果您在UDP中有长度可变的消息,并且找到了长度字段,则可能表明该格式被设计为可以在UDP之外的其他地方使用。 UDP有一个长度字段,所以为什么要发送两次长度?需要知道要从UDP长度或消息中的其他值读取多少个字节。
查找具有已知值的区域,例如已知的IP地址或已知的字符串。
将消息分为发送的流量和接收的流量。有时,一种格式用于发送数据,另一种格式用于确认数据。
所有消息中是否都有仅包含两个或三个值的字节?根据该字节处的值将数据集分成几组。
在工具方面,对于校验和,可以尝试以下操作:https://github.com/laurenlabell/checksum_finder
背景:https://dl.acm.org/doi/10.1145/3411506.3417599
评论
尽管此链接可以回答问题,但最好在此处包括答案的基本部分并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。 -来自评论
– sudhackar
11月29日13:02
我的观点不足以发表评论。 OP要求使用特定的现代工具,因此在此情况下合适的链接。我希望我添加的一些技术对在此领域工作的人有所帮助。
– Pythonpython
11月29日20:05
评论
我的作品中有一些工具可以满足您的大部分需求。如果您想分享一些转储的消息(十六进制,每行1 msg),我可以帮您。