[转]Eterm通讯协议分析

这是转载的CSDN上一篇别人写的通信协议分析,转来转去,都不知道原作者是谁了,如果原作者看到此文,麻烦告知一声吧,谢过。

=============不是很华丽的分隔线=============

最近因业务需要对eterm的通讯协议进行了初步分析,记录下来以备后用。

eterm版本:3.630SCHbuild091027)

登录截取的封包为:01 A2 65 66 61 8E 68 65 51 6C 69 61 6E 67 00 00 00 00 65 65 65 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 30 30 63 32 39 39 62 62 66 33 39 31 39 32 2E 31 36 38 2E 31 2E 32 30 38 20 20 33 36 33 30 34 31 30 00 30 30 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

总长固定为162,不足部分以“00”补足。

1-2 字节为帧头,固定格式:01 A2

3-14 字节为用户名:65 66 61 8E 68 65 51 6C 69 61 6E 67

(注:用户名长度不固定,开头为第3字节,结尾不固定位置,并影响以后的位置)

15-18 字节为用户名与密码的分隔符:00 00 00 00

19-22 字节为密码:65 65 65 65

(注:密码也同用户名一样长度不固定,结尾不固定位置,并影响以后的位置)

23-51 字节为分隔符:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

52-63 字节为校验码:30 30 30 63 32 39 39 62 62 66 33 39

64-85 字节为本机IP:30 30 30 63 32 39 39 62 62 66 33 39 31 39 32 2E 31 36 38 2E 31 2E 32 30 38 20 20 33 36 33 30 34 31 30

86 字节为“00”

87-92字节为:30 30 30 30 30 30

后面的字节全部为“00”,直到162字节

经常有人问我关于网络协议分析的问题,在这方面我做的不多,04年时一个朋友请我帮他写一个eterm客户端开发接口,要求分析eterm通讯协议,写一个通讯动态库供他的软件调用,在此以前我从没有分析过别人的软件通讯协议,对我来说有一定的难度,我先找了一些网络数据截获分析软件,比较多,最后定为Ethereal,比较好用。关于Ethereal的使用比较简单大家自行熟悉,通讯协议分析关键要熟悉。

1.软件本身的业务(这点很重要)

2.数据在计算机中的存储形式及网络通讯的组织形式。软件本身业务决定着通讯的内容,而我们分析协议就是根据通讯内容找出规律,因此要能够分析清楚协议的组织形式必须熟悉软件通讯内容,当然,软件的业务和通讯内容不一定完全耦合,这是由多方面原因决定的,比如软件的业务你只是从表面去了解的,是一个大概的了解,而通讯内容是软件需要从网络进行传递的数据,是非常完整的,不仅包含了表面业务数据,而其可能包含了业务逻辑数据,甚至包含作者为以前版本兼容或以后版本兼容而设计的协议数据,因此要完全彻底分析清楚协议是一件很困难的事情。对于数据在计算机中的存储大家都比较清楚是按字节存储的,也就是计算机的最小存储单位是字节,对于不同的数据类型所占据存储空间大小不一样,比如char类型是按一个字节存储,word或short int类型是按2个字节存储,int类型是按4个字节存储,无论采用什么数据类型,在计算机中都是按字节存储,在这里我们也无法知道开发者所采用的数据类型,而我们只能根据数据的表现形式来猜测和分析它所占据的字节大小。
3.通讯协议,数据在网络上传输必须明确定义传输协议,协议的定义根据软件的需求来定,一般包括协议头,数据体,协议尾,例如我定义的

协议:
帧头  0x86 1 0
数据域长度 L 2 1
控制码  C 1 3
数据域  Data L 4
校验码  CS 1 L+4
结束符  0x16 1 L+5
,实际中每个人定义的协议可能都有所不同,比如许多没用校验码或结束符,有的甚至没有定义协议,就用文本发送,先发送控制码字符串,然后在发送内容,连数据长度等可能都忽略了,这样虽然也可以处理但是不是很好,因此分析时要对每个包进行对比,找出共性,分析其含义。
4.采用何种SOCKET协议,SOCKET 分为 TCP和UDP两种协议,两种不同的协议包的组织方法有很大的差别,TCP是面向连接的、流式的、可靠的,UDP是面向非连接的、报文式的、非可靠的,流式协议数据粘为一体,为了克服这个问题,一般会给自己的数据加包头,注明长度,当然也可以通过时间间隔等方法来正确处理,UDP虽然数据没用粘为一体,但是包的顺序有可能错乱,数据也可能丢失,因此为了克服这些问题,自己在协议中会额外加一些信息,比如包的顺序号,包的校验码等。TCP分为长连接和短连接,长连接是指连接建立后不主动断开连接,采用心跳包来维持链路,因此,长连接TCP中经常定期或空闲时定时发送心跳包,这类数据本身没有多大实际意义,主要是维持链路不断开,短连接是指连接建立成功后,发送数据,接收回复,然后关闭连接,这种连接对协议要求比较简单。