计算机应用   2017, Vol. 37 Issue (4): 1153-1156  DOI: 10.11772/j.issn.1001-9081.2017.04.1153
0

引用本文 

姚小强, 刘昌云, 郭相科. 基于数据截获和欺骗式注入的通用记录重演方法[J]. 计算机应用, 2017, 37(4): 1153-1156.DOI: 10.11772/j.issn.1001-9081.2017.04.1153.
YAO Xiaoqiang, LIU Changyun, GUO Xiangke. General record-replay method based on data interception and cheating injection[J]. Journal of Computer Applications, 2017, 37(4): 1153-1156. DOI: 10.11772/j.issn.1001-9081.2017.04.1153.

通讯作者

刘昌云 (1973-), 男, 四川泸州人, 副教授, 博士, 主要研究方向:智能信息处理、雷达信号处理.E-mail:icemissile@sina.com

作者简介

姚小强 (1985-), 男, 河南宜阳人, 讲师, 硕士, 主要研究方向:智能信息处理、模拟训练与仿真;
郭相科 (1980-), 男, 河南泌阳人, 讲师, 博士研究生, 主要研究方向:目标跟踪、智能信息处理

文章历史

收稿日期:2016-09-13
修回日期:2016-12-27
基于数据截获和欺骗式注入的通用记录重演方法
姚小强, 刘昌云, 郭相科    
空军工程大学 防空反导学院, 西安 710051
摘要: 针对传统记录重演方法存在同报文格式相关、需要被控程序紧密配合及数据传输效率低等问题,提出了一种基于数据截获与欺骗方式实现的通用记录重演解决方案。首先,利用Winsock2服务提供者接口技术,实现了网络数据的自动截获;其次,采用内存映射文件技术解决了数据共享和高速存取问题;最后通过向用户程序发送伪消息激发其读数据动作,完成数据注入。实际应用表明,新方法避免了数据的网络传输,无需被重演程序配合且与系统报文无关,能够完成10倍速度的流畅重演,普适于分布式仿真与模拟训练系统。
关键词: 服务接口提供者接口    数据截获    欺骗注入    记录重演    内存映射文件    
General record-replay method based on data interception and cheating injection
YAO Xiaoqiang, LIU Changyun, GUO Xiangke     
Air and Missile Defense College, Air Force Engineering University, Xi'an Shaanxi 710051, China
Abstract: For the problems of the traditional method of data record-replay, such as packet format association, close corporation with the controlled application, and low transmission efficiency, a new record-replay method based on data interception and cheating injection was proposed. Firstly, the network data packet was automatically intercepted through the service provider interface technique of Winsock 2. Secondly, the problem of the data sharing and high speed data access was solved by using the memory-mapped file technique. Finally, the saved data packet was intercepted into the user program by the data read operation motivated by the fake messages. The practical application shows that the new method is suitable for the distributed simulation and simulated training system for its merits such as the avoidance of network packet transmission, no necessity for corporation with the controlled application, irrelevance of the packet format, smooth recurrence with ten times the speed.
Key words: Service Provider Interface (SPI)    data interception    cheating injection    record-replay    memory-mapped file    
0 引言

数据记录与重演技术在网络安全、软件自动化测试、模拟训练等领域具有广泛的需求[1-3]。在模拟训练领域, 记录重演常用于分布式训练系统, 一般通过专用软件和专用接口, 在被重演系统的配合下接收和回传网络数据。由于其采用了集中式的数据收集方法, 造成运行时通信数据量巨大, 特别是当系统加速重演时, 将不可避免地造成网络丢包 (使用UDP协议) 或处理效率下降 (使用TCP协议), 从而不得不采用区分关键和非关键报文的方法进行报文筛选, 以减小数据流量[1-2]。因此, 传统的数据记录与重演解决方案, 存在同报文格式相关、需要被控程序紧密配合及数据传输效率低等问题, 造成其通用性和可移植性差。

如今, 网络报文封包拦截方法得到了广泛研究与应用, 可实现非合作应用的报文自动截获, 甚至可实现过滤、修改等操作[3-7]。网络封包拦截实现方式分为用户级和内核级两类, 其中内核级主要是通过传输驱动程序接口 (Transfer Driver Interface, TDI) 和网络驱动接口规范 (Network Driver Interface Specification, NDIS) 中间层过滤驱动程序等实现[4-5], 而用户级主要通过复用端口、Winpcap或者WinSock2服务提供者接口 (Service Provider Interface, SPI) 等实现。其中内核级的方法同硬件密切相关, 使得其使用范围受限, 而IP复用方法、SPI方法、Winpcap方法仅能完成数据截获而无法实现数据干预 (过滤或注入)[6-7]

