CN118283148A - 一种跨平台应用层协议解析器自动生成方法及装置 - Google Patents

一种跨平台应用层协议解析器自动生成方法及装置 Download PDF

Info

Publication number
CN118283148A
CN118283148A CN202410714356.5A CN202410714356A CN118283148A CN 118283148 A CN118283148 A CN 118283148A CN 202410714356 A CN202410714356 A CN 202410714356A CN 118283148 A CN118283148 A CN 118283148A
Authority
CN
China
Prior art keywords
field
data
analysis
protocol
type
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.)
Granted
Application number
CN202410714356.5A
Other languages
English (en)
Other versions
CN118283148B (zh
Inventor
刘光杰
周思澈
翟江涛
王一斐
陈凯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University of Information Science and Technology
Original Assignee
Nanjing University of Information Science and Technology
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing University of Information Science and Technology filed Critical Nanjing University of Information Science and Technology
Priority to CN202410714356.5A priority Critical patent/CN118283148B/zh
Publication of CN118283148A publication Critical patent/CN118283148A/zh
Application granted granted Critical
Publication of CN118283148B publication Critical patent/CN118283148B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/22Parsing or analysis of headers
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/03Protocol definition or specification 
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • H04L69/322Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions
    • H04L69/329Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions in the application layer [OSI layer 7]

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种跨平台应用层协议解析器自动生成方法及装置。方法包括:定义协议中的所有消息类型、数据流转关系及消息内部字段,对特殊字段进行条件和分支解析的逻辑定义,并设置事件监听器;对规范文件进行词法、语法分析,生成反映协议解析逻辑的抽象语法树;对生成的抽象语法树的各个节点进行合法性审查;递归遍历检查后的抽象语法树并对节点应用转换逻辑,生成平台无关的中间表示;对生成的中间表示进行相关处理和优化,并映射为具有高性能的解析器C++源代码。本发明利用智能解析定义语言实现了一套完备的自动化处理流程,加强了对应用协议结构和解析逻辑的描述能力,显著提高了跨平台的应用协议解析器的开发效率和执行性能。

Description

一种跨平台应用层协议解析器自动生成方法及装置
技术领域
本发明涉及网络数据解析技术领域,具体涉及一种跨平台应用层协议解析器自动生成方法及装置。
背景技术
随着计算机网络的快速发展和日益复杂化,网络应用层协议的多样性和复杂度也在不断增加。应用层协议作为网络通信中的关键组成部分,其正确性、高效性和安全性对网络服务的稳定性和安全性至关重要。在此背景下,对应用层协议进行有效的解析和处理成为了网络管理和安全监控中的一个重要任务。
传统上,应用层协议解析器的开发通常依赖于手工编码的方式,不仅耗时耗力,而且随着协议规范的更新和新协议的出现,需要频繁进行手动更新和维护,极大地增加了开发和维护的成本。此外,手工编码方法很难保证解析器的准确性和效率,尤其是在面对复杂或者不断变化的协议规范时,容易出现解析错误或遗漏,影响网络服务的质量和安全。如Wireshark集成了数百个用C语言手动编写的解析器,并且在手动编写解析器中出现的错误突显了编写准确、高效又内存安全的解析代码的困难,暴露了即使是最先进的网络安全工具也可能因解析器的脆弱性受到威胁。
在现有技术中,虽然有一些工具和方法试图通过自动化手段来生成协议解析器,以减少手动编码的工作量和提高开发效率,但这些方法往往局限于特定的协议或者只能处理较为简单的协议结构和解析逻辑,且规范代码相对复杂。如发明“一种基于自定义协议描述语言的网络流量还原方法(公开号:CN116016345A)”,公开了一种使用自定义协议描述语言定义协议结构和字段,再构建上、下层级协议的关联关系,根据标准网络流匹配对应的协议模版从而实现解析的方法。该发明的协议描述语言只能描述所要解析的网络协议的结构和内部字段,而无法实现对解析流程的精细控制,难以应对复杂多样的应用层协议,同时,逐行解析协议描述来生成协议解析器在处理复杂或动态变化的协议场景时显示出了很大的局限性,并且生成解析器的解析效率也不高。发明“基于形式语言协议的网络数据解析方法、装置及存储介质(公告号:CN112714044B)”,公开了一种使用形式语言描述网络协议解析过程,再将其转换为可执行代码的方法。该发明采用的形式语言未对应用层协议进行专门的抽象设计,因此使用这种形式语言描述应用层协议过程依然复杂且繁琐。开发人员在使用此方法开发新的解析器之前,需要先行学习相关的开发技巧,这不仅增加了学习成本,也不利于快速开发和部署新的解析器,难以满足迅速适应多变网络环境的需求。
因此,有必要对现有技术加以改进,提出一种新的应用层协议解析器生成方法,简化解析器开发流程。
发明内容
发明目的:本发明的目的是提供一种跨平台应用层协议解析器自动生成方法及装置,解决现有技术中开发应用层解析器效率低下、工作量大、可扩展性差的问题,本发明可以在完整描述协议结构和解析逻辑的同时,大幅简化开发新的或快速更新现有应用层解析器的过程。
技术方案:第一方面,本发明提供一种跨平台应用层协议解析器自动生成方法,包括以下步骤:
S1:定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;
S2:对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;
S3:对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;
S4:递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;
S5:对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码。
进一步的,所述步骤S1包括:
S101:梳理并确定协议中所包含的所有消息类型,利用智能解析定义语言定义所有消息类型,并描述各消息类型之间的数据流转关系;
S102:针对每种消息类型逐一定义所包含的字段,为每个字段指派一个明确的标识符和在该字段在消息中的序列位置;
S103:基于字段在协议中承载的数据性质与格式,为每个字段指定数据类型,接着根据字段的具体解析需求和预期的解析行为,为每个字段配置字段属性;
S104:对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,对解析流程的指定节点设置解析事件监听器,最终得到基于规范语言的解析器规范文件。
进一步的,所述智能解析定义语言通过静态协议描述和动态解析行为,实现对应用协议结构的描述与解析流程控制,包括:
(1)解析器头部定义:通过protocol关键字在每个规范语言文件开头定义一个新的协议解析器,标志着协议规范文件的开始,并为其命名;
(2)消息类型定义:通过message关键字定义协议中的消息类型,每种消息类型代表协议中的一个数据包或消息结构,包含基础数据类型和/或复杂数据类型;
基础数据类型包括:比特、位域、字节、地址、整数、浮点数、布尔值、字符串;
复杂数据类型包括:
结构体Struct:通过Struct关键字将多个不同类型的字段组合为一个单一的逻辑单元;
枚举Enum:通过Enum关键字定义一组命名常量;
(3)字段属性:通过在字段定义中直接指定相应的属性参数来实现支持对网络协议字段的细粒度解析控制,包括:
&ByteOrder:字节顺序属性,用于标识处理输入数据的顺序,默认情况下为网络字节顺序,其中&是标识符,表示这是一个字段属性;
&Requires:字段约束属性,用于为字段的解析添加后置条件,通过对布尔表达式进行判断,若返回false,解析过程将中止并返回错误;
&Size:规定接受字段大小属性,用于指定处理的原始字节数,并且该属性的优先级高于其他控制解析属性;
&MaxSize:限制字段最大输入属性,用于设置字段接收的数据大小上限,如果在解析过程中消耗了超过预设大小的字节数,则发生错误,并且该属性的优先级高于其他控制解析属性;
&Anoymous:匿名属性,用于将字段变为匿名字段,字段调用该属性后,虽然参与解析,但不会在解析完成后存储结果,仅在解析中引用该字段解析的值;
&Skip:跳过属性,该字段配合属性&Size使用,即跳过规定大小的数据,不参与解析;
&Convert:动态类型转换属性,字段使用该属性来转换刚刚被解析的值,然后将其存储为字段的最终值;
(4)解析流程控制,包括:
条件解析和switch分支解析:条件解析通过字段添加if (COND)子句来实现条件性解析,COND是一个布尔表达式,当布尔表达式在字段解析时刻评估为真时,字段才对被解析;switch分支解析通过计算switch表达式的值,如果结果匹配,则继续分析相应的字段;
解析事件监听器:通过设置一系列指定的代码块,在解析过程中的某个事件触发,实现对解析流程的更细致管理,监听器事件具体包括:event.int() {···}表示在解析开始之前执行,event.done() {···}表示在解析完成后执行,event.error(){···}表示在遇到错误时执行,event.<field name>{···}表示在解析完指定字段field name后执行,解析后的值通过$访问,使解析结果能够立即被处理或验证;当为同一个事件定义了多个监听器时,按照设定顺序逐一执行;
(5)数据流管理,包括:
解析域机制,适用于需要在解析过程中保留信息的场景,用于在解析不同消息类型时共享和传递信息,此时将上下文视作一个被“保护”的全局变量,能够在解析过程的任意点被初始化、修改或引用,从而实现对解析逻辑的动态调整。
进一步的,所述步骤S3包括:
S301:基于静态类型系统,根据字段声明的类型信息及其预期操作进行类型推断,针对每一项操作执行类型兼容性检查,确认操作字段与字段类型的匹配性,若发生不匹配的操作,则报告错误;
S302:基于协议字段的属性规范集,利用预定义的字段可用属性集对每个字段的属性声明进行审查,使得每项属性值均位于规定的范围内,若检测到属性值超出预定范围,则报告错误;
S303:检查协议描述中各字段之间的逻辑和数据依赖关系是否被正确反映,识别并确认所有直接或间接的字段依赖,并校验依赖字段的值是否已在使用前正确设置,若依赖关系未按预期实现或与协议规范不符,则报告错误;
S304:通过建立全局标识符表,记录所有标识符的声明信息,检查每个标识符的使用是否均能够被引用到一个有效的声明,当遇到一个标识符引用时,将其与声明信息进行匹配和绑定,如果无法找到相应的声明或存在多个声明冲突,则报告错误。
进一步的,所述步骤S4中,针对数据类型映射,若类型为位域,确定其大小和边界,映射至其所在的最小可寻址存储字节,并实现对位域的位运算支持;若类型为字节,直接识别并映射字节类型字段;若类型为地址,确定地址类型,将IPv4地址映射为32位数值类型,IPv6地址映射为128位数值类型;若类型为整数或浮点数,根据字段的位数和有无符号,将整数映射到相应数值类型,将浮点数数字段映射至遵循IEEE 754标准的浮点类型;若类型为布尔值,映射为单比特,但仍存储在一个完整字节中;若类型为字符串,将字符串中的每个字符转换成UTF-8编码,确定转换后的总长度,包括所有字符的UTF-8编码总和,存储到内存空间中;若类型为结构体,为其分配连续内存空间,并映射内部成员至底层类型;若类型为枚举,将枚举的每个值映射为连续的整数序列或根据赋值自定义映射逻辑,根据枚举值的范围选择最小的底层整数类型;
针对字段属性映射,对于字节顺序属性&ByteOrder,确定协议解析器运行系统的字节顺序,根据指定的属性判断字节顺序是否需要转换,若是,将原始数据分割为单个字节,按照反转的顺序重新组合这些字节,最后将重排后的字节组合回一个整体;对于字段约束属性&Requires,根据协议规范解析出字段的值,判断解析出的值是否满足约束条件,若是,将数据存储到相应的数据结构中,若不是,跳过存储过程,记录错误信息并抛出异常;对于字段大小属性&Size、&MaxSize,根据字段属性确定字段的大小或限制,在解析数据时,对于流式数据,追踪已接受数据的累积大小,对于一次性读取的数据,检查数据块的总大小,判断其是否在允许范围内,若是,继续正常数据处理流程,若不是,拒绝接收数据,记录错误信息并抛出异常;对于匿名属性&Anoymous,按照定义的数据类型和格式从输入流中读取和解析数据,检查是否有对字段的临时操作,对临时操作进行处理,解析结果不进行存储;对于跳过属性&Skip,遇到标记为跳过的字段时,解析器移动数据指针跳过指定大小的数据块,不进行任何解析或处理;对于动态类型转化属性&Convert,解析出字段的原始值,根据动态类型转换属性指定的目标类型调用转换函数生成新的数据表示,并将数据表示存储到数据结构中;
针对解析流程控制映射,对于条件解析,基于抽象化的控制流图CFG构建,每个条件判断节点在CFG中形成一个分支点,每个分支对应不同的执行路径,对于分支解析,基于多路分支的决策树构建,每个分支结构转换为一系列条件检查与相应的跳转指令,使得在满足指定条件时能够跳转到正确的代码段执行;对于解析事件监听器,遵循事件驱动模型的转换原则,抽象语法树中事件监听器节点被抽象为中间代码的一组事件处理函数,通过建立一个事件绑定与触发机制,使得在事件发生时能够自动调用与其关联的事件处理逻辑;
针对数据流管理映射,识别每个变量的定义和使用点,构建变量的作用域和声明周期,生成代码时将插入数据存储和访问指令,使得数据在需要时可用,且在不再需要时释放,优化内存使用;上下文信息基于封装和继承原则,通过定义包含上下文信息的数据结构,并将这些结构作为参数传递给需要的函数或方法,实现上下文信息在解析过程中的传递与维护;状态管理基于有限状态机模型,每个状态都映射为中间代码中的一个变量,状态转换逻辑通过在满足指定条件时更新变量的值,从而在解析过程中动态地改变解析行为。
进一步的,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化包括:分析中间表示IR中的操作序列,将多个连续且独立的操作合并成单一符合操作,实现连续操作指令;通过静态分析工具检测未被任何其他代码引用的函数和变量,并将这些代码移除;对调用次数超过指定次数或体积小于指定大小的函数进行内联处理,在调用点直接替换为函数体内容;对全局变量和常量进行重新编号,根据访问频率和依赖关系优化在其内存的布局。
进一步的,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码,具体包含:
从优化后的中间表示中提取出定义的所有数据结构,转换成C++中的类;根据中间表示中描述的算法和过程,实现相应的C++函数;并采用C++的资源管理技术,确保程序的健壮性和安全性,通过构建错误处理机制,提高代码的健壮性。
第二方面,本发明提供一种跨平台应用层协议解析器自动生成装置,包括:
协议规范定义模块,定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;
抽象语法树构建模块,对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;
合法性检查模块,对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;
逻辑转换模块,递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;
解析器生成模块,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合高性能要求的C++解析器源代码。
第三方面,本发明还提供一种计算机设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如本发明第一方面所述的跨平台应用层协议解析器自动生成方法的步骤。
第四方面,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如本发明第一方面所述的跨平台应用层协议解析器自动生成方法的步骤。
与现有技术相比,本发明的有益效果为:
(1)本发明构建的智能解析定义语言不局限于特定类型或格式的应用层协议,通过定义应用协议的结构和解析逻辑,能够快速准确地描述协议结构信息和字段属性信息,并精准控制解析流程。同时通过对新增协议使用该语言进行定义,能够快速扩展对其流量解析的支持,具有较强的可扩展和灵活性,为应用流量解析及基于协议解析的网络安全检测和情报侦察提供了强有力的支持。
(2)本发明实现了一套完备的自动化处理流程,实现从规范定义到C++代码的全自动转换,大幅简化了解析器的开发过程,缩短了从协议定义到解析器实现的开发周期。
(3)本发明生成的C++代码遵循ISO C++标准,无需依赖特定平台或系统的API,因此可以在任何支持C++编译器的操作系统上编译和运行,如Windows、Linux、macOS等。同时,生成的解析器代码可以轻松的集成到任何已有的主机应用程序中,或与其他系统组件协同工作,如嵌入到网络监控、安全检测和流量分析等系统中。
(4)本发明通过协议规范自动生成代码,减少了手动编码过程中可能引入的人为错误。在生成代码的过程中,集成了函数内联、合并指令、常量变量编号等优化技术,提升了解析器运行时的效率和降低了资源消耗。
附图说明
图1为本发明实施例中跨平台应用层协议解析器自动生成方法流程图;
图2为本发明的智能解析定义语言关键组成部分示意图;
图3为本发明的智能解析定义语言字段类型和属性配置示意图;
图4为本发明的基于智能解析语言的解析器规范文件到具有高性能的解析器C++源代码生成过程图。
具体实施方式
下面将结合附图对本发明实施例中的技术方案进行清楚、完整的描述。
在网络流量分析和网络安全领域,实时监控和解析应用层协议是保障网络安全性和功能性的关键。随着新的通信技术和协议的迅速发展,传统的网络监控系统常常面临无法识别或解析新出现的未知协议的问题。这种情况下,需要迅速开发并部署新的解析器以支持对这些协议的解析和理解,此过程要求解析器开发不仅要快速、准确,还必须能够无缝集成进现有的系统中。通过本发明提供的一种跨平台应用层协议解析器自动生成方法,用户可以快速定义新的应用层协议解析器规范文件,并利用工具链将规范文件转换成高效且安全的C++解析器源代码。最后,将自动生成的解析器代码通过标准化的API集成到网络流量分析系统中,与现有的解析器协同工作。
参照图1,本发明提供的一种跨平台应用层协议解析器自动生成方法,包括以下步骤:
S1:利用智能解析定义语言定义协议中所有消息类型及其数据流转关系,并为每种消息类型详细定义字段(包括标识符、数据类型、字段属性),针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,同时设置关键事件的监听器,最终得到基于该语言的协议解析器文件。
S2:使用有限状态机(Finite State Machine, FSM)策略来解析协议解析器文件,将文本按照预定的规则分解为一组专门设计的协议词法单元(Protocol Tokens),并从Protocol Tokens序列中逐个提取,利用递归下降方法构建出反映原始解析逻辑和协议结构的抽象语法树(Abstract Syntax Tree, AST)。
S3:对S2步骤构建的抽象语法树内部各节点进行合法性审查,确保所有字段类型正确,字段属性符合规则,并检查不同字段之间的依赖关系是否建立,验证每个标识符的引用与其声明是否正确绑定,保证引用结构整体一致。
S4:递归遍历S3步骤检查后的抽象语法树,对于每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示(Intermediate Representation, IR)。
S5:对S4步骤生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合高性能要求的C++解析器源代码。
本发明在步骤S1中利用智能解析定义语言来规范对协议的定义。该智能解析定义语言通过静态协议描述和动态解析行为,实现对应用协议结构的精确描述与解析流程控制,是通过分析各种应用协议的消息结构,以及在实际解析工作中涉及到的需求而设计的。
如图2所示,本发明使用的智能解析定义语言具体包含:
(1)解析器头部
协议 (Protocol):使用protocol关键字在每个规范语言文件开头定义一个新的协议解析器,标志着协议规范文件的开始,并为其命名。
(2)消息类型
消息 (Message):用于定义协议中的消息类型,每种消息类型代表协议中的一个数据包或消息结构。消息类型作为构建协议规范的核心详细规定了消息的具体结构,可以包含基础数据类型或更复杂的数据类型。
本发明使用message关键字来定义消息类型,message代表协议的最外层结构,里面包含了各种不同的消息类型,例如下面是一个DNS协议的定义部分:
message DNSMessage {
Header header;
Question questions[];
ResourceRecord answers[];
ResourceRecord authorityRecords[];
ResourceRecord additionalRecords[];
}
struct Header {
int ID;
bit(1) QR;
bit(4) OPCODE;
bit(1) AA;
bit(1) TC;
bit(1) RD;
bit(1) RA;
bit(3) Z;
bit(4) RCODE;
int QDCOUNT;
int ANCOUNT;
int NSCOUNT;
int ARCOUNT;
}
}
这个例子中利用message关键字首先定义了DNS的协议结构,分别包含头部,问题等等(每一种小的消息类型都是自定义的,为结构体类型),接下来再具体定义Header头部结构,Message可以包含各种数据类型,但在实际使用中,大部分包含的是根据协议自定义的结构体类型。
(3)数据类型
基础数据类型
比特 (bit):表示二进制的0或1,用于标志位。
位域 (bitfield):一组连续比特,表示更复杂的字段信息。
字节 (Bytes):由8比特组成,是存储字符或数据类型的基本单位。
地址 (address):用于存储网络地址信息,支持IPv4或IPv6格式。
整数:包括int8、int16、int32、int64及无符号版本,用于表示范围内的整数值。
浮点数 (double):表示有小数部分的实数。
布尔值 (bool):表示逻辑值true或false,用于控制决策和条件判断。
字符串 (string):字符序列,用于表示文本数据,支持ASCII或UTF-8编码方式。
复杂数据类型
结构体 (Struct):使用Struct关键字将多个不同类型的字段组合为一个单一的逻辑单元,例如消息头等。
枚举 (Enum):使用Enum关键字定义一组命名常量,例如表示状态码、错误代码等。
(4) 字段属性
为了支持对网络协议字段的细粒度解析控制,本语言设计了一套综合字段属性集,通过在字段定义中直接指定相应的属性参数来实现,分别为:
&ByteOrder:字节顺序属性,默认情况下以网络字节顺序表示,即大端序,根据解析需求可以通过该属性控制解析器以小端序处理输入数据。其中&是标识符,表示这是一个字段属性。
&Requires:字段约束属性,通过该属性为字段的解析添加后置条件,通过对布尔表达式进行判断,若返回false,解析过程将中止并返回错误。
&Size:规定接受字段大小属性,该属性指定处理的原始字节数,并且该属性的优先级高于其他控制解析属性。
&MaxSize:限制字段最大输入属性,该属性对字段接收的数据大小设置上限,如果在解析过程中消耗了超过预设大小的字节数,则发生错误,并且该属性的优先级高于其他控制解析属性。
&Anoymous:匿名属性,调用该属性后字段将成为匿名字段,虽然可以参与解析,但不会在解析完成后存储结果,仅可以在解析中引用该字段解析的值。
&Skip:跳过属性,该字段配合属性&Size使用,即跳过规定大小的数据,不参与解析。
&Convert:动态类型转换属性,字段可以使用该属性来转换刚刚被解析的值,然后将其存储为字段的最终值。
(5) 解析流程控制
条件解析和switch分支解析:条件解析通过字段添加if (COND)子句来实现条件性解析,COND是一个布尔表达式,当布尔表达式在字段解析时刻评估为真时,字段才对被解析;switch分支解析通过计算switch表达式的值,如果结果匹配,则继续分析相应的字段。
解析事件监听器(Parsing Event Listeners,PEL):通过设置一系列指定的代码块,在解析过程中的某个事件触发,实现对解析流程的更细致管理。监听器事件具体包括:event.int() {···} 表示在解析开始之前执行,event.done() {···} 表示在解析完成后执行,event.error() {···} 表示在遇到错误时执行,event.<field name>{···} 表示在解析完指定字段field name后执行,解析后的值可以通过$访问,使解析结果可以立即被处理或验证。当为同一个事件定义了多个监听器时,将按照设定顺序逐一执行。
(6) 数据流管理
解析域机制,适用于需要在解析过程中保留信息的场景,例如需要将请求端和响应端的数据关联起来的双向协议,该机制可以在解析不同消息类型时共享和传递信息,具体而言,上下文类似一个被“保护”的全局变量,能够在解析过程的任意点被初始化、修改或引用,从而实现对解析逻辑的动态调整。
所述步骤S1中具体包括以下步骤:
S101:梳理并确定协议中所包含的所有消息类型,利用解析器规范语言定义所有消息类型,并描述各消息类型之间的数据流转关系。
S102:针对每种消息类型逐一定义所包含的字段,为每个字段指派一个明确的标识符和在该字段在消息中的序列位置。
S103:基于字段在协议中承载的数据性质与格式,为每个字段指定数据类型,接着根据字段的具体解析需求和预期的解析行为,为每个字段配置字段属性。如图3所示,展示了智能解析定义语言中字段类型和属性配置的两个示例,例1表示一个名为 version 的字段,其数据类型为 uint32,即无符号的32位整数,属性&Byteorder=Little指定了这个字段的字节顺序是小端序;例2表示一个名为 x 的字段,其数据类型为 int8,即有符号的8位整数,属性&Requires=($<5)设置了一个解析时必须满足的条件,具体为字段 x 的值必须小于5($ 是一个占位符,代表 x 字段本身的值)。
S104:对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,对解析流程的特定节点设置解析事件监听器,最终得到基于规范语言的解析器文件。
如图4所示,在得到基于智能解析语言的协议解析器文件之后,通过工具链将其转换为具有高性能的解析器C++源代码。
在所述步骤S2中,通过词法分析、语法分析建立AST是编译流程中前端的一个常见步骤,在实际实现中,可以利用ANTLR、Flex/Bison等工具来自动化生成词法、语法解析器(本发明实施例中是用ANTLR生成的),然后可以用生成的解析器对输入文件进行解析,得到AST。该实现方法是现有技术,且不是本发明的重点,此处不再赘述。但需要指出的是,AST只是反映了输入文件的结构,而下一步中的合法性检查并不是检查树节点之间的结构关系,而是检查输入文件中使用者定义协议的正确性(逻辑关系),所以步骤S3合法性检查可以理解成是在步骤S2的抽象语法树AST的形式上检查步骤S1中定义的解析器文件是否合法。
所述S3步骤中,对抽象语法树的合法性检查具体包括以下步骤:
S301:基于静态类型系统,根据字段声明的类型信息及其预期操作进行类型推断,针对每一项操作执行类型兼容性检查,确认操作字段与字段类型的匹配性。若发生不匹配的操作,系统将报告错误。例如在定义“int16 count”字段后,可以进行“count + 1”等操作,但若将count与一个名为name的字符串类型字段拼接“count + name”,系统将报告错误。
S302:基于协议字段的属性规范集,利用预定义的字段可用属性集对每个字段的属性声明进行审查,确保每项属性值均位于规定的范围内。若检测到属性值超出预定范围,系统将报告错误。例如对一个string类型的字段使用大小端字段属性,系统将报告错误。
S303:确保协议描述中各字段之间的逻辑和数据依赖关系被正确反映,识别并确认所有直接或间接的字段依赖,并校验依赖字段的值是否已在使用前正确设置。若依赖关系未按预期实现或与协议规范不符,系统将报告错误。例如字段 byte[dataLength] data中,dataLengh若未在该字段前定义并成功解析,或者dataLength的类型不为int,系统会报告错误。
S304:通过建立全局标识符表,记录所有标识符的声明信息来确保每个标识符的使用均可引用到一个有效的声明,当遇到一个标识符引用时,将其与声明信息进行匹配和绑定。如果无法找到相应的声明或存在多个声明冲突,系统将报告错误。例如在引用version变量时,没有在该作用域内找到version变量的声明,或者在该作用域内有多个不同类型的version声明,如“uint16 version”和“uint32 version”同时存在,会导致标识符冲突,系统将报告错误。
根据本发明的实施方式,所述S4步骤中,针对数据类型映射,若类型为位域,确定其大小和边界,映射至其所在的最小可寻址存储字节,并实现对位域的位运算(AND、OR、XOR)支持;位域是位的集合,对位域的映射规则实际上是对每一个位的映射,因此位和位域是一样的。若类型为字节,直接识别并映射字节类型字段;若类型为地址,确定地址类型,将IPv4地址映射为32位数值类型,IPv6地址映射为128位数值类型;若类型为整数或浮点数,根据字段的位数和有无符号,将整数映射到相应数值类型,将浮点数数字段映射至遵循IEEE 754标准的浮点类型;若类型为布尔值,映射为单比特,但仍存储在一个完整字节中;若类型为字符串,将字符串中的每个字符转换成UTF-8编码,确定转换后的总长度,包括所有字符的UTF-8编码总和,存储到足够的内存空间中;若类型为结构体,为其分配连续内存空间,并映射内部成员至底层类型;若类型为枚举,将枚举的每个值映射为连续的整数序列或根据赋值自定义映射逻辑,根据枚举值的范围选择最小的底层整数类型。
针对字段属性映射,对于字节顺序属性&ByteOrder,确定协议解析器运行系统的字节顺序,根据指定的属性判断字节顺序是否需要转换,若是,将原始数据分割为单个字节,按照反转的顺序重新组合这些字节,最后将重排后的字节组合回一个整体;对于字段约束属性&Requires,根据协议规范解析出字段的值,判断解析出的值是否满足约束条件,若是,将数据存储到相应的数据结构中,若不是,跳过存储过程,记录错误信息并抛出异常;对于字段大小属性&Size、&MaxSize,根据字段属性确定字段的大小或限制,在解析数据时,对于流式数据,追踪已接受数据的累积大小,对于一次性读取的数据,检查数据块的总大小,判断其是否在允许范围内,若是,继续正常数据处理流程,若不是,拒绝接收数据,记录错误信息并抛出异常;对于匿名属性&Anoymous,按照定义的数据类型和格式从输入流中读取和解析数据,检查是否有对该字段的临时操作,例如作为其他字段的判断依据等,对临时操作进行处理,最后不将解析结果进行存储;对于跳过属性&Skip,遇到标记为跳过的字段时,解析器移动数据指针跳过指定大小的数据块,不进行任何解析或处理;对于动态类型转化属性&Convert,解析出字段的原始值,根据动态类型转换属性指定的目标类型调用转换函数生成新的数据表示,并将数据表示存储到数据结构中。
针对解析流程控制映射,对于条件解析,基于抽象化的控制流图(CFG)构建,每个条件判断节点在CFG中形成一个分支点,每个分支对应不同的执行路径,对于分支解析,基于多路分支的决策树构建,每个分支结构转换为一系列条件检查与相应的跳转指令,确保在满足特定条件时能跳转到正确的代码段执行;对于解析事件监听器,遵循事件驱动模型的转换原则,抽象语法树中事件监听器节点被抽象为中间代码的一组特定事件处理函数,通过建立一个事件绑定与触发机制,确保在特定事件发生时能够自动调用与其关联的事件处理逻辑。
针对数据流管理映射,识别每个变量的定义(Def)和使用(Use)点,构建变量的作用域和声明周期,生成代码时将插入相应的数据存储和访问指令,确保数据在需要时可用,并在不再需要时释放,优化内存使用;上下文信息基于封装和继承原则,通过定义包含上下文信息的数据结构,并将这些结构作为参数传递给需要的函数或方法,实现上下文信息在解析过程中的传递与维护;状态管理基于有限状态机模型,每个状态都映射为中间代码中的一个变量,状态转换逻辑通过在满足特定条件时更新变量的值,从而在解析过程中动态地改变解析行为。
为了对本发明的映射规则有更清楚的了解,下面列举几个场景进一步阐述其数据处理机制是如何实现的。应当理解,以下所列举的场景仅是示例的作用,而不是对本发明的限制。本领域技术人员依据以上所述的转换方法的描述,能够实现相应数据类型、属性字段、解析流程控制和数据流管理的映射。
场景一:在解析应用层协议头部时,其中包含一个位域来标识不同的控制信息,并且整个头部使用小端序。实现方法为;利用逻辑操作提取特定位,判断系统是否使用的是小端序,若不是,则需要转换这些字节到小端序。生成的中间表示如下:
define void @parseHeader(i32 %header) {
// 假设header是一个32位整数,但需要处理为小端序
%header_le = call i32 @llvm.bswap.i32(i32 %header)
%flag = and i32 %header_le, 255 ; 提取低8位
// 根据flag的值进行不同处理
...
}
declare i32 @llvm.bswap.i32(i32)
场景二:在解析一个数据包时,其中某个字段的大小有最大值限制,如果超出这个大小,需要记录错误并中断处理。实现方法为:检查字段大小是否超出限制,如果大小不符合,记录错误并推出解析。生成的中间表示如下:
define void @parseData(i32 %dataSize, i8* %data) {
// 假设最大大小为1024
%max_size = icmp sgt i32 %dataSize, 1024
br i1 %max_size, label %error, label %continue
error:
// 处理错误逻辑
call void @logError("Data size exceeds maximum limit")
ret void
continue:
// 继续解析数据
...
}
declare void @logError(i8*)
场景三:在一个复杂的应用层解析任务中,根据不同的解析阶段(状态)来决定下一步的动作,并在特定解析完成后触发相应的事件。实现方法为:使用变量来跟踪解析器的状态,在解析特定字段后,触发并调用事件处理函数。生成的中间表示如下:
define void @parseProtocol(i32 %state, i8* %packet) {
switch i32 %state, label %default [
i32 0, label %parseHeader
i32 1, label %parseBody
]
parseHeader:
// 解析头部
call void @eventHeaderParsed()
br label %exit
parseBody:
// 解析主体
call void @eventBodyParsed()
br label %exit
default:
// 默认处理
br label %exit
exit:
ret void
}
declare void @eventHeaderParsed()
declare void @eventBodyParsed()
根据本发明的实施方式,步骤S5中,优化中间表示具体包括:分析IR中的操作序列,将多个连续且独立的操作(如算术操作、逻辑操作)合并成单一符合操作,实现连续操作指令;通过静态分析工具检测未被任何其他代码引用的函数和变量,并将这些代码移除;对频繁调用或体积小的函数进行内联处理,在调用点直接替换为函数体内容;对全局变量和常量进行重新编号,根据访问频率和依赖关系优化在其内存的布局。
将优化后的IR转换成高性能的C++代码,具体包含:
从IR中提取出定义的所有数据结构,转换成C++中的类,包括:对每个数据结构进行详细分析,确定其成员变量以及类型(如整数、浮点数、字符串等),对于复杂的数据结构,使用标准模版库(STL)如std::vector,std::map等进行实现,确保所有的数据结构都能通过构造函数、析构函数以及必要的管理函数(如复制构造函数、赋值运算符等)正确管理其声明周期。
根据IR中描述的算法和过程,实现相应的C++函数,创建函数原型和定义,确保函数的输入输出与IR中的描述一致,实现核心算法和逻辑处理,包括数据的解析、转换和验证等,对于特定的操作,比如加密、压缩、校验等,利用现有的C++库或API实现以保证效率和安全。
采用C++的资源管理技术,确保程序的健壮性和安全性,使用智能指针如 std::unique_ptr 和 std::shared_ptr 来管理动态分配的资源,防止内存泄漏,利用RAII(Resource Acquisition Is Initialization)原则,确保通过对象的生命周期自动管理资源,如文件句柄、网络连接、锁等。
构建全面的错误处理机制,提高代码的健壮性,使用异常处理来捕获和处理可能发生的错误,如输入数据格式不正确、资源访问失败等,定义错误码和错误信息,为上层应用提供足够的错误上下文,在关键的处理流程中加入错误检查逻辑,确保在任何阶段发生错误时都能安全退出并释放资源。
本发明设计了一套智能解析定义语言和完备的自动化处理流程,加强了对应用协议结构和解析逻辑的描述能力,显著提高了应用协议解析器的生成效率和执行性能,为应用流量解析及基于协议解析的网络安全检测和情报侦察提供了强有力的支持。
基于和方法实施例同样的技术构思,本发明还提供一种跨平台应用层协议解析器自动生成装置,包括:
协议规范定义模块,定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;
抽象语法树构建模块,对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;
合法性检查模块,对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;
逻辑转换模块,递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;
解析器生成模块,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合高性能要求的C++解析器源代码。
应理解,本发明实施例中的跨平台应用层协议解析器自动生成装置可以实现上述方法实施例中的全部技术方案,其各个功能模块的功能可以根据上述方法实施例中的方法具体实现,其具体实现过程可参照上述实施例中的相关描述,此处不再赘述。
本发明还提供一种计算机设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如上所述的跨平台应用层协议解析器自动生成方法的步骤。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的跨平台应用层协议解析器自动生成方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、装置(系统)、计算机设备或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法的流程图来描述的。应理解可由计算机程序指令实现流程图中的每一流程以及流程图中的流程的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程中指定的功能的步骤。

