CN113535592B - 对dpdk应用程序抓包的方法、装置、设备及存储介质 - Google Patents
对dpdk应用程序抓包的方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN113535592B CN113535592B CN202111079311.8A CN202111079311A CN113535592B CN 113535592 B CN113535592 B CN 113535592B CN 202111079311 A CN202111079311 A CN 202111079311A CN 113535592 B CN113535592 B CN 113535592B
- Authority
- CN
- China
- Prior art keywords
- function
- dpdk
- packet
- capturing
- data packet
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请涉及一种对DPDK应用程序抓包的方法、装置、设备及存储介质。该对DPDK应用程序抓包的方法包括获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包;将动态链接库文件注入DPDK应用程序;利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。由于利用抓包函数对接口函数进行了内联钩子操作,因此在DPDK应用程序传输DPDK数据包的过程中,可以利用抓包函数抓取DPDK数据包。
Description
技术领域
本申请涉及计算机领域,尤其涉及一种对DPDK应用程序抓包的方法、装置、设备及存储介质。
背景技术
近年来, 随着网络的普及,互联网用户越来越多,随之带来的访问流量也越来越大。一线互联网公司日访问量上千万甚至破亿,并且还在不断呈上升趋势。为了适应大规模网络访问的场景,DPDK(Data Plane Development Kit,数据平面开发套件)技术应运而生,DPDK是Intel公司在2010年基于BSD开源许可协议发布的一个开源的、快速处理数据平面数据包转发的开发平台及接口。基于DPDK提供的用户态的高效数据包访问处理接口,运行在用户态的应用程序能够利用自身提供的数据平面库来收发数据包。
在日常应用中,经常需要通过抓包分析进行网络方面的排错。当前,在DPDK 16.07的版本中引入了DPDK数据包捕获开发框架: librte_pdump,同时提供了DPDK-pdump工具,使用该工具可以抓取被DPDK应用程序接管的指定接口、以及队列的DPDK数据包。
在上述的方法中, 虽然解决了DPDK应用程序抓包的问题,但存在一定的局限性:
1.通过librte_pdump、DPDK-pdump对DPDK应用程序抓包是有前提条件的:在DPDK应用程序中必须调用rte_pdump_init函数来初始化DPDK数据包捕获开发框架,否则DPDK-pdump工具无法抓到DPDK数据包。而默认情况下,DPDK应用程序不会主动启用DPDK数据包捕获开发框架,需要由DPDK应用程序开发者根据实际需要自行启用。所以正常情况下,通过这种抓包方式只能抓取到自己开发的DPDK应用程序的数据包,自己开发源码可控,因此可以随时在源码中调用rte_pdump_init函数。而如果想对他人基于DPDK开发的应用程序进行抓包,但该程序中并未调用rte_pdump_init函数来初始化DPDK数据包捕获开发框架,则无法实现抓包。
2.对于早期未引入DPDK数据包捕获开发框架librte_pdump的DPDK版本或一些对DPDK源码做二次开发移除了librte_pdump的DPDK版本所开发出来的应用程序,同样无法实现对其抓包。
发明内容
本申请提供了一种对DPDK应用程序抓包的方法、装置、设备及存储介质,用以解决现有的抓包方案存在局限性的问题。
第一方面,提供一种对DPDK应用程序抓包的方法,包括:
获取动态链接库文件,所述动态链接库文件包括抓包函数,所述抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取所述DPDK数据包;
将所述动态链接库文件注入所述DPDK应用程序;
利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输所述DPDK数据包时,利用所述抓包函数抓取所述DPDK数据包。
可选地,将所述动态链接库文件注入所述DPDK应用程序,包括:
确定与所述动态链接库文件对应的注入工具;
通过所述注入工具提供的注入方法将所述动态链接库文件注入所述DPDK应用程序。
可选地,利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,包括:
确定与所述动态链接库文件对应的注入工具;
通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作。
可选地,通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作,包括:
获取所述抓包函数中的发送函数和所述接口函数中的原始发送函数;通过所述调用方法调用所述开始钩子函数确定所述发送函数在所述原始发送函数的挂钩点为所述原始发送函数的首部;和/或,
获取所述抓包函数中的接收函数和所述接口函数中的原始接收函数;调用所述调用方法调用所述开始钩子函数确定所述接收函数在所述原始接收函数的挂钩点为所述原始发送函数的尾部。
可选地,所述原始发送函数通过xmit_pkts函数实现,所述原始接收函数通过recv_pkts函数实现。
可选地,所述抓包函数包括发送函数;
利用所述抓包函数抓取所述DPDK数据包,包括:
从所述接口函数的原始发送函数中获取所述DPDK数据包的总个数;
基于当前所抓取的DPDK数据包和所述总个数,判断是否抓取完所有的所述DPDK数据包;
若是,跳转至由所述原始发送函数发送所述DPDK数据包;
若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的所述DPDK数据包。
可选地,所述抓包函数包括接收函数;
利用所述接收函数抓取所述DPDK数据包之前,还包括:
确定所述接口函数中的原始接收函数完全接收所述DPDK数据包。
可选地,利用所述抓包函数抓取所述DPDK数据包,包括:
通过内联钩子框架所提供的钩子代码插入方法调用所述接收函数抓取所述DPDK数据包。
可选地,所述钩子代码插入方法通过gum_interceptor_attach方法实现。
可选地,通过内联钩子框架所提供的拦截方法调用所述抓包函数抓取所述DPDK数据包,包括:
获取所述原始接收函数所接收的DPDK数据包的总个数;
基于当前所抓取的DPDK数据包和所述总个数,判断是否抓取完所有的所述DPDK数据包;
若是,将所述接收的DPDK数据包发送至所述DPDK应用程序;
若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的所述DPDK数据包。
可选地,获取所述原始接收函数所接收的DPDK数据包的总个数,包括:
通过所述原始接收函数查询是否接收到所述DPDK数据包;
若是,将接收的所述DPDK数据包存入预设的包缓冲区中;
当在预设时间内未接收到DPDK数据包时,统计所述包缓冲区中的DPDK数据包的数量,并确定所述数量为所述总个数。
可选地,基于当前所抓取的DPDK数据包和所述总个数,判断是否抓取完所有的所述DPDK数据包,包括:
从对应所述的所述DPDK数据包的数据包指针数组中,获取当前所抓取的DPDK数据包的数据包指针,所述数据包指针数组包括至少一个数据包指针,每个所述数据包指针指向一个所述DPDK数据包;
获取所述当前所抓取的DPDK数据包的数据包指针的索引号;
基于所述索引号和所述数据包指针数组中各数据包指针的索引号,确定是否抓取完所有的所述DPDK数据包;
其中,当所述索引号为所述数据包指针数组中最后一个数据包指针的索引号时,确定抓取完所有的所述DPDK数据包,所述最后一个数据包指针指向最后一个未被抓取的所述DPDK数据包。
可选地,基于所述索引号和所述数据包指针数组中各数据包指针的索引号,确定是否抓取完所有的所述DPDK数据包,包括:
获取由所述数据包指针数组中各数据包指针的索引号所指示的抓取顺序;
按照所述抓取顺序确定所述索引号是否为所述最后一个数据包指针的索引号;
若是,确定抓取完所有的所述DPDK数据包。
可选地,利用所述抓包函数抓取所述DPDK数据包之后还包括:
解析所述DPDK数据包,得到所述DPDK数据包的数据包内容;
在指定的数据报文存储文件存储所述数据包内容。
可选地,解析所述DPDK数据包,得到所述DPDK数据包的数据包内容,包括:
由所述抓包函数解析所述DPDK数据包,得到所述DPDK数据包的数据包内容。
第二方面,提供一种对DPDK应用程序抓包的装置,包括:
获取单元,用于获取动态链接库文件,所述动态链接库文件包括抓包函数,所述抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取所述DPDK数据包;
注入单元,用于将所述动态链接库文件注入所述DPDK应用程序;
抓包单元,用于利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输所述DPDK数据包时,利用所述抓包函数抓取所述DPDK数据包。
第三方面,提供一种电子设备,包括:处理器、存储器和通信总线,其中,处理器和存储器通过通信总线完成相互间的通信;
所述存储器,用于存储计算机程序;
所述处理器,用于执行所述存储器中所存储的程序,实现第一方面所述的对DPDK应用程序抓包的方法。
第四方面,提供一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现第一方面所述的对DPDK应用程序抓包的方法。
本申请实施例提供的上述技术方案与现有技术相比具有如下优点:本实施例提供的技术方案中,获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包;将动态链接库文件注入DPDK应用程序;利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。由于利用抓包函数对接口函数进行了内联钩子操作,因此在DPDK应用程序传输DPDK数据包的过程中,可以利用抓包函数抓取DPDK数据包,所以即使DPDK应用程序中未引入抓包框架librte_pdump, 或DPDK应用程序中未调用rte_pdump_init函数初始化抓包框架, 采用本申请的方案都可以实现对DPDK应用程序的抓包。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中对DPDK应用程序抓包的方法的流程示意图;
图2为正常程序的执行流程示意图;
图3为被hook后的执行流程示意图;
图4为本申请实施例中对DPDK应用程序抓包的装置的结构示意图;
图5为本申请实施例中电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
DPDK:数据平面开发套件(DPDK ,Data Plane Development Kit),是基于BSD开源许可协议发布的一个开源的、快速处理数据平面数据包转发的开发平台及接口。
源码包:源代码的可见的软件包。
动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。能够节约应用程序所需的磁盘和内存空间。
hookso是一个linux动态链接库的注入修改查找工具,用来修改其他进程的动态链接库行为。
pcap文件:是常用的数据报存储格式,能够用wireshark等抓包工具正常打开,并查看里面的网络数据报。
Wireshark:一种网络抓包工具,能够显示出最为详细的网络封包材料,并且也能够生成pacp文件。
为了解决现有技术中提出的技术问题,本申请实施例提供一种对DPDK应用程序抓包的方法,该对DPDK应用程序抓包的方法可以应用于任一电子设备;
应用中,该电子设备包括智能手机(如Android手机、iOS手机、Windows Phone手机等)、平板电脑、掌上电脑、笔记本电脑等,上述仅是举例,而非穷举,包含但不限于上述装置,当然,上述电子设备还可以为服务器,例如,云服务器。
如图1所示,该对DPDK应用程序抓包的方法可以包括以下步骤:
步骤101、获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包。
应用中,动态链接库文件包括但不限于动态链接库so文件。
本实施例中,抓包函数包括接收函数和发送函数,其中,接收函数用于在DPDK应用程序接收DPDK数据包的过程中抓取DPDK数据包;发送函数用于在DPDK应用程序发送DPDK数据包的过程中抓取DPDK数据包。
步骤102、将动态链接库文件注入DPDK应用程序。
本实施例中的DPDK应用程序指的是用于实现DPDK应用程序功能的DPDK源码包,因此将动态链接库文件注入DPDK应用程序指的是将动态链接库文件注入DPDK源码包中。
应用中,采用注入工具将动态链接库文件注入DPDK应用程序中。具体地,确定与动态链接库文件对应的注入工具;通过注入工具提供的注入方法将动态链接库文件注入DPDK应用程序。
示例性地,当动态链接库文件为动态链接库so文件时,与动态链接库文件对应的注入工具为hookso,相应地该注入工具所提供的注入方法可以为dlopen方法。
步骤103、利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。
应用中,用户态驱动中的接口函数包括原始发送函数和原始接收函数,其中,基于原始发送函数,DPDK应用程序向外发送DPDK数据包;基于原始接收函数,DPDK应用程序接收来自于外部的DPDK数据包。
应用中,通过注入工具所提供的调用方法,调用开始钩子函数实现由抓包函数到接口函数的内联钩子操作。其中,当注入工具为hookso时,hookso所提供的调用方法可以为call方法,开始钩子函数可以为start_hook函数。
应用中,在对接口函数进行内联钩子操作时,分别对原始发送函数和原始接收函数各自进行内联钩子操作。需要说明的是,根据需要可以对原始发送函数和原始接收函数均进行内联钩子(inline hook)操作,当然也可以对原始发送函数和原始接收函数中的任一函数进行内联钩子操作。
具体地,获取抓包函数中的发送函数和接口函数中的原始发送函数;通过调用方法调用开始钩子函数确定发送函数在原始发送函数的挂钩点为原始发送函数的首部;和/或,获取抓包函数中的接收函数和接口函数中的原始接收函数;调用调用方法调用开始钩子函数确定接收函数在原始接收函数的挂钩点为原始发送函数的尾部。
以下对inline hook功能进行介绍:
请参照图2及图3,其中,图2为正常程序的执行流程示意图,图3为被hook后的执行流程示意图,其中在图3中,挂钩点为fun2的首部;
当按照图2的流程执行时,先执行fun1的程序,再执行fun2的程序,因此最终输出的结果为fun1、fun2;当按照图3的流程执行时,先执行fun1的程序,待fun1的程序执行完毕,跳转到fun2的程序的入口时,跳转(jmp)到myfun的程序并执行myfun的程序,待myfun的程序执行完毕后,跳回到fun2的程序,并继续执行fun2的程序,因此图3的最终输出结果为fun1、myfun、fun2。
基于以上对inline hook功能的介绍,当对接口函数进行inline hook操作后,DPDK应用程序发送DPDK数据包时,先由抓包函数中的发送函数抓取DPDK数据包,然后再由原始发送函数发送DPDK数据包;而DPDK应用程序接收DPDK数据包时,则先由原始接收函数接收DPDK数据包,再由抓包函数中的接收函数抓取DPDK数据包。
应用中,原始发送函数通过xmit_pkts函数实现,原始接收函数通过recv_pkts函数实现。
示例性地,以vmxnet3网卡驱动为例,原始发送函数可以为vmxnet3网卡pmd驱动中vmxnet3_xmit_pkts函数;原始接收函数可以为vmxnet3网卡pmd驱动中vmxnet3_recv_pkts函数。
以下分别针对发送DPDK数据包的过程和接收DPDK数据包的过程描述本实施例的抓包过程:
在发送DPDK数据包的过程中:
具体实现时,从接口函数的原始发送函数中获取DPDK数据包的总个数;基于当前所抓取的DPDK数据包和总个数,判断是否抓取完所有的DPDK数据包;若是,跳转至由原始发送函数发送DPDK数据包;若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的DPDK数据包。
本实施例中,采用数据包指针的方式对不同的DPDK数据包进行区分,因此在判定是否抓取完所有的DPDK数据包时,从对应的DPDK数据包的数据包指针数组中,获取当前所抓取的DPDK数据包的数据包指针,数据包指针数组包括至少一个数据包指针,每个数据包指针指向一个DPDK数据包;获取当前所抓取的DPDK数据包的数据包指针的索引号;基于索引号和数据包指针数组中各数据包指针的索引号,确定是否抓取完所有的DPDK数据包;其中,当索引号为数据包指针数组中最后一个数据包指针的索引号时,确定抓取完所有的DPDK数据包,最后一个数据包指针指向最后一个未被抓取的DPDK数据包。
应用中,当按照索引号由小到大的顺序发送DPDK数据包时,若当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致时,确定抓取完所有的DPDK数据包。
应理解,当数据包指针的索引号最小从0开始排序时,当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致指的是,当前所抓取的DPDK数据包的数据包指针的索引号比总个数少1;而当数据包指针的索引号最小从1开始排序时,当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致指的是,当前所抓取的DPDK数据包的数据包指针的索引号与总个数相同。
在接收DPDK数据包的过程中:
在此过程中,通过内联钩子框架所提供的钩子(hook)代码插入方法调用函数抓取DPDK数据包,其中钩子代码插入方法包括但不限于gum_interceptor_attach方法。
应用中,调用抓包函数抓取DPDK数据包的实现过程具体可以为,获取原始接收函数所接收的DPDK数据包的总个数;基于当前所抓取的DPDK数据包和总个数,判断是否抓取完所有的DPDK数据包;若是,将接收的DPDK数据包发送至DPDK应用程序;若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的DPDK数据包。
本实施例中,采用数据包指针的方式对不同的DPDK数据包进行区分,因此在判定是否抓取完所有的DPDK数据包时,从对应的DPDK数据包的数据包指针数组中,获取当前所抓取的DPDK数据包的数据包指针,数据包指针数组包括至少一个数据包指针,每个数据包指针指向一个DPDK数据包;获取当前所抓取的DPDK数据包的数据包指针的索引号;基于索引号和数据包指针数组中各数据包指针的索引号,确定是否抓取完所有的DPDK数据包;其中,当索引号为数据包指针数组中最后一个数据包指针的索引号时,确定抓取完所有的DPDK数据包,最后一个数据包指针指向最后一个未被抓取的DPDK数据包。
应用中,当按照索引号由小到大的顺序发送DPDK数据包时,若当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致时,确定抓取完所有的DPDK数据包。
应理解,当数据包指针的索引号最小从0开始排序时,当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致指的是,当前所抓取的DPDK数据包的数据包指针的索引号比总个数少1;而当数据包指针的索引号最小从1开始排序时,当前所抓取的DPDK数据包的数据包指针的索引号与总个数一致指的是,当前所抓取的DPDK数据包的数据包指针的索引号与总个数相同。
为了确保准确地得到所接收的DPDK数据包的总个数,本实施例中,在利用接收函数抓取DPDK数据包之前,还可以确定接口函数中的原始接收函数完全接收DPDK数据包。
本实施例中,原始接收函数在接收DPDK数据包后,将DPDK数据包存入预设的包缓冲区中,因此在获取原始接收函数所接收的DPDK数据包的总个数时,通过原始接收函数查询是否接收到DPDK数据包;若是,将接收的DPDK数据包存入预设的包缓冲区中;当在预设时间内未接收到DPDK数据包时,统计包缓冲区中的DPDK数据包的数量,并确定数量为总个数。
本申请的另一实施例中,由于在DPDK场景下,DPDK数据包以Mbuff结构体的形式呈现,因此在利用抓包函数抓取DPDK数据包后,为了方便对DPDK数据包进行分析,还可以解析DPDK数据包,得到DPDK数据包的数据包内容,并在指定的数据报文存储文件存储数据包内容。
为了节省资源,本实施例中由抓包函数解析DPDK数据包,得到DPDK数据包的数据包内容。
本实施例提供的技术方案中,获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包;将动态链接库文件注入DPDK应用程序;利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。由于利用抓包函数对接口函数进行了内联钩子操作,因此在DPDK应用程序传输DPDK数据包的过程中,可以利用抓包函数抓取DPDK数据包,所以即使DPDK应用程序中未引入抓包框架librte_pdump, 或DPDK应用程序中未调用rte_pdump_init函数初始化抓包框架, 采用本申请的方案都可以实现对DPDK应用程序的抓包。
以下以vmxnet3网卡驱动为例阐述本申请实施例的实现:
1.基于inline hook框架frida所提供的gum_interceptor_attach方法,实现对vmxnet3网卡pmd驱动中vmxnet3_recv_pkts函数进行inline hook,挂钩点为函数尾部,即函数退出时inline hook。当网卡有数据包到来时,vmxnet3系列的网卡将调用vmxnet3_recv_pkts函数来接收新的数据包。因此,hook该函数可以获取到DPDK应用程序所收到的数据包。
2.基于inline hook框架frida所提供的gum_interceptor_attach方法,实现对vmxnet3网卡pmd驱动中vmxnet3_xmit_pkts函数进行inline hook,挂钩点为函数首部, 即函数进入时inline hook。当DPDK应用程序需要通过网卡向外发送数据时,vmxnet3系列的网卡将调用vmxnet3_xmit_pkts函数来发送数据包。因此,hook该函数可以获取到DPDK应用程序所发送的数据包。
3.在DPDK中,每个数据包最终被封装成了一个叫做Mbuff的结构体,并且在hook的数据包收发函数中均有对应参数指向该数据包结构体以及数据包数量等信息。因此,需要在hook的函数中解析Mbuff结构体, 获取到真正数据包内容并将其写入指定的pcap文件中。
4.经过2.3.4步的代码实现后,最终会生成一个动态链接库so文件,用于注入到DPDK应用程序中对其抓包。
5.通过so注入工具hookso所提供的dlopen方法,将生成的动态链接库so文件注入到DPDK应用程序中。
6.通过so注入工具hookso所提供的call方法,调用所注入so中的start_hook函数,开始执行inline hook并抓取数据包写入到pcap文件中。
7.抓包完成后,通过Wireshark等可视化工具对pcap文件进行分析处理。
基于同一构思,本申请实施例中提供了一种对DPDK应用程序抓包的装置,该装置的具体实施可参见对DPDK应用程序抓包的方法的实施例部分的描述,重复之处不再赘述,如图4所示,该装置主要包括:
获取单元401,用于获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包;
注入单元402,用于将动态链接库文件注入DPDK应用程序;
抓包单元403,用于利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。
可选地,注入单元402用于:
确定与动态链接库文件对应的注入工具;
通过注入工具提供的注入方法将动态链接库文件注入DPDK应用程序。
可选地,抓包单元403用于:
确定与动态链接库文件对应的注入工具;
通过注入工具所提供的调用方法,调用开始钩子函数实现由抓包函数到接口函数的内联钩子操作。
可选地,抓包单元403用于:
获取抓包函数中的发送函数和接口函数中的原始发送函数;通过调用方法调用开始钩子函数确定发送函数在原始发送函数的挂钩点为原始发送函数的首部;和/或,
获取抓包函数中的接收函数和接口函数中的原始接收函数;调用调用方法调用开始钩子函数确定接收函数在原始接收函数的挂钩点为原始发送函数的尾部。
可选地,原始发送函数通过xmit_pkts函数实现,原始接收函数通过recv_pkts函数实现。
可选地,抓包函数包括发送函数;
可选地,抓包单元403用于:
从接口函数的原始发送函数中获取DPDK数据包的总个数;
基于当前所抓取的DPDK数据包和总个数,判断是否抓取完所有的DPDK数据包;
若是,跳转至由原始发送函数发送DPDK数据包;
若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的DPDK数据包。
可选地,抓包函数包括接收函数;
该装置还用于:
利用接收函数抓取DPDK数据包之前,确定接口函数中的原始接收函数完全接收DPDK数据包。
可选地,抓包单元403用于:
通过内联钩子框架所提供的钩子代码插入方法调用接收函数抓取DPDK数据包。
可选地,钩子代码插入方法通过gum_interceptor_attach方法实现。
可选地,抓包单元403用于:
获取原始接收函数所接收的DPDK数据包的总个数;
基于当前所抓取的DPDK数据包和总个数,判断是否抓取完所有的DPDK数据包;
若是,将接收的DPDK数据包发送至DPDK应用程序;
若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的DPDK数据包。
可选地,抓包单元403用于:
通过原始接收函数查询是否接收到DPDK数据包;
若是,将接收的DPDK数据包存入预设的包缓冲区中;
当在预设时间内未接收到DPDK数据包时,统计包缓冲区中的DPDK数据包的数量,并确定数量为总个数。
可选地,抓包单元403用于:
从对应的DPDK数据包的数据包指针数组中,获取当前所抓取的DPDK数据包的数据包指针,数据包指针数组包括至少一个数据包指针,每个数据包指针指向一个DPDK数据包;
获取当前所抓取的DPDK数据包的数据包指针的索引号;
基于索引号和数据包指针数组中各数据包指针的索引号,确定是否抓取完所有的DPDK数据包;
其中,当索引号为数据包指针数组中最后一个数据包指针的索引号时,确定抓取完所有的DPDK数据包,最后一个数据包指针指向最后一个未被抓取的DPDK数据包。
可选地,抓包单元403用于:
获取由数据包指针数组中各数据包指针的索引号所指示的抓取顺序;
按照抓取顺序确定索引号是否为最后一个数据包指针的索引号;
若是,确定抓取完所有的DPDK数据包。
可选地,该装置还用于:
利用抓包函数抓取DPDK数据包之后解析DPDK数据包,得到DPDK数据包的数据包内容;
在指定的数据报文存储文件存储数据包内容。
可选地,该装置用于:
由抓包函数解析DPDK数据包,得到DPDK数据包的数据包内容。
基于同一构思,本申请实施例中还提供了一种电子设备,如图5所示,该电子设备主要包括:处理器501、存储器502和通信总线503,其中,处理器501和存储器502通过通信总线503完成相互间的通信。其中,存储器502中存储有可被处理器501执行的程序,处理器501执行存储器502中存储的程序,实现如下步骤:
获取动态链接库文件,动态链接库文件包括抓包函数,抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取DPDK数据包;
将动态链接库文件注入DPDK应用程序;
利用抓包函数对DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输DPDK数据包时,利用抓包函数抓取DPDK数据包。
上述电子设备中提到的通信总线503可以是外设部件互连标准(PeripheralComponent Interconnect,简称PCI)总线或扩展工业标准结构(Extended IndustryStandard Architecture,简称EISA)总线等。该通信总线503可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
存储器502可以包括随机存取存储器(Random Access Memory,简称RAM),也可以包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。可选地,存储器还可以是至少一个位于远离前述处理器501的存储装置。
上述的处理器501可以是通用处理器,包括中央处理器(Central ProcessingUnit,简称CPU)、网络处理器(Network Processor,简称NP)等,还可以是数字信号处理器(Digital Signal Processing,简称DSP)、专用集成电路(Application SpecificIntegrated Circuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本申请的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,当该计算机程序在计算机上运行时,使得计算机执行上述实施例中所描述的对DPDK应用程序抓包的方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行该计算机指令时,全部或部分地产生按照本申请实施例所述的流程或功能。该计算机可以时通用计算机、专用计算机、计算机网络或者其他可编程装置。该计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、微波等)方式向另外一个网站站点、计算机、服务器或数据中心进行传输。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是磁性介质(例如软盘、硬盘、磁带等)、光介质(例如DVD)或者半导体介质(例如固态硬盘)等。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所申请的原理和新颖特点相一致的最宽的范围。
Claims (7)
1.一种对DPDK应用程序抓包的方法,其特征在于,包括:
获取动态链接库文件,所述动态链接库文件包括抓包函数,所述抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取所述DPDK数据包;
将所述动态链接库文件注入所述DPDK应用程序;
利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输所述DPDK数据包时,利用所述抓包函数抓取所述DPDK数据包;
利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,包括:
确定与所述动态链接库文件对应的注入工具;
通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作;
通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作,包括:
获取所述抓包函数中的发送函数和所述接口函数中的原始发送函数;通过所述调用方法调用所述开始钩子函数确定所述发送函数在所述原始发送函数的挂钩点为所述原始发送函数的首部;
通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作,包括:
获取所述抓包函数中的接收函数和所述接口函数中的原始接收函数;调用所述调用方法调用所述开始钩子函数确定所述接收函数在所述原始接收函数的挂钩点为所述原始发送函数的尾部。
2.根据权利要求1所述的对DPDK应用程序抓包的方法,其特征在于,将所述动态链接库文件注入所述DPDK应用程序,包括:
确定与所述动态链接库文件对应的注入工具;
通过所述注入工具提供的注入方法将所述动态链接库文件注入所述DPDK应用程序。
3.根据权利要求1所述的对DPDK应用程序抓包的方法,其特征在于,所述抓包函数包括发送函数;
利用所述抓包函数抓取所述DPDK数据包,包括:
从所述接口函数的原始发送函数中获取所述DPDK数据包的总个数;
基于当前所抓取的DPDK数据包和所述总个数,判断是否抓取完所有的所述DPDK数据包;
若是,跳转至由所述原始发送函数发送所述DPDK数据包;
若否,抓取下一个未被抓取的DPDK数据包,直至抓取完所有的所述DPDK数据包。
4.根据权利要求1所述的对DPDK应用程序抓包的方法,其特征在于,所述抓包函数包括接收函数;
利用所述接收函数抓取所述DPDK数据包之前,还包括:
确定所述接口函数中的原始接收函数完全接收所述DPDK数据包。
5.一种对DPDK应用程序抓包的装置,其特征在于,包括:
获取单元,用于获取动态链接库文件,所述动态链接库文件包括抓包函数,所述抓包函数用于在DPDK应用程序传输DPDK数据包的过程中抓取所述DPDK数据包;
注入单元,用于将所述动态链接库文件注入所述DPDK应用程序;
抓包单元,用于利用所述抓包函数对所述DPDK应用程序所加载的用户态驱动中的接口函数进行内联钩子操作,并当传输所述DPDK数据包时,利用所述抓包函数抓取所述DPDK数据包;
所述抓包单元用于:
确定与所述动态链接库文件对应的注入工具;
通过所述注入工具所提供的调用方法,调用开始钩子函数实现由所述抓包函数到所述接口函数的所述内联钩子操作;
所述抓包单元用于:
获取所述抓包函数中的发送函数和所述接口函数中的原始发送函数;通过所述调用方法调用所述开始钩子函数确定所述发送函数在所述原始发送函数的挂钩点为所述原始发送函数的首部;
所述抓包单元用于:
获取所述抓包函数中的接收函数和所述接口函数中的原始接收函数;调用所述调用方法调用所述开始钩子函数确定所述接收函数在所述原始接收函数的挂钩点为所述原始发送函数的尾部。
6.一种电子设备,其特征在于,包括:处理器、存储器和通信总线,其中,处理器和存储器通过通信总线完成相互间的通信;
所述存储器,用于存储计算机程序;
所述处理器,用于执行所述存储器中所存储的程序,实现权利要求1-4任一项所述的对DPDK应用程序抓包的方法。
7.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-4任一项所述的对DPDK应用程序抓包的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111079311.8A CN113535592B (zh) | 2021-09-15 | 2021-09-15 | 对dpdk应用程序抓包的方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111079311.8A CN113535592B (zh) | 2021-09-15 | 2021-09-15 | 对dpdk应用程序抓包的方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113535592A CN113535592A (zh) | 2021-10-22 |
CN113535592B true CN113535592B (zh) | 2022-08-05 |
Family
ID=78123128
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111079311.8A Active CN113535592B (zh) | 2021-09-15 | 2021-09-15 | 对dpdk应用程序抓包的方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113535592B (zh) |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103957214A (zh) * | 2014-05-06 | 2014-07-30 | 重庆邮电大学 | 一种教学用计算机网络数据包抓取方法 |
CN106161398A (zh) * | 2015-04-21 | 2016-11-23 | 北京信威通信技术股份有限公司 | 抓包方法及装置 |
CN106656656A (zh) * | 2016-11-07 | 2017-05-10 | 汉柏科技有限公司 | 一种网络设备抓包方法及装置 |
CN106961363A (zh) * | 2017-03-29 | 2017-07-18 | 云络动力(北京)科技有限公司 | 一种捕获虚拟交换机用户态数据平面数据报文的方法和系统 |
CN107329901B (zh) * | 2017-07-31 | 2021-09-28 | 腾讯科技(深圳)有限公司 | 数据包抓取方法、终端、服务器和存储介质 |
CN110351156B (zh) * | 2018-04-03 | 2021-10-01 | 大唐移动通信设备有限公司 | 一种测试方法和装置 |
-
2021
- 2021-09-15 CN CN202111079311.8A patent/CN113535592B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN113535592A (zh) | 2021-10-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102945347B (zh) | 一种检测Android恶意软件的方法、系统及设备 | |
CN108984389B (zh) | 一种应用程序测试方法及终端设备 | |
CN109635523B (zh) | 应用程序检测方法、装置及计算机可读存储介质 | |
CN107436844B (zh) | 一种接口用例合集的生成方法及装置 | |
CN108667770B (zh) | 一种网站的漏洞测试方法、服务器及系统 | |
CN110096380B (zh) | Android内部通讯方法、系统、装置及存储介质 | |
CN107277019B (zh) | 数据明文获取方法、装置、电子终端及可读存储介质 | |
CN110598135A (zh) | 网络请求处理方法、装置、计算机可读介质及电子设备 | |
CN109492181A (zh) | 页面跳转方法、装置、计算机设备和存储介质 | |
CN110958221A (zh) | 动态检测xml外部实体注入漏洞的方法及装置 | |
CN111722935A (zh) | 页面端与原生端的通信方法、装置、电子设备及可读介质 | |
CN110609785A (zh) | 软件接口的测试方法及装置 | |
CN112667426A (zh) | 日志分析方法及装置 | |
CN111782988A (zh) | 确定应用程序来源的方法、装置、计算机系统和存储介质 | |
CN109725887B (zh) | 基于消息研发框架的数据交互方法、装置及终端设备 | |
CN108512889B (zh) | 一种基于http的应用响应推送方法及代理服务器 | |
CN113535592B (zh) | 对dpdk应用程序抓包的方法、装置、设备及存储介质 | |
KR101657667B1 (ko) | 악성 앱 분류 장치 및 악성 앱 분류 방법 | |
WO2021243555A1 (zh) | 一种快应用检测方法、装置、设备及存储介质 | |
CN112256557A (zh) | 程序回归测试方法、装置、系统、计算机设备及存储介质 | |
CN114531340A (zh) | 日志获取方法、装置、电子设备、芯片及存储介质 | |
CN111049795B (zh) | 分布式Web应用的敏感数据未加密漏洞的检测方法及装置 | |
CN113535593B (zh) | 应用程序的抓包方法、装置、电子设备和存储介质 | |
CN108288135B (zh) | 系统兼容方法及装置、计算机可读存储介质及电子设备 | |
CN112671615A (zh) | 前端用户操作行为数据的收集方法、系统及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |