一种基于动态库api拦截的数据采集方法及系统的制作方法

文档序号:6539823阅读:209来源:国知局
一种基于动态库api拦截的数据采集方法及系统的制作方法
【专利摘要】本发明提供一种基于动态库API拦截的数据采集方法,包括:确定目标信息系统中将被替换的动态库及其位置;编写与被替换动态库同名的新的替换动态库,并将被替换动态库更改为其它名字;应用程序调用替换动态库的API,替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端;采集管理端接收数据后,对其进行解析和处理后,写入采集数据库。本发明还提供了一种数据采集系统,包括数据采集端、采集管理端及采集数据库。本发明能够实现能够通过拦截动态链接库的API来获取目标信息系统传输过程中的中间数据,从而获得系统运行的关键信息。
【专利说明】一种基于动态库API拦截的数据采集方法及系统
【技术领域】
[0001]本发明涉及数据采集【技术领域】,具体涉及一种基于动态库API拦截的数据采集方法及系统。
【背景技术】
[0002]数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。
[0003]而针对一个分布式信息系统,该系统为以“黑盒”系统,内部的运行机制未知,但若要通过获取系统运行过程中的关键信息,如各结点之间传递信息的概要信息,如信息源、信息目的地、信息内容及传递时间等,来分析系统间的交互行为,监控网络信息流向与动态情况,是本发明“数据采集方法”要关注的内容。但在现有技术中,并没有专门针对黑盒系统进行数据采集的方法。

【发明内容】

[0004](一)解决的技术问题
[0005]针对现有技术的不足,本发明提供一种基于动态库API (ApplicationProgramming Interface,应用编程接口)拦截的数据采集方法及系统,能够通过拦截动态链接库的API来获取目标信息系统传输过程中的中间数据,并将采集到的数据存储到采集数据库,便于后续数据的分析和监控。
[0006](二)技术方案
[0007]为了实现以上目的,本发明通过以下技术方案予以实现:
[0008]一种基于动态库API拦截的数据采集方法,该方法包括:
[0009]确定目标信息系统中将被替换的动态库及其位置;
[0010]编写与被替换动态库同名的新的替换动态库,在替换动态库中实现被替换动态库的API功能,并将被替换动态库更改为其它名字;
[0011]应用程序调用替换动态库的API,替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端;
[0012]采集管理端接收数据后,对其进行解析和处理后,写入采集数据库。
[0013]其中,所述确定目标信息系统中被替换动态库的位置,具体包括:
[0014]利用Windows资源管理器,在Windows系统目录和目标信息系统目录下搜索文件,文件名为被替换动态库的名字;
[0015]将所有搜索到的结果文件分别更名,重新启动处理或传输服务,若提示缺少此动态库,说明相应文件下的动态库即为被替换的目标动态库。
[0016]其中,所述编写与被替换动态库同名的新的替换动态库,具体包括:
[0017]若传输服务提供了二次开发接口的动态库及相应的LIB文件,且对应的头文件以API形式给出用于上层应用调用,则采用隐式链接或显式链接的方式接将被替换动态库的文件映射进调用线程的地址空间;
[0018]若传输服务没有提供二次开发接口,则利用反汇编工具找出被拦截动态库所提供的所有API函数名及完整的参数定义格式,在新的动态库中分别定义与原有API同名的函数及指向API的指针,并采用显式链的方式接将被替换动态库的文件映射进调用线程的地址空间。
[0019]其中,所述隐式链接是指连接一个应用程序时指定一组LIB文件,每个LIB文件中包含了动态库文件允许应用程序调用的函数列表,则当链接器查到应用程序调用某个动态库文件的LIB文件中给出的函数时,在生成的EXE文件映像中加入信息,指出包含有函数的动态库文件的名称;所述显式链接是指利用LoadLibrary函数使得动态库文件被映射到进程的地址空间。
[0020]优选地,该方法还包括:对新的替换动态库进行调试。
[0021]其中,所述对新的动态库进行调试,具体包括:利用记日志的方式跟踪程序内部的执行情况,并根据日志信息的“错误”提示,不断地改进新的替换动态库的功能。
[0022]一种基于动态库API拦截的数据采集系统,该系统包括:数据采集端、采集管理端及采集数据库;
[0023]数据采集端,用于确定将被替换的动态库及其位置,编写与被替换动态库同名的新的替换动态库,并在替换动态库中实现被替换动态库的API功能,将被替换动态库更改为其它名字;利用替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端;
[0024]采集管理端,用于接收数据后,对其进行解析和处理后,写入采集数据库。
[0025]其中,所述采集管理端包括:数据采集子单元、数据解析子单元及数据写入子单元;
[0026]数据采集子单元,用于采集替换动态库发来的数据;
[0027]数据解析子单元,用于对接收的数据进行解析;
[0028]数据写入子单元,用于将解析后的数据写入采集数据库。
[0029](三)有益效果
[0030]本发明至少具有如下有益效果:
[0031]本发明利用动态库API拦截技术进行信息的采集,从传输通道中获取节点间通信的数据,只要是通过传输服务的数据都可以获得,不会因为数据格式不同或存储手段不同而漏采数据。本发明提供的方法中将采集到的数据直接发送给采集管理端,数据包的解析和入库行为有专门的采集管理端程序完成,数据采集行动不会破坏原系统功能,对系统的影响较小。且本发明提供的数据采集方法不管上层应用,凡是通过此类动态链接库处理的信息均能被获取到,从而规避了上层应用中业务处理的复杂性,实现了处理或传输服务层数据包的捕获。
【专利附图】