Claims (10)

1.一种跨平台应用层协议解析器自动生成方法,其特征在于,包括以下步骤:
S1:定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;
S2:对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;
S3:对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;
S4:递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;
S5:对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码。
2.根据权利要求1所述的方法,其特征在于,所述步骤S1包括:
S101:梳理并确定协议中所包含的所有消息类型,利用智能解析定义语言定义所有消息类型,并描述各消息类型之间的数据流转关系;
S102:针对每种消息类型逐一定义所包含的字段,为每个字段指派一个明确的标识符和在该字段在消息中的序列位置;
S103:基于字段在协议中承载的数据性质与格式,为每个字段指定数据类型,接着根据字段的具体解析需求和预期的解析行为,为每个字段配置字段属性;
S104:对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,对解析流程的指定节点设置解析事件监听器,最终得到基于规范语言的解析器规范文件。
3.根据权利要求2所述的方法,其特征在于,所述智能解析定义语言通过静态协议描述和动态解析行为,实现对应用协议结构的描述与解析流程控制,包括:
(1)解析器头部定义:通过protocol关键字在每个规范语言文件开头定义一个新的协议解析器,标志着协议规范文件的开始,并为其命名;
(2)消息类型定义:通过message关键字定义协议中的消息类型,每种消息类型代表协议中的一个数据包或消息结构,包含基础数据类型和/或复杂数据类型;
基础数据类型包括:比特、位域、字节、地址、整数、浮点数、布尔值、字符串;
复杂数据类型包括:
结构体Struct:通过Struct关键字将多个不同类型的字段组合为一个单一的逻辑单元;
枚举Enum:通过Enum关键字定义一组命名常量;
(3)字段属性:通过在字段定义中直接指定相应的属性参数来实现支持对网络协议字段的细粒度解析控制,包括:
&ByteOrder:字节顺序属性,用于标识处理输入数据的顺序,默认情况下为网络字节顺序,其中&是标识符,表示这是一个字段属性;
&Requires:字段约束属性,用于为字段的解析添加后置条件,通过对布尔表达式进行判断,若返回false,解析过程将中止并返回错误;
&Size:规定接受字段大小属性,用于指定处理的原始字节数,并且该属性的优先级高于其他控制解析属性;
&MaxSize:限制字段最大输入属性,用于设置字段接收的数据大小上限,如果在解析过程中消耗了超过预设大小的字节数,则发生错误,并且该属性的优先级高于其他控制解析属性;
&Anoymous:匿名属性,用于将字段变为匿名字段,字段调用该属性后,虽然参与解析,但不会在解析完成后存储结果,仅在解析中引用该字段解析的值;
&Skip:跳过属性,该字段配合属性&Size使用,即跳过规定大小的数据,不参与解析;
&Convert:动态类型转换属性,字段使用该属性来转换刚刚被解析的值,然后将其存储为字段的最终值;
(4)解析流程控制,包括:
条件解析和switch分支解析:条件解析通过字段添加if (COND)子句来实现条件性解析,COND是一个布尔表达式,当布尔表达式在字段解析时刻评估为真时,字段才对被解析;switch分支解析通过计算switch表达式的值,如果结果匹配,则继续分析相应的字段;
解析事件监听器:通过设置一系列指定的代码块,在解析过程中的某个事件触发,实现对解析流程的更细致管理,监听器事件具体包括:event.int() {···}表示在解析开始之前执行,event.done() {···}表示在解析完成后执行,event.error() {···}表示在遇到错误时执行,event.<field name> {···}表示在解析完指定字段field name后执行,解析后的值通过$访问,使解析结果能够立即被处理或验证;当为同一个事件定义了多个监听器时,按照设定顺序逐一执行;
(5)数据流管理,包括:
解析域机制,适用于需要在解析过程中保留信息的场景,用于在解析不同消息类型时共享和传递信息,此时将上下文视作一个被“保护”的全局变量,能够在解析过程的任意点被初始化、修改或引用,从而实现对解析逻辑的动态调整。
4.根据权利要求1所述的方法,其特征在于,所述步骤S3包括:
S301:基于静态类型系统,根据字段声明的类型信息及其预期操作进行类型推断,针对每一项操作执行类型兼容性检查,确认操作字段与字段类型的匹配性,若发生不匹配的操作,则报告错误;
S302:基于协议字段的属性规范集,利用预定义的字段可用属性集对每个字段的属性声明进行审查,使得每项属性值均位于规定的范围内,若检测到属性值超出预定范围,则报告错误;
S303:检查协议描述中各字段之间的逻辑和数据依赖关系是否被正确反映,识别并确认所有直接或间接的字段依赖,并校验依赖字段的值是否已在使用前正确设置,若依赖关系未按预期实现或与协议规范不符,则报告错误;
S304:通过建立全局标识符表,记录所有标识符的声明信息,检查每个标识符的使用是否均能够被引用到一个有效的声明,当遇到一个标识符引用时,将其与声明信息进行匹配和绑定,如果无法找到相应的声明或存在多个声明冲突,则报告错误。
5.根据权利要求1所述的方法,其特征在于,所述步骤S4中,针对数据类型映射,若类型为位域,确定其大小和边界,映射至其所在的最小可寻址存储字节,并实现对位域的位运算支持;若类型为字节,直接识别并映射字节类型字段;若类型为地址,确定地址类型,将IPv4地址映射为32位数值类型,IPv6地址映射为128位数值类型;若类型为整数或浮点数,根据字段的位数和有无符号,将整数映射到相应数值类型,将浮点数数字段映射至遵循IEEE754标准的浮点类型;若类型为布尔值,映射为单比特,但仍存储在一个完整字节中;若类型为字符串,将字符串中的每个字符转换成UTF-8编码,确定转换后的总长度,包括所有字符的UTF-8编码总和,存储到内存空间中;若类型为结构体,为其分配连续内存空间,并映射内部成员至底层类型;若类型为枚举,将枚举的每个值映射为连续的整数序列或根据赋值自定义映射逻辑,根据枚举值的范围选择最小的底层整数类型;
针对字段属性映射,对于字节顺序属性&ByteOrder,确定协议解析器运行系统的字节顺序,根据指定的属性判断字节顺序是否需要转换,若是,将原始数据分割为单个字节,按照反转的顺序重新组合这些字节,最后将重排后的字节组合回一个整体;对于字段约束属性&Requires,根据协议规范解析出字段的值,判断解析出的值是否满足约束条件,若是,将数据存储到相应的数据结构中,若不是,跳过存储过程,记录错误信息并抛出异常;对于字段大小属性&Size、&MaxSize,根据字段属性确定字段的大小或限制,在解析数据时,对于流式数据,追踪已接受数据的累积大小,对于一次性读取的数据,检查数据块的总大小,判断其是否在允许范围内,若是,继续正常数据处理流程,若不是,拒绝接收数据,记录错误信息并抛出异常;对于匿名属性&Anoymous,按照定义的数据类型和格式从输入流中读取和解析数据,检查是否有对字段的临时操作,对临时操作进行处理,解析结果不进行存储;对于跳过属性&Skip,遇到标记为跳过的字段时,解析器移动数据指针跳过指定大小的数据块,不进行任何解析或处理;对于动态类型转化属性&Convert,解析出字段的原始值,根据动态类型转换属性指定的目标类型调用转换函数生成新的数据表示,并将数据表示存储到数据结构中;
针对解析流程控制映射,对于条件解析,基于抽象化的控制流图CFG构建,每个条件判断节点在CFG中形成一个分支点,每个分支对应不同的执行路径,对于分支解析,基于多路分支的决策树构建,每个分支结构转换为一系列条件检查与相应的跳转指令,使得在满足指定条件时能够跳转到正确的代码段执行;对于解析事件监听器,遵循事件驱动模型的转换原则,抽象语法树中事件监听器节点被抽象为中间代码的一组事件处理函数,通过建立一个事件绑定与触发机制,使得在事件发生时能够自动调用与其关联的事件处理逻辑;
针对数据流管理映射,识别每个变量的定义和使用点,构建变量的作用域和声明周期,生成代码时将插入数据存储和访问指令,使得数据在需要时可用,且在不再需要时释放,优化内存使用;上下文信息基于封装和继承原则,通过定义包含上下文信息的数据结构,并将这些结构作为参数传递给需要的函数或方法,实现上下文信息在解析过程中的传递与维护;状态管理基于有限状态机模型,每个状态都映射为中间代码中的一个变量,状态转换逻辑通过在满足指定条件时更新变量的值,从而在解析过程中动态地改变解析行为。
6.根据权利要求1所述的方法,其特征在于,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化包括:分析中间表示IR中的操作序列,将多个连续且独立的操作合并成单一符合操作,实现连续操作指令;通过静态分析工具检测未被任何其他代码引用的函数和变量,并将这些代码移除;对调用次数超过指定次数或体积小于指定大小的函数进行内联处理,在调用点直接替换为函数体内容;对全局变量和常量进行重新编号,根据访问频率和依赖关系优化在其内存的布局。
7.根据权利要求1所述的方法,其特征在于,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合性能要求的C++解析器源代码,具体包含:
从优化后的中间表示中提取出定义的所有数据结构,转换成C++中的类;根据中间表示中描述的算法和过程,实现相应的C++函数;并采用C++的资源管理技术,确保程序的健壮性和安全性,通过构建错误处理机制,提高代码的健壮性。
8.一种跨平台应用层协议解析器自动生成装置,其特征在于,包括:
协议规范定义模块,定义协议中所有消息类型及其数据流转关系,并为每种消息类型定义内部字段,针对需要分支解析或条件解析的字段定义条件表达式或分支逻辑,并根据解析需要设置事件监听器,得到解析器规范文件;
抽象语法树构建模块,对解析器规范文件进行词法、语法分析,将文本按照预定的规则分解为一组协议词法单元,并从协议词法单元序列中逐个提取元素,利用递归下降方法构建出反映协议结构和原始解析逻辑的抽象语法树;
合法性检查模块,对生成的抽象语法树的各个节点进行合法性检查,包括字段类型是否正确,字段属性是否符合规则,不同字段之间的依赖关系是否正确建立,每个标识符的引用与其声明是否正确绑定,若发现错误则终止生成并输出错误信息;
逻辑转换模块,递归遍历合法性检查后的抽象语法树,并对每种节点类型实施转换逻辑,包括映射基础和复合数据类型、处理字段属性以及控制解析流程,从而得到一种平台无关的中间表示;
解析器生成模块,对生成的中间表示进行包括合并连续操作指令、移除未被调用或无影响的代码、函数内联替换和全局变量和常量重新编号的优化,将优化后的中间代码定义的数据结构和函数逻辑映射到C++类、方法和数据类型,嵌入解析逻辑、资源管理策略和错误处理逻辑,添加编译指令和环境配置信息,最后得到符合高性能要求的C++解析器源代码。
9.一种计算机设备,其特征在于,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如权利要求1-7中任一项所述的跨平台应用层协议解析器自动生成方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-7中任一项所述的跨平台应用层协议解析器自动生成方法的步骤。
CN202410714356.5A 2024-06-04 2024-06-04 一种跨平台应用层协议解析器自动生成方法及装置 Active CN118283148B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410714356.5A CN118283148B (zh) 2024-06-04 2024-06-04 一种跨平台应用层协议解析器自动生成方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410714356.5A CN118283148B (zh) 2024-06-04 2024-06-04 一种跨平台应用层协议解析器自动生成方法及装置

