如何进行协议逆向

来源:互联网 发布:视频后期 软件 编辑:程序博客网 时间:2024/05/16 14:23

抓包看到一系列的数据包,如何从中恢复出设计时为每个域的定义?

如果我们设计足够多,我们可以通过经验来预测。比如无论何种协议都需要有长度的域,这个域可能是代表有多少个字节,也可能是代表有多少字,总之一般会有这样一个域。

一般情况下,大部分协议设计都是按域设计的,极少出现HTTP/2那种二进制压缩格式的,这是人脑的逻辑属性决定的。而域的显著特点是大部分域都有取值范围,并且每个域的结束标记一般是一样的。

所以我们的思路也就比较明朗,首先找到标记长度的域,根据这个域确定每个域的结束标记。很多是固定长度的没有标记,在长度域上也能发现这个属性。确切的说,如果是以固定结束符结束的协议定义,那么长度域的结束符也一般一样。如果是没有结束符,通过结构体定义的协议结构,那么长度域后面也不会有固定的结束符。大部分情况属于后者,这也是人类大脑的编程属性喜欢用顺序的结构体决定的。但是像HTTP就是使用的固定结束符,所以也不是固定的。使用固定结束符的,一般可以称作session范式,使用固定位置域的,一般可以称作域范式。还有一些介于两者之间的,例如offsetpointerarrayset等组织方式,在私有的协议中一般比较少见到。Discoverer: AutomaticProtocolReverseEngineering fromNetworkTraces也是类似这种思路。

在找到结束符的形态后,就能确定每个域的划分。再根据每个域的取值范围来结合语意来推测每个域的语意意义。没有语意,各个域就是冰冷的值域而已。

Network Protocol Analysis using Bioinformatics Algorithms 里面使用sequence alignment方法在两个相似的序列中填充gap以达到对齐的效果,从而区分出不同的域。

还有一种比较容易的方法是通过客户端。制定的协议都是用来通信的,通信则必须使用客户端。如果我们能够获得客户端,我们就能通过逆向客户端的协议解析流程来获得协议的定义。这种方法直接绕开了数据包解析的相关技巧,只需要逆向技巧。但是如果客户端被加固过就不太容易采用。

例如要破解一个IM通信的协议。首先打开一个对话窗口,开始wireshark抓包(最好是设置一下只过滤抓取要抓取的进程),在对话窗口中输入一个超长的通话内容,不断的变动,就很容易从wireshark中根据数据包的长度将这条通信链接抓出来。

大部分的协议包都会有头部和数据两部分,变动通信的长度,就可以找到数据部分和头部部分的区别,运气好的话还能顺便发现长度域(一般在开头)。之后的做法就像上文所说一样的找分割,分析语意了。不要试图去破解qqyy,微信,支付宝等运行很久的大公司的协议,这点知识破解他们的还是不够的。但是大部分的中小企业都几乎可以手到擒来。


0 0