本文在SPI技术的基础上, 提出了“欺骗式”的网络数据注入方法, 通过给被控程序发送“伪消息”, 迫使被控程序产生读数据请求, 从而实现了数据的注入, 采用内存映射文件技术解决了数据共享和大数量的高速存取问题。与传统方法不同, 本文方法采用了分布式记录重演解决方案, 进一步提高了数据记录和重演的效率, 并对方案进行了实现, 验证了本文方法的有效性。

1 分布式记录重演解决方案

本文设计的分布式数据记录重演系统体系结构如图 1所示。

图 1 分布式数据记录重演系统的体系结构 Figure 1 Distributed record-replay system architecture

系统由一个控制端和若干个客户端组成, 控制端程序用于协调多个客户端的统一工作, 客户端程序同用户程序直接交互, 可在无需用户程序配合的情况下, 通过截获的方法获取网络数据, 通过欺骗式注入的方法驱动用户程序的重演。客户端和控制端之间通过TCP/IP协议交互数据。

相对于传统解决方法, 本文系统具有以下明显优势:

1) 以分布式处理代替集中式处理, 减少单个客户端处理数据量, 提高了数据的处理效率;

2) 将网络数据驱动改为本地化数据驱动, 避免了数据的网络传输, 进而避免丢包;

3) 通过截获和欺骗的方式实现重演, 无需被重演程序配合, 减小了同用户程序之间的耦合度, 增强本系统的可移植性。

客户端的实现是本系统的关键, 本文基于SPI技术设计客户端程序, 完成对用户程序的网络状态监控和数据截获, 基于此技术实现记录和重演还需要解决以下关键技术:

1) 网络数据的受控注入。虽然SPI技术可实现网络数据的截获、过滤甚至篡改等操作[8], 但从本质上讲, SPI仅是网络数据传递链里的一层, 无法直接利用SPI技术, 控制数据输入用户程序的时机, 只有当用户程序发起读取请求后, 才可使用SPI对其接收数据内容进行干预。因此, 无法实现数据的受控注入, 也就无法实现重演。

2) 进程数据同步和大数据处理。SPI程序以动态链接库形式存在, 通过向操作系统注册、安装, 可以在用户程序打开网络端口时, 自动被系统WS2_32.dll调用。虽然SPI程序在磁盘上仅存在一份, 但却被操作系统加载至不同内存空间 (Win32内存管理)。因此, 在监控多个进程时, 实质上必须完成多个进程间的数据共享和同步。另外, 在仿真系统中, 经常需要记录动辄几GB甚至几十GB的文件, 实现数据的高速读写是必须解决的问题。

2 欺骗式数据注入 2.1 欺骗注入的原理

正常情况下,数据到达网卡后, 由网卡产生中断, 通知操作系统, 由操作系统通知相应的用户程序数据到达, 用户程序经SPI动态链接库 (Dynamic Link library, DLL) 获取网络数据。而在分布式记录重演解决方案中, 重演的数据来源为本地记录文件且数据不经过网络传输, 因而用户程序无法获得数据到达的通知, 也就无法产生读数据动作。为刺激用户程序响应数据, 采用了欺骗式注入数据的方法, 其原理如图 2所示。

图 2 欺骗式数据注入原理 Figure 2 Data cheating-injection principle

欺骗式数据注入即是使用SPI控制程序代替操作系统, 向用户程序发送“伪消息”(数据到达通知), 刺激用户程序进行读数据调用, SPI DLL则截获该调用, 并经由SPI控制程序获取记录文件数据, 输入至用户程序, 从而实现不经过网卡的欺骗式的数据注入。该方法可大大提高数据输入效率, 对于用户程序而言, 其从接收数据到达通知到读消息的过程同正常接收网络数据完全一致。

2.2 用户程序的“伪消息”欺骗

成功欺骗用户程序必须满足两个条件:

1) 依据不同的网络I/O模型, 构造不同的“伪消息”;

2) 满足用户应用的校验。

