CN101079890B - 一种生成特征码确定状态机的方法和装置 - Google Patents
一种生成特征码确定状态机的方法和装置 Download PDFInfo
- Publication number
- CN101079890B CN101079890B CN2007101182967A CN200710118296A CN101079890B CN 101079890 B CN101079890 B CN 101079890B CN 2007101182967 A CN2007101182967 A CN 2007101182967A CN 200710118296 A CN200710118296 A CN 200710118296A CN 101079890 B CN101079890 B CN 101079890B
- Authority
- CN
- China
- Prior art keywords
- compiling
- module
- current
- expression
- merging
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 230000014509 gene expression Effects 0.000 claims abstract description 192
- 230000008569 process Effects 0.000 claims description 32
- 238000010586 diagram Methods 0.000 description 6
- 241000700605 Viruses Species 0.000 description 3
- 238000004880 explosion Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明提供一种生成特征码确定状态机的方法和装置,将特征码对应的正则表达式进行分组并进行合并编译,如果合并编译获得的状态数不大于单独编译的状态数之和,则将特征码对应的正则表达式加入分组,将合并编译的结果作为生成的确定状态机(DFA)。应用本发明方案,可以保证分组的合理性,避免合并编译生成的DFA产生大量的状态,占用过多的存储空间。
Description
技术领域
本发明涉及网络安全技术领域,特别是涉及一种生成特征码确定状态机的方法和装置。
背景技术
为了保证计算机或网络安全,通常需要检查文件或报文中是否存在妨害安全的信息,比如:病毒、攻击程序等。由于这些病毒或攻击程序一般具有某种特征码,所以在检查文件或报文时,特征码就常常作为被检查的对象。如果检查出文件或报文中存在某种特征码,则可以认为该文件或报文有妨害安全的信息。
特征码一般用正则表达式(Regular Expression)的形式进行描述。由于正则表达式可以表示字符串输入状态的情况,所以通常又将正则表达式编译为确定状态机(DFA,Deterministic Finite Automation)的形式。其中,DFA中的一个状态可以表示字符串输入过程的一个状态,DFA的状态数则可以表示字符串输入过程中所存在的状态数。另外,DFA占用存储空间的大小与状态数呈正比关系,即状态数越多,DFA占用存储空间也越多。
正则表达式编译为DFA之后,就可以将文件或报文中的字符串作为输入字符串,利用DFA对输入的字符串的状态进行匹配,如果匹配成功,则确定输入字符串中存在特征码,从而实现特征码的匹配。
实际应用中,不同的病毒或攻击程序存在不同的特征码。如果为每一个特征码单独编译一个DFA,在检查某文件或报文时,由于不清楚该文件或报文是否存在妨害安全信息的特征码,也不清楚存在哪种特征码,就需要利用多个DFA依次对文件或报文进行检查,其查找速度非常缓慢。
为了提高查找特征码的速度,可以将多个特征码对应的正则表达式进行分组,并分别将每一个分组的正则表达式进行合并编译,生成对应的DFA。这样,在利用某一个DFA检查文件或报文时,就可以对多个特征码同时进行匹配,从而提高查找速度。
在生成DFA的过程中,现有技术一般是将正则表达式随机进行分组,再对每一个分组分别进行编译。在这种方式下,如果分组不合理可能会导致生成的DFA的状态数过多,占用内存过多的现象。比如,某正则表达式为:/ALTER\s.*?FILE\s+((AS|MEMBER|TO)\s+)?(\x27[^\x27]{512})/smi;另一达式为:/ALTER\s.*?FILE\s+((AS|MEMBER|TO)\s+)?(\x22[^\x22]{512})/smi。如果将这两个正则表达式合并编译为同一个DFA,编译后将产生3.67M个状态数,生成的DFA将占用3.67G字节的内存。但如果将两条正则表达式单独进行编译,每一条正则表达式仅生成8.6K个状态数,占用8.6M字节的内存。
可见,由于在生成DFA过程中分组不合理,多个正则表达式编译后产生的状态数可能比正则表达式单独编译后总的状态数多得多,增加了占用内存的容量,不利于实现特征码的匹配工作。
发明内容
有鉴于此,本发明的第一个发明目的在于提供一种生成特征码确定状态机的方法,可以保证分组的合理性,避免合并编译生成的确定状态机产生大量的状态,占用过多的存储空间。
本发明的第二个发明目的是提供一种生成特征码确定状态机的装置,可以保证分组的合理性,避免合并编译生成的确定状态机产生大量的状态,占用过多的存储空间。
为了达到上述第一个发明目的,本发明提出的技术方案为:
一种生成特征码确定状态机的方法,该方法包括以下步骤:
a、将第一条特征码对应的正则表达式作为当前表达式;
b、判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤c;否则,将当前表达式加入新建的分组中并单独编译生成确定状态机DFA,执行步骤d;
c、将当前表达式与当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤d;否则,返回步骤b;
d、将下一条特征码对应的正则表达式作为当前表达式,返回步骤b,直至处理完所有特征码对应的正则表达式。
上述方案中,步骤b所述将当前表达式加入新建的分组中并单独编译生成DFA之后,步骤b进一步包括:
保存单独编译后获得的状态数;
步骤c所述当前未处理分组单独编译的状态数为事先保存的状态数。
上述方案中,所述步骤c包括:
c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数;
c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤b;
c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,并执行步骤d。
上述方案中,事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0,步骤c2所述将当前表达式与当前未处理分组进行合并编译的过程中进一步包括:
每编译完一个状态,所述计数变量加1;
步骤c2所述判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和的方法为:判断所述计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
上述方案中,所述步骤d之后,如果分组个数大于事先设置的值,则该方法进一步包括:
x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数;
x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA;
x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
本发明的另一发明目的是这样实现的:
一种生成特征码确定状态机的装置,该装置包括:
表达式存储模块,用于保存特征码对应的正则表达式;
表达式选取模块,用于从表达式存储模块中选取一条表达式作为当前表达式;
分组存储模块,用于保存所有分组经过编译后生成的确定状态机DFA;
分组选取模块,用于根据判别模块的通知从分组存储模块中选取一个未处理分组作为当前未处理分组;
判别模块,用于判断分组存储模块中是否存在未与表达式选取模块中的当前表达式合并编译过的分组,如果有,则通知分组选取模块选取当前未处理分组,并通知编译模块对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块对当前表达式进行单独编译;还用于根据编译模块返回的编译成功信息通知表达式选取模块选取下一条表达式,直至处理完所有特征码对应的正则表达式;
编译模块,用于根据判别模块的通知,将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息;否则,向判别模块返回编译失败信息;还用于根据判别模块的通知,对当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息。
上述方案中,所述编译模块包括:
编译控制模块,用于根据判别模块发送的进行合并编译的通知,控制编译执行模块进行合并编译,在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息,在接收到来自状态数判别模块的超值触发信号时向判别模块返回编译失败信息;还用于根据判别模块发送的进行单独编译的通知,控制编译执行模块进行单独编译,并在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息;
编译执行模块,用于在编译控制模块的控制下,将表达式选取模块中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块保存;将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块,并在合并编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块保存;还用于在编译控制模块的控制下,将表达式选取模块中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块;
单独编译状态数存储模块,用于保存编译执行模块输出的单独编译当前表达式所获得的状态数;
分组状态数存储模块,用于保存来自分组选取模块中当前未处理分组的状态数;
状态数判别模块,用于实时判断来自编译执行模块的状态数是否大于单独编译状态数存储模块和分组状态数存储模块中所保存的状态数之和,如果大于,则向编译控制模块发送超值触发信号。
上述方案中,该装置进一步包括:
合并判别模块,用于判断分组存储模块中分组的个数是否大于事先设置的值,如果大于,则通知合并模块进行合并处理,直至分组存储模块中分组的个数小于或等于事先设置的值;
合并模块,用于将分组存储模块中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块中。
综上所述,本发明提出的一种生成特征码确定状态机的方法和装置,由于在将特征码对应的正则表达式加入分组前,需要判断正则表达式和分组的合并编译产生的状态数是否大于单独编译产生的状态数,并只有在不大于的情况下,才将正则表达式加入分组生成DFA,从而保证分组的合理性,避免了合并编译后生成的DFA产生大量的状态数,占用过多的存储空间。
附图说明
图1是本发明的流程图;
图2是应用本发明方案的方法实施例的流程图;
图3是应用本发明方案的装置实施例一的基本结构示意图;
图4是装置实施例一中编译执行模块的内部结构示意图;
图5是应用本发明方案的装置实施例二的基本结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。
图1是本发明生成特征码确定状态机的流程图。如图1所示,该方法可以包括:
步骤101:将第一条特征码对应的正则表达式作为当前表达式。
步骤102~104:判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤105;否则,将当前表达式加入新建的分组中并单独编译生成DFA,执行步骤108。
这里所述的单独编译和合并编译都可以采用现有的软件工具来实现,比如:FLEX软件等。当然,应用本发明方案的用户还可以采用其它软件编译或自行编译,此处不再赘述。
另外,当前表达式可能需要与多个分组依次进行合并编译,才能确定应该加入哪一个分组。这里,为了区分是否进行了合并编译,可以将未与当前表达式合并编译过的分组称为未处理分组,将已经与当前表达式合并编译过的分组称为已处理分组。
步骤105:将当前表达式与当前未处理分组进行合并编译。
步骤106~107:判断合并编译获得的状态数是否不大于当前表达式与当前未处理分组单独编译的状态数之和,如果是,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤108;否则,返回步骤102。
为了保证正则表达式分组合理,在将当前表达式加入某个分组时,需要判断加入该分组后是否发生“爆炸”,即当前表达式与要加入的分组合并编译之后的状态数是否大于单独编译的状态数之和。如果发生“爆炸”,则说明分组不合理,当前表达式不应该加入该分组中;如果没有发生“爆炸”,则说明分组是合理的,当前表达式可以加入该分组中。
实际应用中,可以在合并编译结束之后,再判断合并编译所获得的状态数是否大于单独编译的状态数之和;也可以在合并编译的过程中,实时判断合并编译所获得的状态数是否大于单独编译的状态数之和。
可以实时判断的原因在于:在合并编译的过程中,每当将特征码对应正则表达式表示的一个字符串输入状态编译为DFA可以表示的一个状态后,其状态数就可以加1。所以,在编译的过程中,如果用某个变量对产生状态的数量进行计数,就可以明确当前的状态数是否大于当前表达式和当前未处理分组单独编译的状态数之和。
当然,如果在合并编译的过程中,实时判断合并编译所获得的状态数是否大于单独编译的状态数之和,还需要在判断之前明确当前表达式和当前未处理分组进行单独编译的状态数之和。
其中,确定当前表达式进行单独编译的状态数比较容易,只需要在步骤105执行合并编译之前,将当前表达式进行单独编译就可获得当前表达式的状态数。而确定当前未处理分组的状态数则需要在新建一个分组时,将加入该分组中的正则表达式进行单独编译,并将获得的状态数作为新建分组的状态数进行保存。此后,就可以直接利用保存的分组的状态数,无需再次进行编译。在进行实时判断的情况下,步骤105~步骤107又可以具体为:
c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数。
c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤102;
c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,执行步骤108。
步骤108:将下一条特征码对应的正则表达式作为当前表达式,返回步骤102,直至处理完所有特征码的正则表达式。
这样,就可以将所有特征码的正则表达式合理地进行分组,以保证每一个分组产生的DFA不会又过多的状态,也就不会占用过多的存储空间。
为了更好地说明本发明方案,下面用一个较佳实施例进行详细描述。
本实施例中,为了区分是否与当前正则表达式进行过合并编译,可以为每一个分组依次编号,当前未处理分组的组号用current_group表示,分组总个数用group_number表示,group_number的初始值为0。
图2是本实施例的流程图。如图2所示,本实施例可以包括:
步骤201:将第一条特征码对应的正则表达式作为当前表达式。
步骤202:将current_group的值设置为0。
步骤203:将当前表达式进行单独编译,获得单独编译的状态数。
步骤204:判断current_group的值是否小于group_number的值,如果是,则执行步骤205;否则,执行步骤210。
这里,如果current_group的值小于group_number,则可以确定还存在未与当前表达式进行合并编译的分组。
步骤205:当前表达式与current_group对应的分组进行合并编译。
步骤206~步骤207:判断合并编译过程中获得的状态数是否大于当前表达式单独编译的状态数与current_group对应分组的状态数之和,如果大于,则将current_group加1,再执行步骤204;否则,执行步骤208。
这里,将current_group加1可以表示将current_group对应的分组作为已处理分组,而将下一个分组,即current_group+1对应的分组作为当前未处理分组。
步骤208:判断合并编译是否结束,如果结束,则执行步骤209;否则,返回步骤205继续进行合并编译。
这里,步骤205~步骤208为一个循环过程,即当前表达式和current_group对应的分组实现合并编译的过程。但需要注意的是,这里并不是合并编译完成之后才判断合并编译过程中获得的状态数是否大于单独编译的状态数,而是在合并编译的过程中进行实时判断。
为了在合并编译过程中实时判断,可以事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0。在合并编译的过程中,如果每编译完一个状态,就将所述计数变量加1,计数变量的值就可以表示合并编译过程中所获得的状态数。那么,在步骤206进行实时判断时,就可以直接判断计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
步骤209:将当前表达式加入current_group对应的分组中,将合并编译的结果作为生成的DFA,并将合并编译后获得的状态数作为current_group对应分组的状态数进行保存,再执行步骤212。
步骤210:新建一个分组,将当前表达式加入新建分组中单独编译生成DFA,并将单独编译后获得的状态数作为新建分组的状态数。
步骤211:将group_number的值加1。
步骤212~步骤213:判断是否处理完所有的特征码对应的正则表达式,如果是,则退出本流程;否则,将下一条特征码对应的正则表达式作为当前表达式,并执行步骤202。
另外,实际应用中,不管采用哪种方法生成特征码的DFA,如果分组太多都可能会导致在文件或报文中查找特征码的效率降低。在这种情况下,可以事先设置分组个数的最大值,如果实际分组个数大于这个预先设置的值,就可以进一步将分组进行合并。具体实现方式可以为:
x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数。
x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA。
这里所述的将两个分组合并为一个分组就是指将两个分组中所有的正则表达式进行合并编译。
x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
也就是说,通过合并分组,可以将分组的个数按照实际情况控制在一定范围内。这样,既可以保持分组的合理性,不占用过多的存储空间,又可以避免分组过多而导致查找效率降低的问题。
针对上述方法,本发明还提出一种生成特征码确定状态机(DFA)的装置实施例。图3是本发明中生成特征码DFA装置实施例一的基本结构示意图。如图3所示,该装置包括:表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306。其中,
表达式存储模块301,用于保存特征码对应的正则表达式。
表达式选取模块302,用于从表达式存储模块301中选取一条表达式作为当前表达式。
分组存储模块303,用于保存所有分组经过编译后生成的确定状态机DFA。
分组选取模块304,用于根据判别模块305的通知从分组存储模块303中选取一个未处理分组作为当前未处理分组。
判别模块305,用于判断分组存储模块303中是否存在未与表达式选取模块302中的当前表达式合并编译过的分组,如果有,则通知分组选取模块304选取当前未处理分组,并通知编译模块306对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块306对当前表达式进行单独编译;还用于根据编译模块306返回的编译成功信息通知表达式选取模块302选取下一条表达式,直至处理完所有特征码对应的正则表达式。
编译模块306,用于根据判别模块305的通知,将表达式选取模块304中的当前表达式和分组选取模块302中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块303中,并向判别模块305返回编译成功信息;否则,向判别模块305返回编译失败信息;还用于根据判别模块305的通知,对表达式选取模块304中的当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块303中,并向判别模块305返回编译成功信息。
实际应用中,所述编译模块306的内部结构可以如图4所示,包括:
编译控制模块3061,用于根据判别模块305发送的进行合并编译的通知,控制编译执行模块3062进行合并编译,在接收到来自编译执行模块3062的编译结束信号时向判别模块305返回编译成功信息,在接收到来自状态数判别模块3065的超值触发信号时向判别模块305返回编译失败信息;还用于根据判别模块305发送的进行单独编译的通知,控制编译执行模块3062进行单独编译,并在接收到来自编译执行模块3062的编译结束信号时向判别模块305返回编译成功信息。
编译执行模块3062,用于在编译控制模块3061的控制下,将表达式选取模块302中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块3064保存;将表达式选取模块302中的当前表达式和分组选取模块304中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块3065,并在合并编译结束时向编译控制模块3061返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块303保存;还用于在编译控制模块3061的控制下,将表达式选取模块302中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块3061返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块303进行保存。
分组状态数存储模块3063,用于保存来自分组选取模块304中当前未处理分组的状态数。
单独编译状态数存储模块3064,用于保存编译执行模块3062输出的单独编译当前表达式所获得的状态数。
状态数判别模块3065,用于实时判断来自编译执行模块3062的状态数是否大于单独编译状态数存储模块3064和分组状态数存储模块3063中所保存的状态数之和,如果大于,则向编译控制模块3061发送超值触发信号。
当然,图3和图4仅仅是实现本发明方案的实施例,实际应用中,也可以利用其它的装置结构实现,此处不再赘述。
另外,实际应用中,如果分组太多都可能会导致在文件或报文中查找特征码的效率降低。在这种情况下,可以事先设置分组个数的最大值,如果实际分组个数大于这个预先设置的值,就可以进一步将分组进行合并。
图5是本发明中生成特征码DFA装置实施例二的基本结构示意图。如图5所示,该装置不仅包括:表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306,还包括:合并判别模块307、合并模块308。其中,
合并判别模块307,用于判断分组存储模块303中分组的个数是否大于事先设置的值,如果大于,则通知合并模块308进行合并处理,直至分组存储模块303中分组的个数小于或等于事先设置的值。
合并模块308,用于将分组存储模块303中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块303中。
而图5中的表达式存储模块301、表达式选取模块302、分组存储模块303、分组选取模块304、判别模块305、编译模块306的功能和结构与图3相同,此处不再详细描述。
当然,如果利用DFA实现特征码匹配的设备的查询速度很块,不需要限制分组个数,也可以省略合并判别模块307和合并模块308。
应用本发明方法实施例或/和装置实施例的方案,可以将所有特征码对应的正则表达式进行分组,并在分组的过程中完成对每一个分组的编译,从而达到生成DFA的目的。由于在分组过程中,通过判断合并编译产生的状态数是否大于单独编译的状态数,可以保证分组的合理性,避免每一个分组对应的DFA产生的状态数过多,占用大量的存储空间。另外,由于可以采用实时判断合并编译过程中所获得的状态数是否大于单独编译的状态数的方法,如果大于,则不必完成后续合并编译的过程就可以确定当前表达式不应该加入该分组,从而大大节约了编译时间,提高了编译的效率。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种生成特征码确定状态机的方法,其特征在于,该方法包括以下步骤:
a、将第一条特征码对应的正则表达式作为当前表达式;
b、判断是否存在未与当前表达式合并编译过的未处理分组,如果有,则将未处理分组中的一个作为当前未处理分组,执行步骤c;否则,将当前表达式加入新建的分组中并单独编译生成确定状态机DFA,执行步骤d;
c、将当前表达式与当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,再执行步骤d;否则,返回步骤b;
d、将下一条特征码对应的正则表达式作为当前表达式,返回步骤b,直至处理完所有特征码对应的正则表达式。
2.根据权利要求1所述的方法,其特征在于,步骤b所述将当前表达式加入新建的分组中并单独编译生成DFA之后,步骤b进一步包括:
保存单独编译后获得的状态数。
3.根据权利要求2所述的方法,其特征在于,步骤c所述当前未处理分组单独编译的状态数为事先保存的状态数。
4.根据权利要求3所述的方法,其特征在于,所述步骤c包括:
c1、将当前表达式进行单独编译,获得当前表达式单独编译的状态数;
c2、将当前表达式与当前未处理分组进行合并编译,并在合并编译的过程中,实时判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和,如果大于,则将当前未处理分组作为已处理分组,并返回步骤b;
c3、将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA,将合并编译后获得的状态数作为当前未处理分组的状态数进行保存,再将当前未处理分组作为已处理分组,并执行步骤d。
5.根据权利要求4所述的方法,其特征在于,事先设置用于记录合并编译过程所产生状态数的计数变量,并将初始值设置为0,步骤c2所述将当前表达式与当前未处理分组进行合并编译的过程中进一步包括:
每编译完一个状态,所述计数变量加1;
步骤c2所述判断当前合并编译所获得的状态数是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和的方法为:判断所述计数变量的值是否大于当前表达式单独编译的状态数与保存的当前未处理分组的状态数之和。
6.根据权利要求1至5任一项所述的方法,其特征在于,所述步骤d之后,如果分组个数大于事先设置的值,则该方法进一步包括:
x1、将所有分组中任意两个分组进行合并编译,获得任意两个分组合并编译后的状态数;
x2、将最小的状态数所对应的两个分组合并为一个分组,并生成DFA;
x3、判断当前分组个数是否大于事先设置的值,如果大于,则返回步骤x1;否则,退出本流程。
7.一种生成特征码确定状态机的装置,其特征在于,该装置包括:
表达式存储模块,用于保存特征码对应的正则表达式;
表达式选取模块,用于从表达式存储模块中选取一条表达式作为当前表达式;
分组存储模块,用于保存所有分组经过编译后生成的确定状态机DFA;
分组选取模块,用于根据判别模块的通知从分组存储模块中选取一个未处理分组作为当前未处理分组;
判别模块,用于判断分组存储模块中是否存在未与表达式选取模块中的当前表达式合并编译过的分组,如果有,则通知分组选取模块选取当前未处理分组,并通知编译模块对当前表达式与当前未处理分组进行合并编译;否则,通知编译模块对当前表达式进行单独编译;还用于根据编译模块返回的编译成功信息通知表达式选取模块选取下一条表达式,直至处理完所有特征码对应的正则表达式;
编译模块,用于根据判别模块的通知,将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,如果合并编译获得的状态数不大于当前表达式与当前未处理分组单独编译的状态数之和,则将当前表达式加入当前未处理分组中,将合并编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息;否则,向判别模块返回编译失败信息;还用于根据判别模块的通知,对当前表达式进行单独编译,将当前表达式加入新建的分组中,将单独编译的结果作为生成的DFA保存在分组存储模块中,并向判别模块返回编译成功信息。
8.根据权利要求7所述的装置,其特征在于,所述编译模块包括:
编译控制模块,用于根据判别模块发送的进行合并编译的通知,控制编译执行模块进行合并编译,在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息,在接收到来自状态数判别模块的超值触发信号时向判别模块返回编译失败信息;还用于根据判别模块发送的进行单独编译的通知,控制编译执行模块进行单独编译,并在接收到来自编译执行模块的编译结束信号时向判别模块返回编译成功信息;
编译执行模块,用于在编译控制模块的控制下,将表达式选取模块中的当前表达式经过单独编译后获得的状态数输出给单独编译状态数存储模块保存;将表达式选取模块中的当前表达式和分组选取模块中的当前未处理分组进行合并编译,将合并编译过程中获得的状态数实时输出给状态数判别模块,并在合并编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块保存;还用于在编译控制模块的控制下,将表达式选取模块中的当前表达式进行单独编译,并在单独编译结束时向编译控制模块返回编译结束信号,并将编译结果作为生成的DFA输出给分组存储模块;
单独编译状态数存储模块,用于保存编译执行模块输出的单独编译当前表达式所获得的状态数;
分组状态数存储模块,用于保存来自分组选取模块中当前未处理分组的状态数;
状态数判别模块,用于实时判断来自编译执行模块的状态数是否大于单独编译状态数存储模块和分组状态数存储模块中所保存的状态数之和,如果大于,则向编译控制模块发送超值触发信号。
9.根据权利要求7或8所述的装置,其特征在于,该装置进一步包括:
合并判别模块,用于判断分组存储模块中分组的个数是否大于事先设置的值,如果大于,则通知合并模块进行合并处理,直至分组存储模块中分组的个数小于或等于事先设置的值;
合并模块,用于将分组存储模块中任意两个分组进行合并编译,将合并编译后最小的状态数所对应的两个分组合并为一个分组,并将合并分组生成的DFA保存在分组存储模块中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101182967A CN101079890B (zh) | 2007-07-04 | 2007-07-04 | 一种生成特征码确定状态机的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2007101182967A CN101079890B (zh) | 2007-07-04 | 2007-07-04 | 一种生成特征码确定状态机的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101079890A CN101079890A (zh) | 2007-11-28 |
CN101079890B true CN101079890B (zh) | 2011-03-30 |
Family
ID=38907117
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2007101182967A Expired - Fee Related CN101079890B (zh) | 2007-07-04 | 2007-07-04 | 一种生成特征码确定状态机的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101079890B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102073530B (zh) * | 2010-12-17 | 2015-04-29 | 国家计算机网络与信息安全管理中心 | 一种多条正则表达式的增量分组方法 |
CN102111402B (zh) * | 2010-12-17 | 2015-06-10 | 曙光信息产业(北京)有限公司 | 一种对正则式dfa分组的方法 |
CN102111405A (zh) * | 2010-12-17 | 2011-06-29 | 国家计算机网络与信息安全管理中心 | 一种均衡分两组编译正则表达式的方法 |
CN102413014A (zh) * | 2011-11-28 | 2012-04-11 | 华为技术有限公司 | 报文检测方法和装置 |
CN102387159B (zh) * | 2011-12-13 | 2014-12-10 | 曙光信息产业(北京)有限公司 | 一种线性探测正则式分组系统和方法 |
CN102521357A (zh) * | 2011-12-13 | 2012-06-27 | 曙光信息产业(北京)有限公司 | 一种利用自动机实现文本精确匹配的系统和方法 |
CN105320890B (zh) * | 2015-09-29 | 2019-02-22 | 国网智能电网研究院 | 一种基于分组dfa的源代码漏洞检测方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1509001A (zh) * | 2002-12-16 | 2004-06-30 | �й����ӿƼ����Ź�˾����ʮ�о��� | 一种多通道数字信号发生器 |
CN1564489A (zh) * | 2004-04-19 | 2005-01-12 | 中兴通讯股份有限公司 | 一种通信系统有限状态机的测试方法 |
-
2007
- 2007-07-04 CN CN2007101182967A patent/CN101079890B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1509001A (zh) * | 2002-12-16 | 2004-06-30 | �й����ӿƼ����Ź�˾����ʮ�о��� | 一种多通道数字信号发生器 |
CN1564489A (zh) * | 2004-04-19 | 2005-01-12 | 中兴通讯股份有限公司 | 一种通信系统有限状态机的测试方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101079890A (zh) | 2007-11-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101079890B (zh) | 一种生成特征码确定状态机的方法和装置 | |
CN109345388B (zh) | 区块链智能合约验证方法、装置及存储介质 | |
Ciardo et al. | Analysis of deterministic and stochastic Petri nets | |
US9015102B2 (en) | Match engine for detection of multi-pattern rules | |
CN101901268B (zh) | 一种规则匹配方法及装置 | |
CN111008201B (zh) | 并行修改和读取状态树的方法和装置 | |
CN114049123B (zh) | 区块链的共识方法、装置、计算机设备和存储介质 | |
CN111541756B (zh) | 区块生成方法、装置、节点设备及存储介质 | |
CN110784521A (zh) | 区块链的共识方法、电子设备和存储介质 | |
CN113704252A (zh) | 规则引擎决策树实现方法、装置、计算机设备及计算机可读存储介质 | |
CN115048146A (zh) | 一种复杂事件检测方法及装置、存储介质 | |
CN110708363A (zh) | 一种文件传输方法、系统、电子设备及存储介质 | |
CN106598747A (zh) | 网络数据包的并行处理方法及装置 | |
Lee et al. | Petri net based models for specification and analysis of cryptographic protocols | |
Barjon et al. | Maintaining a distributed spanning forest in highly dynamic networks | |
CN114063606B (zh) | Plc协议模糊测试方法及装置、电子设备、存储介质 | |
CN111222022A (zh) | 一种基于正则表达式的匹配方法及装置 | |
CN109993526B (zh) | 区块链校验方法、处理节点及存储介质 | |
CN105357177A (zh) | 一种数据包过滤规则集处理方法及数据包匹配方法 | |
CN112994931B (zh) | 一种规则匹配的方法及其设备 | |
CN115994360A (zh) | 基于运行时信息的可重入漏洞检测方法及系统 | |
EP4236254A1 (en) | Message processing method and device | |
CN109561083B (zh) | bypass处理的方法、装置、设备及存储介质 | |
CN114118811A (zh) | 服务代码的生成、执行方法、装置、设备及存储介质 | |
CN113703941B (zh) | 任务调度方法、系统及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CP03 | Change of name, title or address | ||
CP03 | Change of name, title or address |
Address after: 310052 Binjiang District Changhe Road, Zhejiang, China, No. 466, No. Patentee after: Xinhua three Technology Co., Ltd. Address before: 310053 Hangzhou hi tech Industrial Development Zone, Zhejiang province science and Technology Industrial Park, No. 310 and No. six road, HUAWEI, Hangzhou production base Patentee before: Huasan Communication Technology Co., Ltd. |
|
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20110330 Termination date: 20200704 |