APP下载

基于API Hook技术的虚拟串口的实现

2010-05-11刘洋吴熠铭黄可嘉林创鲁

自动化与信息工程 2010年3期
关键词:串口无线监控

刘洋 吴熠铭 黄可嘉 林创鲁

1 引言

串行通信接口(简称串口),按电气标准及协议可分为RS-232-C、RS-422与RS-485,无论那种标准,都只对接口的电气特性做出规定,其软件协议都是一致的。串口作为工业控制领域最常用的一种通讯接口,自1970年标准化至今已近40年时间[1]。然而随着无线技术的日益发展,无线传输技术应用越来越被各行各业所接受。无线监控作为一个特殊使用方式也逐渐被广大用户看好,其安装方便、灵活性强、性价比高等特性,使更多行业的监控系统乐于采用无线监控方式,用于建立被监控点和监控中心之间的连接。无线监控技术已经在现代化住宅小区、交通、运输、水利、航运、治安、消防等领域得到了广泛的应用。但现有的很多成熟应用系统依然使用RS232方式,有迫切的需要把它们从传统的有线方式迁移到无线监控领域,虚拟串口于是应运而生。

2 虚拟串口

串口通讯,不论RS-232-C、RS-422或是RS-485标准,其通讯协议都是一样的。对于 Windows系统而言,都叫做COM口。虚拟串口并不是物理上存在的串口,而是使用虚拟手段模拟出来的,具备物理串口全部的逻辑特征。使用户程序在操作上无法判断所使用的究竟是物理串口还是虚拟串口。

2.1 常规的虚拟串口

常规的虚拟串口(如图1所示)是通过虚拟驱动程序来实现的。它是在操作系统上利用虚拟I/O技术建立虚拟串口设备来模拟一个串口。它的特点是全局性和便捷性。但其缺点也相当明显,就是稳定性欠佳。

图1 普通虚拟串口结构

2.2 API Hook钩子技术

API Hook(钩子)技术是消息处理中的一个环节,用于监控消息在系统中的传递,并在这些消息到达最终的消息处理过程前,处理某些特定的消息。简单的说就是改变程序流程的技术。它有一个重要原则:被Hook的API的原有功能不能受到任何影响。如果API被Hook之后,其原有功能失效,这样操作不能称之为 Hook,而是替换取代。因为操作系统的正常功能受到影响,甚至可能会引发系统崩溃。

2.3 基于API Hook技术的虚拟串口

图2为本文所提出的创新型API Hook虚拟串口,它采用API Hook技术[2],避免使用系统内核驱动程序,很好的解决了常规虚拟串口的稳定性问题。因为API Hook虚拟串口是工作在用户态的,它通过 API Hook手段,改变系统API函数的功能,重定向串口数据,“欺骗”用户程序来实现的[3]。而且由于在Windows系统上,程序空间的独立性,使得基于API Hook虚拟串口只针对特定程序有效,这能大幅提高系统的安全性和可靠性。

图2 基于API Hook技术的虚拟串口结构

基于API Hook技术的虚拟串口和普通虚拟串口的技术优势比较如表1所示:

表1 技术优势比较表

2.4 基于API Hook的虚拟串口的实现

API Hook虚拟串口使用API Hook技术,在系统用户层注入一个接口模块。这个接口模块在系统中起到 Filter(过滤)的作用。对于普通的文件操作全部放行(即交由操作系统来处理),而针对虚拟串口的操作都全部拦截下来,由Pipe(管道,Windows下进程间通讯最常使用的技术手段)接口发送给用户预先定义好的I/O设备来处理。这里的I/O设备是广义上的I/O设备,即可以是网络,文件,USB,串口,虚拟I/O等。采用此方案的虚拟串口,实现了形式上的多样化,不再局限于常规的串口转以太网,还能实现串口转文件,串口转串口,串口数据广播等多项功能。

3 系统架构

基于API Hook的虚拟串口软件主要由3个独立的模块实现:加载器(Loader),虚拟串口接口,管道(Pipe)模块:

(1)、加载器:负责创建目标进程和加载虚拟串口接口。