条件1) 的解决方案:Winsock IO模型可分为Select、AsyncSelect及EventSelect三种, 由用户程序在端口 (Socket) 开启时进行指定, 可由SPI DLL截获该操作以进行判定;此外SPI DLL还需对其中的关键参数进行记录, 以正确构造相应“伪消息”。在AsyncSelect模型中, 记录的参数包括:接收消息的窗口句柄、消息号和Socket编号等, 此模型所使用的“伪消息”即为Windows系统消息, SPI控制程序获取构成这些消息的关键字段后, 可通过PostMessage或SendMessage函数通知用户程序有数据到达, 从而激发其数据读取操作。

条件2) 的解决方案:数据校验是用户程序在获得正确消息刺激后向SPI DLL发送读数据请求前所采取的动作, 是系统验证消息的操作, 如果不能通过该验证, 用户程序就将中断数据读取。由于发送“伪消息”时, 对应的网络端口很可能并不存在数据, 这将导致校验失败。因此, 满足此验证是数据注入的前提条件。可用SPI DLL对该验证操作进行截获, 并强制返回用户程序期待的结果。AsyncSelec模型中的数据校验是通过调用API函数select实现, 如下:

nReady=select (0, & fds, NULL, NULL, & timeout);

该函数中可对准备好的端口数nReady和数据超时信息timeout进行校验, 当实际存在网络数据时nReady应大于或等于1, timeout应小于一定的预设值。采用“伪消息”欺骗时, 若不对该过程进行干预, nReady通常情况将返回0, 这将导致校验失败, 用户程序就会将“伪消息”作为一个错误信息丢弃, 并不启用实际的数据读取过程。由SPI的原理可知, select函数将触发SPI函数WSPSelect, 因此可通过WSPSelect函数截获该验证, 并返回用户程序的期待值。本例中, 设置nReady为1, timeout为0即可。满足该校验后, 用户程序即进入数据获取流程。可通过SPI DLL中截获WSPRecv或者WSPRecvFrom两个函数, 完成欺骗式的数据注入。

2.3 欺骗式数据注入的控制

在实现用户程序“伪消息”欺骗的基础上, 为了使数据能以严格的逻辑输入用户程序, 需要进行如下操作:

1) 建立闭环的注入控制网络。

建立闭环的注入控制网络, 即使SPI控制程序能够获得当前报文被成功输入用户程序的标志, 从而使得用户程序能够准确可靠地输入后续报文。该标志可以通过SPI DLL截获用户程序对Receive或ReceiveFrom两个函数调用实现。待函数执行成功后, SPI DLL将读取成功标志反馈给SPI控制程序, SPI控制程序收到该标志后, 再输入下一条报文;否则报文输入速度可能超出用户程序的实际处理能力, 导致用户程序直接丢弃该报文或卡顿, 造成输入逻辑的混乱。建立闭环注入控制网络同时还可以保证必要情况下以尽可能高的速率将数据输入用户程序, 从而实现“极速”重演。

2) 操作系统网络数据到达通知的阻断。

重演状态下, 正常网络数据依然能够不受影响地到达网卡, 从而刺激操作系统向用户程序发送正常数据到达通知, 这将扰乱欺骗式注入的过程, 因此, 需设法阻断用户程序接收该通知消息。在重演开始时, 由SPI控制程序向用户程序发送“伪消息”, 刺激其对SPI DLL进行调用, SPI DLL截获该调用, 并在对应端口的消息订阅中取消FD_READ消息, 这样正常网络数据到达时, 操作系统将不再通知用户程序。取消该通知后, 用户程序仅能接收到“伪消息”, 从而实现报文和伪消息的一一对应, 正常的网络数据被SPI DLL丢弃。当切换至记录状态时, 采用同样的方法, 重新对FD_READ进行订阅, 用户程序即可正常接收网络数据。

3 进程数据同步和大数据处理 3.1 进程数据同步实现

由于SPI DLL可能被多个用户进程加载, 因此客户端实际运行于n+1个进程空间 (n为用户进程数量, 1为SPI控制程序所在进程)。及时高效的进程数据共享和大数据量条件下的快速访问是必须解决的问题, 而使用内存映射文件是解决以上两个问题的最有效方法[9-12]

本文设计了基于内存映射文件技术实现的数据交互系统如图 3所示。

