我有一个DVR,它使用自己的专有TCP协议通过以太网发送视频。我想编写一个VLC模块来查看视频,而不是提供的DxClient.exe。我已经捕获了Wireshark中的流量,并尝试使用IDA Pro对客户端进行反向工程,从我可以告诉客户端进行某种握手身份验证的角度来看,DVR然后发送2个网络数据包(总长1514个字节),客户端发送一个TCP ACK和另外2个数据包将永远传输,等等。据我所知,客户端使用Microsoft的AVIFIL32库将数据包解压缩为本质上成为AVI文件帧的文件。

问题是我不了解这些帧是如何编码的,或者甚至是AVI框架。谁能帮我,这是来自2个数据包的数据有效载荷:

http://pastebin.com/2VDu2Tc2

http://pastebin.com/L3Zi3VqU

评论

您能否提供包含握手在内的小型pcap捕获文件?

dropbox.com/s/dbtj3jy7d4s4z6p/cctv%201.pcapng dropbox.com/s/1zf1ssoyo7ur4sk/DxClient2.7.1-ENG.exe和DxClient可执行文件。在我看来,使用TCP而不是UDP进行流媒体协议的设计似乎很糟糕,这是一个糟糕的决定。我认为Wireshark只是将其作为HTTP流量,因为我正在使用端口8080

#1 楼

您可以尝试使用Netzob工具。这是专用于逆向工程协议的工具。


您可以在这里下载:http://www.netzob.org/

一个很好的例子/ ZeroAccess C&C协议:http://www.netzob.org/documentations/presentations/netzob_29C3_2012.pdf


您也可以看看CANAPE:http://www.contextis .com / research / tools / canape /

#2 楼

尽管可以告诉您一个使逆向工程协议更容易的工具,但我无法提供具体的解决方案。

Scapy是python数据包处理工具。您遇到的问题之一是,wireshark不知道这些数据包。使用Scapy,可以很容易地构建和解析奇怪/自己的数据包。当您开始使用IDA进行逆向工程如何构建数据包时,这无疑会有所帮助。

这是UDP层定义的示例:

class UDP(Packet):
    name = "UDP"
    fields_desc = [ ShortEnumField("sport", 53, UDP_SERVICES),
                    ShortEnumField("dport", 53, UDP_SERVICES),
                    ShortField("len", None),
                    XShortField("chksum", None), ]


您现在可以创建自己的层并尝试理解数据包通过使用IDA对数据包构建过程进行反向工程来获取数据,并使用scapy重建协议。

#3 楼

从我最近收集的数据来看,DxClient被设计为DVR Netview技术的客户端。仅通过查看DxClient的功能,很明显,它不仅仅是AVI格式流的二进制传输。我认为可以肯定地说,使用的是专有的传输和控制协议。您提供的2幅相框不足以为您提供帮助。我认为您应该尝试着重于反转客户。花费足够的时间,您应该能够深入了解如何构造每个框架。

我建议您熟悉网络协议反向工程的一般原理。文章博客“协议逆向工程概述”是一个很好的起点。

评论


我对此没有任何经验,仅是因为可执行文件导入了诸如AVIFileInit,AVIFileOpenA,AVIMakeCompressedStream之类的函数,我相信它使用的是AVI文件。尽管您说了什么,但该协议可能会更高级,因为它允许诸如Pan Tilt Zoom和更改摄像机视图之类的操作。

–杰米
13年7月15日在16:29

究竟。该协议很可能将包括多个流以及各种控件。据我所知,客户端的功能非常广泛。最好的办法是在send()和recv()上设置断点,并查看其对消息数据的作用:如何将其组合在一起并分解。这样,您将能够识别自定义框架的关键组件。

– PSS
13年7月15日在16:34