【附图说明】
[0032]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些图获得其他的附图。
[0033]附图1是本发明实施例提供的一种基于动态库API拦截的数据采集方法的流程图;
[0034]图2是本发明一个具体实施例提供的一种基于动态库API拦截的数据采集方法的流程图;
[0035]图3是本发明实施例中报文传输服务工作的原理图;
[0036]图4是本发明实施例中报文部署前后的系统传输过程对比图;
[0037]图5是本发明实施例中报文采集管理程序内部关系图;
[0038]图6是本发明实施例中被替换动态库的引出函数;
[0039]图7是本发明实施例中被替换动态库引出的API的详细定义图。
【具体实施方式】
[0040]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0041]参见图1,本发明实施例提供了一种基于动态库API拦截的数据采集方法,该方法包括如下步骤:
[0042]步骤101:确定目标信息系统中将被替换的动态库及其位置。
[0043]本步骤中,关键是需要确定目标信息系统中被替换动态库的位置,具体做法是:利用Windows资源管理器,在Windows系统目录和目标信息系统目录下搜索文件,文件名为被替换动态库的名字;将所有搜索到的结果文件分别更名,重新启动处理或传输服务,若提示缺少此动态库,说明相应文件下的动态库即为被替换的目标动态库。
[0044]步骤102:编写与被替换动态库同名的新的替换动态库,在替换动态库中实现被替换动态库的API功能,并将被替换动态库更改为其它名字。
[0045]本步骤中,替换动态库的编写是整个数据采集方法的核心,创建动态库的方法同普通动态库的创建方法一样,不过名称要与旧的动态库名称一样,这样的目的是为了传输服务能够直接调用此替换后的动态库。要将原有起作用的动态库中的函数全部引出,包括如下两种情况:
[0046]第一种情况:传输服务提供了二次开发接口的传输服务提供了二次开发接口的动态库及相应的Lib文件,对应的头文件以API形式给出用于上层应用调用。进行二次开发时,要确保调用程序包含动态库以及它们的Iib文件,程序要包含头文件。第二种情况:传输服务没有提供二次开发接口,只有传输服务所使用的动态库。这两种情况共同的特点是用于传输的系统服务,需先被启动,且常驻内存。
[0047]针对第一种情况,将对两种方式将动态链接库(DLL)文件映射进调用线程的地址空间:一种是隐式链接,一种是显式链接。隐式链接是连接一个应用程序时指定一组LIB文件,每个LIB文件中包含了 DLL文件允许应用程序调用的函数列表。当链接器看到应用程序调用某个DLL的LIB文件中给出的函数时,它就在生成的EXE文件映象中加入了信息,指出了包含有函数DLL文件的名称。显式链接是运用LoadLibrary函数,DLL文件能被显式地映射到进程的地址空间。本文提到的应用,都是采用显式链接。显示链接的优点是在客户程序使用动态链接库的时候不需要包括含有导出函数声明的头文件,也不需要导入动态链接库生成的类型库(一组LIB文件)。
[0048]针对第二种情况,原系统只提供了要替换的动态库,而没有提供二次开发接口,则需要依赖反汇编工具找出动态库提供的所有的API函数名及完整的参数定义格式,在替换动态库中分别定义与原有API同名的函数及指向API的指针,函数的格式与反汇编出来的API格式完全兼容。然后利用显式链接动态库的方式运用LoadLibrary加载旧动态库的函数进行调用。
[0049]一般来说此类服务软件是常驻内存的,所以部署时需要先停止传输服务,然后将原来的传输服务动态库更名,并将新的动态库复制到要替换的动态库的同目录下,重新启动传输服务。如果服务涉及到多个DLL,就需要替换所有的DLL。
[0050]步骤103:应用程序调用替换动态库的API,替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端;
[0051]步骤104:采集管理端接收数据后,对其进行解析和处理后,写入采集数据库。
[0052]优选地,该方法还包括对替换动态库的调试,由于原有信息系统独立成体系,对动态库的调用被封闭在系统内部,替换动态库的编译方法与普通动态库的编译方法相同,比较容易查出语法上的错误,但语义上的错误,却难以像普通DLL调试方法对其进行调试。可利用记日志的方式跟踪程序内部的执行情况,根据日志信息的“错误”提示,不断改进替换动态库的功能,以达到纠正调试语义错误的目的。
[0053]本发明实施例利用动态库API拦截技术进行数据的采集,从传输通道中获取节点间通信的数据,只要是通过传输服务的数据都可以获得,不会因为数据格式不同或存储手段不同而漏采数据。本发明实施例提供的方法中将采集到的数据直接发送给采集管理端,数据包的解析和入库行为有专门的管理端程序完成,数据采集行动不会破坏原系统功能,对系统的影响较小。且本发明实施例提供的数据采集方法不管上层应用,凡是通过此类动态链接库处理的信息均能被获取到,从而规避了上层应用中业务处理的复杂性,实现了处理或传输服务层数据包的捕获。
[0054]下面,通过一个具体的例子,来更为详细的说明本发明一个较佳实施例的实现过程。本实施例的目标信息系统是一个培训试验信息系统,采集的目标主要是各个作业席位之间交互的报文概要信息,即采集原系统通过报文传输服务传输的各种报文,记录报文的发送方、接收方、发送时间、接收时间、报文类型和报文内容等信息。
[0055]报文传输服务的工作原理如图3所示。源端应用首先将报文发送给本地的报文传输服务器,本地的报文传输服务器对报文进行转发,将报文传输到目的端的报文传输服务器,目的端的报文传输服务器最后将报文转发给目的端应用,传输服务器之间是双向通信的。其中,对该系统进行数据采集的步骤如下:
[0056]步骤201:确定培训试验系统中被替换动态库的位置。
[0057]其中,传输服务器程序常驻在内存中,并且通过调用被替换动态库文件STDSAp1.dll内API收发报文。被替换动态库部署在每个报文传输服务工作的主机上,如图3中传输服务器A和传输服务器B上。负责将采集到的信息传送到数据采集管理端,采集管理端的地位相当于另外开设的一个传输服务器C,不过这个传输服务器只负责接收各采集端发来的采集信息,并进行初步解析处理、写入数据库操作。
[0058]传输服务是以dll和头文件的形式提供,通过传输服务配置和传输服务接口二次封装,可以实现传输服务层数据包捕获。
[0059]步骤202:编写与被替换动态库同名的新的替换动态库,并将被替换动态库更改名字。
[0060]其中,本系统中被替换动态库的名字为STDSAp1.dll,则需要编写新的替换动态库文件替换STDSAp1.dll的功能,并将被替换动态库更改为其它的名字。部署了替换动态库STDSAp1.dll前后的系统报文传输方式如图4所示,a)图表示了原系统数据通过源应用程序A发出,传输服务器直接调用被替换的动态库STDSAp1.dll进行传输;b)图是部署了新的替换动态库STDSAp1.dll之后,将旧的被替换动态库更改为其它名字如STDSAp1.aaa,则传输服务器直接调用新的替换动态库如STDSAp1.dll。
[0061]步骤203:应用程序调用替换动态库的API。
[0062]步骤204:替换动态库获取信息后抄袭一份发送给报文采集管理端。
[0063]当传输服务器直接调用新的替换动态库STDSAp1.dll后,替换动态库则抄袭一份报文发送给报文采集管理端服务程序。
[0064]步骤205:报文采集管理端接收采集信息,进行解析和处理后,写入采集数据库。
[0065]其中,采集管理端负责接收替换动态库发送来的采集信息,进行解析和处理后,写入采集数据库。报文采集管理端程序内部关系图如图5所示,报文采集管理端包括三个子单元:采集信息接收子单元、采集信息解析子单元及采集数据库写入子单元,则采集信息接收子单元接收到替换动态库发送来的信息之后,将其送入采集信息解析子单元对信息进行解析处理,并将解析后的信息系统写入采集数据库。
[0066]其中,替换动态库STDSAp1.dll的编写方法是本实施例采集数据的关键,则下面重点阐述了替换动态库是如何实现的。
[0067]本实施例中,利用VC++提供的工具D印ends,查看旧的被替换动态库STDSAp1.dll的API情况,如图6所示,可以看出被替换动态库STDSAp1.dll包含有7个API,并且给出了具体的函数名字。经过分析,CommInit的功能是客户端应用程序向传输服务器注册函数,Co_Exit是与之对应的注销函数,而真正用于发送数据报文的函数为Co_SendTo。原系统提供了二次开发接口,处理函数CommSendToLocalNet外其他函数的完整定义包含在一个头文件里。因此以替换动态库中函数CommInit和函数CommSendToLocalNet为例说明两种情况下,如何编写替换动态库内与被替换动态库相对应的API。
[0068]第一种情况:函数CommInit的处理方法。即传输服务提供了二次开发接口的动态库及相应的LIB文件,且对应的头文件以API形式给出用于上层应用调用,则采用隐式链接或显式链接的方式接将被替换动态库的文件映射进调用线程的地址空间,具体处理方式如下:
[0069]将旧的STDSAp1.dll更名为STDSAp1.aaa,新建一个同名的采集动态库STDSAp1.dll项目,并引入对应的头文件STDSAp1.h和STDSAp1.Lib文件。
[0070]假定h是动态加载时指向STDSAp1.aaa的句柄,用于定位各函数在内存中的位置,其全局定义为:[0071]HINSTANCE h=NULL;
[0072]typedef unsigned char^MSGBODY;//消息体类型定义
[0073]支持“缓冲区”方式接收的回调函数指针类型定义:—GET—MESSAGE。
[0074]typedef int (_stdcal 1*_GET_MESSAGE) (short myEntity,shorttype,const MSGBODY getMsg,unsigned long msgLen,unsigned short msgNo,constchar氺sourAddr,unsigned short sourEntity);
[0075]传输初始化函数CommInit在头文件中的定义,客户要注册服务器IP与标识应用的程序识别号,以及一个—GET—MESSAGE类型的回调函数指针,作于传输服务器接收到报文时正确地投递给相应的应用程序接收。
[0076]—decIspec(dllimport)int CommInit (const char氺serverIP,unsigned shortmyEntity,—GET—MESSAGE call—back—func);
[0077]定义指向CommInit函数的指针类型Type—CommInit及其实例old—CommInit,用于指向旧的动态库中STDSAp1.aaa中的CommInit函数。
[0078]typedef int(*Type_CommInit) (const char*serverIP,unsigned shortmyEntity,—GET—MESSAGE call—back—func);
[0079]Type—CommInit old—CommInit;
[0080]下面是CommInit的实现代码。在替换动态库STDSAp1.dl中,
【权利要求】
1.一种基于动态库API拦截的数据采集方法,其特征在于,该方法包括: 确定目标信息系统中将被替换的动态库及其位置; 编写与被替换动态库同名的新的替换动态库,在替换动态库中实现被替换动态库的API功能,并将被替换动态库更改为其它名字; 应用程序调用替换动态库的API,替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端; 采集管理端接收数据后,对其进行解析和处理后,写入采集数据库。
2.根据权利要求1所述的方法,其特征在于,所述确定目标信息系统中被替换动态库的位置,具体包括: 利用Windows资源管理器,在Windows系统目录和目标信息系统目录下搜索文件,文件名为被替换动态库的名字; 将所有搜索到的结果文件分别更名,重新启动处理或传输服务,若提示缺少此动态库,说明相应文件下的动态库即为被替换的目标动态库。
3.根据权利要求1所述的方法,其特征在于,所述编写与被替换动态库同名的新的替换动态库,具体包括: 若传输服务提供了二次开发接口的动态库及相应的LIB文件,且对应的头文件以API形式给出用于上层应用调用,则采用隐式链接或显式链接的方式接将被替换动态库的文件映射进调用线程的地址空间; 若传输服务没有提供二次开发接口,则利用反汇编工具找出被拦截动态库所提供的所有API函数名及完整的参数定义格式,在新的动态库中分别定义与原有API同名的函数及指向API的指针,并采用显式链的方式接将被替换动态库的文件映射进调用线程的地址空间。
4.根据权利要求3所述的方法,其特征在于,所述隐式链接是指连接一个应用程序时指定一组LIB文件,每个LIB文件中包含了动态库文件允许应用程序调用的函数列表,则当链接器查到应用程序调用某个动态库文件的LIB文件中给出的函数时,在生成的EXE文件映像中加入信息,指出包含有函数的动态库文件的名称;所述显式链接是指利用LoadLibrary函数使得动态库文件被映射到进程的地址空间。
5.根据权利要求1所述的方法,其特征在于,该方法还包括:对新的替换动态库进行调试。
6.根据权利要求5所述的方法,其特征在于,所述对新的替换动态库进行调试,具体包括:利用记日志的方式跟踪程序内部的执行情况,并根据日志信息的“错误”提示,不断地改进新的替换动态库的功能。
7.一种基于动态库API拦截的数据采集系统,其特征在于,该系统包括:数据采集端、采集管理端及采集数据库; 数据采集端,用于确定将被替换的动态库及其位置,编写与被替换动态库同名的新的替换动态库,并在替换动态库中实现被替换动态库的API功能,将被替换动态库更改为其它名字;利用替换动态库获取目标信息系统处理或传输过程中的数据,并将数据发送给采集管理端; 采集管理端,用于接收数据后,对其进行解析和处理后,写入采集数据库。
8.根据权利要求7所述的系统,其特征在于,所述采集管理端包括:数据采集子单元、数据解析子单元及数据写入子单元; 数据采集子单元,用于采集替换动态库发来的数据; 数据解析子单元,用于对接收的数据进行解析; 数据写入子单元,用于将解析后的数据写入采集数据库。
【文档编号】G06F17/30GK103902284SQ201410083145
【公开日】2014年7月2日 申请日期:2014年3月7日 优先权日:2014年3月7日
【发明者】崔培枝, 刘海燕, 孙岩, 王青海, 何国良, 崔伟宁, 吴迪, 黄俊卿 申请人:中国人民解放军装甲兵工程学院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1