图 3 进程数据交互架构 Figure 3 Process data interaction structure

系统围绕SPI DLL核心模块, 设置了3个内存映射文件。分别是主存储内存映射文件、数据信息内存映射文件和交互信息内存映射文件。

主内存映射文件同磁盘文件关联, 用来完成大文件的读写控制;数据信息内存映射文件为顺序存储结构以文件头、节点、数据的格式存储进程收到的报文, 不关心具体的报文格式, 为多个用户程序共享;交互信息内存映射文件是SPI DLL和记录重演主进程间交换信息的通道, 存储除数据信息以外的其他所有交互信息,主要包括用户程序的进行信息、报文读取状态信息和向SPI DLL发送的指令信息三类。

记录状态下SPI DLL截获网络数据, 写入数据信息内存映射文件, 并实时更新写入状态至交互信息内存映射文件, 由记录重演主进程读取该状态标志, 并完成由数据信息内存映射文件向主存储内存映射文件的数据搬移, 最终将数据输出磁盘文件。

重演状态下, 记录重演主进程首先指示SPI DLL阻断用户程序其他报文, 而后由主内存映射文件读入磁盘文件, 依据数据内节点信息区分进程, 在发送“伪消息”进行欺骗的同时将数据搬移至数据信息内存映射文件, 用户程序在数据读取完毕后, 将状态信息写入交互信息内存映射文件, 记录重演主进程读取该标志, 进入下个节点数据处理。所有数据处理完毕后解除阻断。

3.2 大数据处理方法

内存映射文件实现大数据处理, 实质上是使用Win32的内存管理机制, 由操作系统按照“页管理”的模式进行内存和磁盘数据的布局和更新, 从而尽可能地提高数据存取效率。本文中大数据处理由主内存映射文件完成, 主要执行以下操作:

1) 用CreateFileMapping () 函数创建或打开一个文件内核对象, 该对象用于标志用作内存映射文件的磁盘文件, 该函数返回一个文件映射句柄供后面的操作用;

2) 用OpenFileMapping () 打开一个内存映射文件对象;

3) 用MapViewOfFile () 或者MapV iewOfFileEx () 将文件映射对象的全部或一部分映射到进程地址空间中。

记录重演主程序根据系统数据调度, 负责映射段管理, 文件映射后即可通过指针方式访问具体数据。内存映射文件使用完毕后, 通过以下操作断开映射:

1) 用UnmapViewOfFile () 在进程的地址空间中撤销文件映射内核对象的映射;

2) FlushViewOfFile (), 关闭文件映射内核对象;

3) CloseHandle (), 关闭文件内核对象。

3.3 读取效率仿真分析

通过截获某模拟训练中的仿真数据, 对传统I/O方法和基于内存映射文件方法的数据读取效率进行了对比。由于该仿真系统的数据量大小和空中模拟目标数量成正比, 因此通过设置不同的空情复杂度, 对读取时间进行测试, 如图 4所示。由图 4可见, 相对于传统I/O方法, 采用内存映射文件处理方法的数据读取效率提高了5倍以上, 且由于其使用分段映射的方法, 使得执行效率和目标数量之间保持了较好的线性关系。

图 4 读取效率对比 Figure 4 Read efficiency comparison
4 通用分布式记录重演实例

基于本文方法, 使用Visual Studio 2005为开发工具, 分别设计了客户端和控制端程序, 软件界面如图 5~6所示。

图 5 控制端程序主界面 Figure 5 Main interface of controller
图 6 客户端程序主界面 Figure 6 Main interface of client

本系统中客户端程序安装于需要记录重演的多台计算机, 可实现多进程、多端口的监控。

控制端通过TCP/IP协议, 完成多个客户端的统一协调控制, 具备工作模式切换、重演速度控制和记录文件管理等多种功能。

利用该系统对某训练仿真装备中的记录重演模块进行了升级, 测试了本文方法的正确性, 实现了10倍速的快速重演, 大大提高了记录重演系统的工作效率。

5 结语

以实现通用性好、可移植性强的数据记录重演为目的, 本文提出并实现了基于数据截获和欺骗式注入的记录重演方法, 该方法有效解决了大数量条件下的数据同步和高速数据存取以及非合作应用的重演问题。以本文方法为核心构建的分布式记录重演解决方案, 现已成功应用于多型仿真和模拟训练系统, 取得了较好的效果。