Publications (2)

Publication Number Publication Date
CN118283148A true CN118283148A (zh) 2024-07-02
CN118283148B CN118283148B (zh) 2024-08-06

Family

ID=91647142

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410714356.5A Active CN118283148B (zh) 2024-06-04 2024-06-04 一种跨平台应用层协议解析器自动生成方法及装置

Country Status (1)

Country Link
CN (1) CN118283148B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118484191A (zh) * 2024-07-16 2024-08-13 西安羚控电子科技有限公司 一种图形用户界面生成方法及装置

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2307529A1 (en) * 2000-03-29 2001-09-29 Pmc-Sierra, Inc. Method and apparatus for grammatical packet classifier
US20110030057A1 (en) * 2009-07-29 2011-02-03 Northwestern University Matching with a large vulnerability signature ruleset for high performance network defense
US20150309813A1 (en) * 2012-08-31 2015-10-29 iAppSecure Solutions Pvt. Ltd A System for analyzing applications in order to find security and quality issues
CN106713357A (zh) * 2017-01-24 2017-05-24 南京仁谷系统集成有限公司 一种通用的网络协议解析方法
CA3084966A1 (en) * 2016-12-07 2018-06-14 Charles NORTHRUP Thing machine systems and methods
CN113392112A (zh) * 2021-06-17 2021-09-14 中国工商银行股份有限公司 数据解析方法、数据解析装置、电子设备和存储介质
CN114513566A (zh) * 2022-02-17 2022-05-17 上海阅维科技股份有限公司 自定义网络协议解析方法、系统、介质及电子设备
CN114650163A (zh) * 2022-01-21 2022-06-21 中国人民解放军战略支援部队信息工程大学 面向有状态网络协议的模糊测试方法及系统
CN116954707A (zh) * 2023-06-30 2023-10-27 中国科学院信息工程研究所 基于字段符号表达式的工控协议逆向分析方法
CN117714562A (zh) * 2024-01-11 2024-03-15 山东省计算中心(国家超级计算济南中心) 一种网络通信协议语法信息的自动化提取方法及系统

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2307529A1 (en) * 2000-03-29 2001-09-29 Pmc-Sierra, Inc. Method and apparatus for grammatical packet classifier
US20110030057A1 (en) * 2009-07-29 2011-02-03 Northwestern University Matching with a large vulnerability signature ruleset for high performance network defense
US20150309813A1 (en) * 2012-08-31 2015-10-29 iAppSecure Solutions Pvt. Ltd A System for analyzing applications in order to find security and quality issues
CA3084966A1 (en) * 2016-12-07 2018-06-14 Charles NORTHRUP Thing machine systems and methods
CN106713357A (zh) * 2017-01-24 2017-05-24 南京仁谷系统集成有限公司 一种通用的网络协议解析方法
CN113392112A (zh) * 2021-06-17 2021-09-14 中国工商银行股份有限公司 数据解析方法、数据解析装置、电子设备和存储介质
CN114650163A (zh) * 2022-01-21 2022-06-21 中国人民解放军战略支援部队信息工程大学 面向有状态网络协议的模糊测试方法及系统
CN114513566A (zh) * 2022-02-17 2022-05-17 上海阅维科技股份有限公司 自定义网络协议解析方法、系统、介质及电子设备
CN116954707A (zh) * 2023-06-30 2023-10-27 中国科学院信息工程研究所 基于字段符号表达式的工控协议逆向分析方法
CN117714562A (zh) * 2024-01-11 2024-03-15 山东省计算中心(国家超级计算济南中心) 一种网络通信协议语法信息的自动化提取方法及系统

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
HAO LI等: ""Parsing Application Layer Protocol with Commodity Hardware for SDN "", 《2015 ACM/IEEE SYMPOSIUM ON ARCHITECTURES FOR NETWORKING AND COMMUNICATIONS SYSTEMS (ANCS)》, 31 December 2015 (2015-12-31) *
刘伟: ""应用编译原理实现基于文本编码通信协议消息的解析"", 《微型机与应用》, 30 May 2003 (2003-05-30) *
刘伟: "应用编译原理实现基于文本编码通信协议消息的解析", 微型机与应用, no. 04, 30 May 2003 (2003-05-30) *
翟江涛等: ""一种多源网络安全威胁情报采集与封装技术"", 《网络安全技术与应用》, 15 October 2018 (2018-10-15) *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118484191A (zh) * 2024-07-16 2024-08-13 西安羚控电子科技有限公司 一种图形用户界面生成方法及装置