(2)、虚拟串口接口:所有虚拟串口的操作都在这个模块实现,包括注册虚拟串口设备,创建 Pipe,初始化虚拟串口,读写虚拟串口,卸载关闭接口,共5部分。

(3)、Pipe模块:由虚拟串口接口所创建,单独负责与外部I/O设备通讯。

系统工作流程如图3所示。

3.1 加载虚拟串口接口

基于API Hook技术的虚拟串口是以DLL(动态链接库)的形式存在的,需要加载至目标用户程序的代码空间才能发挥作用,使用加载器 Loader就能达到这一目的。

Loader的结构比较简单:通过 CreateProcess带CREATE_SUSPENDED标志创建并挂起目标进程,让目标程序暂停运行后,通过 WriteProcessMemory写入启动代码,然后调用CreateRemoteThread以执行LoadLibrary命令来加载虚拟串口接口库,最后调用ResumeThread来继续执行用户程序,至此加载过程全部完成,加载器停止运行。

3.2 注册虚拟串口设备

在加载器调用完LoadLibrary命令后,虚拟串口接口即进入执行状态。首先它需要向注册表登记虚拟串口的相关信息,其中最重要的就是虚拟串口的设备名字,其形式为COMx(x是1~99的整数)。然后通过API Hook技术,修改系统API函数的入口,需要侦听并处理 CreateFile, Set(Get)CommMask,ReadFile,WriteFile,CloseHandle和PurgeComm这7个API函数。它们依次对应:打开,设置(查询),读取,写入,关闭和刷新缓存的操作。完成这一步骤后,虚拟串口就可正常进入读写流程了。

图3 系统工作流程图

3.3 创建 Pipe接口

Pipe是由操作系统提供的一种IPC(InterProcess Communication 进程间通信)接口。这里使用的是Named Pipe(命名管道)。它可以在同一台机器的不同进程间以及不同机器上的不同进程间进行双向通信(需使用UNC命名规范)。管道的最大好处在于:它可以象对普通文件一样进行操作,也就是说,它可以使用ReadFile和WriteFile函数进行与底层实现无关的读写操作,这与串口读写操作完全一致。故使用此方法能简化开发的工作量和提高程序的兼容性。

3.4 虚拟串口的读写流程

虚拟串口的读写处理流程如图4所示:第一步,按照用户程序所指定的参数设置虚拟串口设备。由于虚拟串口并非物理串口,所以它没有波特率、数据位、起始位、停止位和硬件流等设置,故不论GetCommMask和SetCommMask如何配置,其接口函数均返回正确即可。第二步,通过侦听函数来监视用户程序是否将要操作一个串口设备,如为非虚拟串口设备,则调用操作系统自身的系统 API函数来处理,如为虚拟串口设备则通过 Pipe来转发数据,而Pipe的另一端按照要求处理数据。最后系统重新进入第二步,继续侦听串口操作,直到用户程序请求关闭设备为止。

图4 虚拟串口读写处理流程图

4 结论

通过API Hook虚拟串口实现的用户层虚拟串口设备,不仅系统性能不受影响,还无需注册系统设备,没有驱动级串口的兼容问题,且能替换现有物理串口(虚拟转发),是迁移现有串口接入软件到网络接入方式的最优方案。

[1] Wikipedia. “Serial port”http://en.wikipedia.org/ wiki/Serial_port

[2] Holy Father. "Hooking Windows API - Technics of hooking API functions on Windows 1.1”

[3] Windows Developer Center (MSDN). “Hooks”http://msdn.microsoft.com/en-us/library/ms632589(VS.85).aspx

[4] Eltima Software Inc. “Virtual Serial Port Driver”(vspd)http://wiki.eltima.com/user-guides/vspd/intro.html

猜你喜欢

串口无线监控
The Great Barrier Reef shows coral comeback
《无线互联科技》征稿词(2021)
浅谈AB PLC串口跟RFID传感器的通讯应用
你被监控了吗?
Zabbix在ATS系统集中监控中的应用
无线追踪3
基于ARM的无线WiFi插排的设计
一种PP型无线供电系统的分析
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式