串口嗅探技术研究
2016-08-22李瑞民
张 胜,李瑞民
(上海文化广播影视集团技术运营中心,上海 200041)
串口嗅探技术研究
张胜,李瑞民
(上海文化广播影视集团技术运营中心,上海 200041)
串口的广泛使用,得益于小到单片机,大到多核CPU的直接支持,所以在设备中,特别是广电行业设备中,不仅不会消失,而且还会长期存在。然而串口通信具有独占性,一旦一个监控程序占用了某个串口,则另外的程序无法使用该串口,这对于二次开发、第三方监控、设备共享、硬件设备的调试和测试都十分不利。所以,对串口嗅探技术的研究是有必要的,目前国内尚无人对此做出过研究,通过三个层次,共提出五种串口嗅探技术,每一种串口嗅探技术都有自己独特的地方,但也都有不足之处,但无论是功能上,还是性能上都可以满足串口嗅探的功能。最后,通过程序的设计和测试,验证了方法的可能性。
串口嗅探;设备监控;独占性;中继;串口通信
现在的互联网通信中,基于TCP/IP为基础的网络通信方式如日中天,占据了几乎所有的通信数据量。但是在设备的监控领域中,特别是广电行业的网络监控中,仍然还是有大量的设备使用串口作为其主要甚至唯一的通信方式。以国内某主要的广电行业卫星地球站为例,站中有600多台新老设备,其中的近80%左右的设备采用串口进行通信。造成这一现象的原因有多种,一是早期的遗留设备,串口是其主要通信方式;二是大部分硬件设计研发阶段中,本身就使用了串口作为上传和下载程序的主要手段,而这种得天独厚的方式也完全没有必要在随后的产品中取消掉;三是网口通信并没有听上去那么美,以SNMP协议为例,所有使用该协议的企业都需要申请和购买企业OID的根结点,这会让一些成本低,设计简单的设备望而却步。因此,无论是理论上,还是实际不断出现的广电设备中,不难看出,采用串口进行通信仍有大量市场,未来仍然还是会有大量的设备使用串口作为主要通信方式。
然而,在设备监控的项目开发中,也会遇到一些困难。比如串口通信具有独占性,某一个监控系统使用了一个串口,其他监控系统则无法再使用该串口[1];反过来,一个设备通常只有一个串口,所以这同时也意味着该设备将只能被一个监控系统提供通信。在遇到特殊情况时,上述冲突显得尤为突出,如某设备在购买时,设备所提供的操控台或管理程序使用了唯一的这个串口;再如笔者想以第三方的形式,读取并备份已占串口所有通信的内容;在监控系统的开发和调试中,如果已有成熟系统处于运行中,如果能以监听方式获得该系统通过该串口与设备之间的通信,那么对于开发新产品,具有事半功倍的效果。
因此,不难发现,如果能有一个技术可以在具有独占性的串口通信中,能以主动或被动的方式读取到串口中正在通信的数据,那么就可以从另一个侧面对串口进行监控。这种技术在TCP/IP网络中,通常称为“嗅探”(Sniffer),所以本处也借用这一词汇,称之为“串口嗅探”(COM Sniffer)。
1 原理分析
如前所述,通信属于“点对点”的通信,所以串口具有独占性特点,一旦某一个应用占用了某一个串口,则其他应用不能再使用该串口。从网络层次上来看,串口只有物理层(Physical Layer)、数据链路层(DataLink Layer)、应用层(Application Layer)3层;从操作系统的角度来看,要与串口通信,需要有串口物理接口、串口驱动程序、串口应用程序3层。所以对串口的嗅探,也分别可以从这3个层次上进行分析和设计。
1.1物理层嗅探
在物理层,只要将对应的引脚连线,通过简单地并联,就可以将一路信号复制为两路信号。以串口通信中,根据通信的标准,还可以再划分为RS-232、RS-422和RS-485通信三种主要通信标准,每一种的引脚不一样,所以连线都不一样。以RS-232为例,引脚2、引脚3、引脚5分别对应着接收(RxD)、发送(TxD)、地线(GND)[2-4]。那么只要在焊接连线的时候,同时在这3个引脚上焊接2组线,并将每组线分别制作成一个串口,然后将这2个串口分别连接到2台监控主机的串口上即可。
这样做的优点是做法直观,实现起来也很简单;缺点也很明显,如这种焊接会影响到电气特性,所以需要设备的串口必须是高阻串口,即使如此,仍然会有较大概率增大出错率。另外,2个主监控主机如果同时向设备发送数据,会因数据“碰撞”(Collision)而导致失败。因此,2台主机不能同时发送数据。不过,这与“嗅探”不冲突,所以这可以作为一种有效的“嗅探”方法,但本文不再深入讨论。
1.2数据链路层嗅探
在数据链路层,重写一个串口通信的驱动程序大可不必。通常情况下,一般有三种方式,每一种方法都有一定的优势和局限性。
一种就是对于一些串口开发的程序,本身就喜欢使用第三方提供的函数库文件,例如PComm库,就是一组广泛被众多串口软件开发者使用的一种库文件。监控软件调用该库,该库再调用驱动程序,最终完成串口通信,如果仿照该库的头结构(该结构都在库的头文件中),新做一个PComm库,新的PComm库在接收到某个串口命令以后,即将其保存到第三方文件(如数据库中),然后原封不动地调用原PComm库(原库可改成另外一个名字),即可以“偷梁换柱”的方式,在所有原监控软件不修改的前提下完成“嗅探”。这种方式的优点是简单,缺点是并不是所有的系统都采用PComm库,所以存在使用上的局限性。
基于驱动程序通过“钩子”(Hook)技术进行嗅探[4],即通过特定的函数,将系统中某一API的地址修改为自己所编写的函数地址处,这样系统任何程序在调用该API的时候,实际调用的不再是原有的API函数,而是自己所编写的函数内容。当然为了在自己处理结束后,还能继续调用原有的API,可以在修改原有API地址之前,先保存原有地址,在自身被调用以后,将要处理的事情做完,然后再调用一下保存的原有API地址,使原有的API功能仍能被执行到。采用钩子技术,在串口的监听上,需要同时监听CreateFile,ReadFile,WriteFile,CloseHandle共4个函数,操作系统中这4个函数的使用频率非常大,但根据CreateFile函数中“文件名”参数,以及其他函数的句柄可以判断是否为对串口的调用,对于不是串口的调用,只要不处理而直接转向原有API地址即可,对于串口的调用,则需要先做一些处理(如写到日志中)后,再转达向原有API地址。根据CreateFile函数可以知道哪个程序在使用哪个串口,根据ReadFile函数可以知道有谁在通过串口向主机发送数据,根据WriteFile函数可以知道主机向外界所发送的数据,根据CloseHandle函数可以知道有哪些串口不再使用。
第三种方式,即采用第三方的开发库或驱动工具实现“嗅探”。这种方式,如“虚拟串口仿真”VSPE(Virtual Serial Ports Emulator)工具。VSPE是Eterlogic公司出品的一套虚拟串口仿真驱动程序,其作用很强大,即使在一台没有物理串口的计算机中,可以创建虚拟串口。并且该虚拟串口可以只接收发来的数据,也可以将其转发出去,借助于这机制,可以实现串口数据的嗅探,详细设计参见后面内容。
1.3应用层嗅探
如前所述,串口在应用层处于“独占”方式,因此直接使用是不可行的。串口通信和通过“中继”实现串口嗅探模型如图1所示。
图1 串口通信(上)和通过“中继”实现串口嗅探(下)模型
在图1中,上半部分是“监控程序主机”和“被监控的设备”之间,通过串口连接线进行正常的数据通信,二者之间的数据流不管是虚线和实线,只是表示数据流转的方向。如果将上半部分的连接图换成下半部分的连接图,然后在这两段中的中间“枢纽”区放一个无条件转发双方通信数据的串口程序作为“中继器”(Repeater),即该程序无论收到哪一串口上的数据,都将无条件将其转发到另一串口上。那么,由于串口通信是“端到端”的通信,因而“被监控设备”并不知道,也不需要知道这些数据是来自于“串口嗅探主机”,还是“监控程序主机”。当然,回到“串口嗅探”的目的上来,这样看似“画蛇添足”的设计,其目的不是为了让设计变得更复杂,而是让转发程序在转发的同时,将转发的数据作为嗅探到的数据,或侦听,或保存,或为其他程序所用。
2 程序设计和测试
上述各方法各有利弊,在实际的使用中,可以根据具体的需要酌情使用。上述各方法中,“物理层嗅探”性能不稳定,因此只能用于简单的临时测试环境中;“网络层嗅探”虽然实现起来并不难,但需要一个额外的双串口主机,因而造成了较大的资源浪费,因此也并不可取。对于“数据链路层嗅探”,也如前所述,重写一个带过滤功能的新PComm库和“钩子”都具有一定的难度,不适合于普通的开发人员。相比之下,“虚拟串口仿真”VSPE是权衡利弊之后的一个不错选择,所以下面以该方式设计程序并进行测试。
在VSPE系统中,有一个称为“连接器”(Connector)的概念,使用该连接器,系统会在其中创建一个“虚拟”的串口。之所以叫“连接器”,是这个串口允许两个程序分别打开,并且其中一个程序发出的任何内容,“连接器”会无条件转发给另一个程序。这正是笔者想要的功能,只可惜该“连接器”只负责转发,而不会将其中所传的数据保存或转发出现,为了实现这两个功能,可以通过上面“应用层嗅探”中的方法,采用“曲线”的方式实现串口的嗅探。如图2所示就是这一设计思路的模型。
图2 基于VSPE“连接器”的串口嗅探原理图
在图2中,原本“监控程序”程序直接通过“物理串口A”与“被监控设备”进行通信,现在通过VSPE技术创建了一个“连接器”(即图中“VSPE虚拟串口B”,以下简称“虚拟串口B”),然后“监控程序”不再直接打开“物理串口A”,而是打开这个“虚拟串口B”,根据前面对“连接器”的描述,这时,如果“串口嗅探程序”也同时开了这个“虚拟串口B”,那么“监控程序”发出的所有内容,都会被这个“虚拟串口B”无条件转给“串口嗅探程序”,反之亦然。这时,如果结合前面的“应用层嗅探”中的方法,将“串口嗅探程序”做成图1中“串口嗅探主机”的角色,那么该程序又可以在完成嗅探任务的同时,将所有收到的信息,经由“物理串口A”转发到“被监控的设备”中。反过来,“被监控的设备”中的信息,也会反向经由“物理串口A”转发“串口嗅探程序”中。
在图2中,“虚拟串口B”和“串口嗅控程序”所完成的工作都是转发,但前者是由VSPE完成的,不具备日志和过滤功能,后一个则具备“嗅探”的功能;这里的“串口嗅控程序”和图1中“应用层嗅探”中的“串口嗅探主机”,无论是从运行原理中,还是所实现的功能上,二者都是一样的,但与后者相比,这种方式少了一台具有两个串口的主机,取而代之的是在运行前,安装一个VSPE的驱动来同时对接图2中的“监控程序”和“串口嗅探程序”。
为了验证上述理论,笔者特编写了一个程序进行验证,该程序开源[5],运行在Windows XP及以上版本的操作系统上。所安装的VSPE可以从“www.eterlogic.com”下载试用版。
程序主界面如图3所示,主界面根据分组框被分为3个部分,其中“日志”分组框即为双方通信的嗅探内容。其内容为一个列表,其中“方向”字段有两种,一种是“发出”,即由本机发出到串口远端的命令,另一种是“接入”,即串口远端发送到本机的命令;“时间”字段即为具体的时间;“命令”字段即为通信过程中传输的详细内容。下面的“串口信息”分组框中,“虚拟串口值”即为“虚拟串口”的值,而“物理串口值”即为图2中的“物理串口”的值。实例中,“虚拟串口”值为1,本地的“物理串口”值为8。
图3 基于“连接器”的串口监听程序主界面(截图)
经过测试,程序可以良好地嗅探到“监控程序”和“被监控设备”之间的所有通信数据,不过,由于程序在实现“中继”功能时存在“转发”时功能,所以所转发的数据会有一定的延迟,但对于设备监控本身的需要,这种延迟可以忽略,并不影响整体的性能。
3 小结
当今串口仍然在数据通信领域占有一定的地位,究其原因,就是“简单”。不需要协议连接、通信协议与链路的分离,以及小于几元钱的单片机,大到几千元的ARM板,都先天支持串口的通信,因而至今串口通信仍然活跃在大多数中低端的设备中。即使是目前的研究热点“物联网”设备,在设备CPU不能良好地支持TCP/IP的网口通信时,退而改用串口通信方式,也不失为一种较好的解决办法。鉴于此,对基于串口的监控程序测试、开发也不会停止,上述问题就会存在,因而无论是想通过监听技术获得二者之间的通信数据,进而进行协议分析;还是想在安全级别较高的场合中,对于通信中的数据,常常需要第三方软件客观地记录,都需要通过“串口嗅探”技术完成。而本文正是基于这一需求,提出了几种“串口嗅探”技术,借以抛砖引玉,引发更多的研究。
[1]宋文好,徐志江. Modbus RTU串口通信在工业自动化系统中的应用[J].有线电视技术,2012(3):61-63.
[2]叶勇,沈三民,郭铮.基于PCI总线的高速串口通信卡的设计[J].电视技术,2013,37(3):82-85.
[3]潘方.RS232串口通信在PC机与单片机通信中的应用[J].现代电子技术,2012(13):69-71.
[4]刘兴淮,陈侃侃,梁敏.基于键盘钩子技术的HIS语音报价系统[J].北京生物医学工程,2014(1):81-83.
[5]李瑞民.独辟蹊径的编程思维——“拿来主义”编程[M].北京:电子工业出版社,2014.
责任编辑:闫雯雯
Sniffer technology of serial port communication
ZHANG Sheng, LI Ruimin
(ShanghaiMediaGroupCo.Ltd,Shanghai200041,China)
Serial port (COM) interface has been used in communication field between computer and device in widely common usage, supported from microcontrollers to multi-core CPU. So in the equipment communication interface, especially the broadcast and television industry equipment, transfer data by serial port is not only will not disappear, but also long-term existence. However, the communication from serial port is exclusive,once a monitoring program occupies a serial,another program cannot use this serial port at the same time, it is not advantage of using for some aspect,for example,the secondary development,the third party software monitoring the same serial port, serial port sharing of device, and debugging and testing a device from serial port. So it's necessary to research the technology of serial port sniffer, there is no such studies have been made in such aspect. In this paper, it put forward a total of five serial port sniffer technologies, each one has its own unique feature, at the same time it has some shortcomings. Finally, through the design and testing of a special software program, it proves both functionality and performance are feasible and effective.
serial port sniffer;device monitoring;interface exclusive;relay;COM communication
TN919.83
ADOI:10.16280/j.videoe.2016.07.009
上海市广播电视台项目(“播出智能监管与应急辅助系统”)
2016-01-21
文献引用格式:张胜,李瑞民. 串口嗅探技术研究[J].电视技术,2016,40(7):36-39.
ZHANG S, LI R M. Sniffer technology of serial port communication [J].Video engineering,2016,40(7):36-39.