Also Published As

Publication number Publication date
CN118283148B (zh) 2024-08-06

Similar Documents

Publication Publication Date Title
US9916146B2 (en) Software analysis framework
Bergmann et al. Incremental evaluation of model queries over EMF models
US7627861B2 (en) Methods, systems, and computer program products for identifying computer program source code constructs
US20040064806A1 (en) Verifiable processes in a heterogeneous distributed computing environment
Doenges et al. Petr4: formal foundations for p4 data planes
Sullivan et al. Modular aspect-oriented design with XPIs
US20090328013A1 (en) Componentization of compiler functionality
US10514898B2 (en) Method and system to develop, deploy, test, and manage platform-independent software
CN118283148B (zh) 一种跨平台应用层协议解析器自动生成方法及装置
Zhang et al. Aspect Composition in the Motorola Aspect-Oriented Modeling Weaver.
CN101980546B (zh) 智能网平台、业务执行方法和分析业务异常的方法
CN114327477A (zh) 智能合约执行方法、装置、电子装置和存储介质
Renault et al. From AADL architectural models to Petri Nets: Checking model viability
Lohmann A feature-complete Petri net semantics for WS-BPEL 2.0 and its compiler BPEL2oWFN
CN114115884B (zh) 一种编程服务的管理方法以及相关装置
Delaval et al. A type system for the automatic distribution of higher-order synchronous dataflow programs
Pessaux FoCaLiZe: inside an F-IDE
Vizovitin et al. Verifying UCM specifications of distributed systems using colored Petri nets
CN117235746B (zh) 一种基于多维ast融合检测的源代码安全管控平台
Wang Foundationally Verified Data Plane Programming
Doenges et al. Petr4: Formal Foundations for P4 Data Planes
US20240037429A1 (en) Common parser-deparser for libraries of packet-processing programs
Hammer et al. PSCS4CPP: A Generative PSCS Implementation for C++
Mahadevan et al. PRSafe: A Domain Specific Language Created with LLVM
Loitzl Supporting Register Pairs in CompCert

Legal Events

Date Code Title Description
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