参考文献
[1] 姚军. 重演技术在某系统中的实现[J]. 火炮发射与控制学报, 2014, 35 (2) : 88-91. ( YAO J. Realization of reply technology in the system[J]. Journal of Gun Launch & Control, 2014, 35 (2) : 88-91. )
[2] 杨咚, 钟艺, 吕卫平. 一种以太网数据记录微机及其应用技术[J]. 舰船电子工程, 2015, 24 (2) : 106-110. ( YANG D, ZHONG Y, LYU W P. A sort of Ethernet data recorded microcomputer and its applications technology[J]. Ship Electronic Engineering, 2015, 24 (2) : 106-110. )
[3] 刘诗俊, 罗艺. 基于WinCap的UDP协议数据重发方法[J]. 计算机与数字工程, 2009, 37 (8) : 196-204. ( LIU S J, LUO Y. A method of UDP data retransmition based on WinCap[J]. Computer & Digital Engineering, 2009, 37 (8) : 196-204. )
[4] 杜晔, 黎妹红, 李洁原. 基于NDIS中间层驱动的对等网络流量监管机制[J]. 北京交通大学学报, 2013, 37 (5) : 29-33. ( DU Y, LI M H, LI J Y. Supervision system for P2P traffic based on NDIS intermediate driver[J]. Journal of Beijing Jiaotong University, 2013, 37 (5) : 29-33. )
[5] 鄢明, 陆幼丽, 解海涛. 基于NDIS中间层驱动的隐蔽通信研究与实现[J]. 通信技术, 2014, 47 (6) : 679:685. ( YAN M, LU Y L, XIE H T. Research on implementation of the cover communication based on the NIDS middle layer driver[J]. Communication Technology, 2014, 47 (6) : 679:685. )
[6] 魏艳娜, 徐雅斌, 于慧敏. 基于Windows架构SPI技术的防火墙设计与实现[J]. 北华航天工业学院学报, 2015, 25 (3) : 18-20. ( WEI Y N, XU Y B, YU H M. Design and implementation of Windows personal firewall based on SPI[J]. Journal of North China Institute of Aerospace Engineering, 2015, 25 (3) : 18-20. )
[7] 甘利杰, 丁明勇, 杨永斌. 基于WinSock SPI技术的包过滤研究[J]. 计算机科学, 2007, 34 (8) : 112-113. ( GAN L J, DING M Y, YANG Y B. Research on packet-filter based on Winsock SPI technology[J]. Computer Science, 2007, 34 (8) : 112-113. )
[8] JONES A, OHLUND J. Windows网络编程技术[M]. 京京工作室, 译. 北京: 机械工业出版社, 2000: 363-371. ( JONES A, OHLUND J. Network Programming for Microsoft Windows[M]. Jingjing Studio, translated. Beijing: China Machine Press, 2000: 363-371. )
[9] 姜三义, 代真真, 李阳, 等. 基于内存映射文件的进化算法数据存储引擎[J]. 计算机工程与应用, 2015, 51 (1) : 49-53. ( JIANG S Y, DAI Z Z, LI Y, et al. Data storage engine based on memory-mapped file for evolutionary algorithms[J]. Computer Engineering and Applications, 2015, 51 (1) : 49-53. )
[10] 杨宁学, 李艳萍, 田怀文. 内存映射文件及其在广义舒适度仿真中的应用[J]. 电子测试, 2013 (13) : 112-115. ( YANG N X, LI Y P, TIAN H W. Memory-mapped files and its application on generalized comfort simulation on train[J]. Electronic Test, 2013 (13) : 112-115. )
[11] 彭国金. 基于内存映射的试飞iNET数据快视分析技术[J]. 现代电子技术, 2016, 39 (4) : 44-47. ( PENG G J. Memory mapping based quick view analysis technology of flight test iNET data[J]. Modern Electronics Technique, 2016, 39 (4) : 44-47. )
[12] 孙文庆, 刘秉权, 肖镜辉. 基于内存映射文件的数据共享技术研究与应用[J]. 微计算机应用, 2005, 26 (2) : 49-53. ( SUN W Q, LIU B Q, XIAO J H. Research on data sharing technology based on memory mapping file and its application[J]. Microcomputer Applications, 2005, 26 (2) : 49-53. )