导航:首页 > 源码编译 > 多模匹配算法dfa

多模匹配算法dfa

发布时间:2022-11-29 08:43:46

Ⅰ ac自动机是什么,会帮你自动ac吗

简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是着名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段文章(长度是m),让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie的基础知识(也有人说需要KMP的知识,我觉得暂且不要理会这个。但是在看这篇文章之前,Trie字典树,你是必须要先搞懂.与其他字符匹配不同,KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。

Ⅱ 什么是TAV引擎

TAV自主引擎是中国唯一的自主杀毒引擎,它是腾讯电脑管家得以发挥功能的核心技术,已经获得了国际上的高度认可,TAV获得过国际知名的软件评测机构西海岸实验室和VB100的双重认证。
TAV是一款国内首款自主研发的,高性能,高检出,高处理能力,低消耗的杀毒引擎,对各类木马,感染型,手机病毒,office宏病毒以及脚本病毒能做到全方位的识别和处理,其中采用世界领先的虚拟机技术对各种复杂的感染型以及木马病毒进行完美快速的查杀,采用先进的多模匹配算法对各类脚本病毒进行快速识别,并且国内首创机器学习病毒查杀技术,全自动,智能,准确的处理病毒。尤其在office类宏病毒、漏洞以及感染型的处理方面一直处于世界领先水平,随着64位系统以及移动互联网的来临,TAV对apk和64位病毒的也处理取得了优异的成绩。
主要功能:
TAV是一款全方位,立体的杀毒引擎,对各类木马,感染型,手机病毒,office宏病毒,漏洞以及脚本类病毒具有完美的检出和处理能力。尤其在感染型完美清除和office宏病毒清除上做到了世界先进水平,可以极大的减少使用者中毒后信息和财产的丢失。
主要特点:
TAV作为一款技术世界领先的杀毒引擎主要有以下特点:
1、国内首个自主研发引擎。
2、对病毒的检出率世界领先,获得了西海岸和VB100两大国际着名第三方测评认证机构认证。
3、 高性能,杀毒速度一直处于世界领先水平。
4、杀毒干净,在office宏病毒以及感染型病毒方面做到完美清除,极大的减少使用者中毒信息和财产损失。
5、低消耗,TAV无论在cpu消耗,内存消耗还是在自身体积方面都做到了精益求精,一直处于同类产品消耗资源的最低水平。
采用技术:
TAV除了采用普通杀毒引擎通用的一般查杀技术以外,还独立创新的使用以下技术解决日益猖獗的病毒问题
1、 虚拟机技术,可以帮助识别和处理各类采用多态、变形等技术的顽固木马和感染型,让病毒无处遁形。
2、 国内首创机器学习,病毒识别技术,使用世界先进的机器学习人工智能算法,结合深入解析,让病毒的识别变得智能化,高效化,及时化。
3、采用高效的识别技术,如特征分类排序技术,多模匹配技术,使TAV在性能上一直处于世界领先水平。
应用范围:
TAV目前已经广泛的应用到安全防御的最前线,其中包括世界知名网站VirusTotal,国内一流的杀毒软件--腾讯电脑管家,以及国内一流的识别平台-哈勃平台上,时刻和病毒做最直接的对抗。

Ⅲ 图像匹配的算法

迄今为止,人们已经提出了各种各样的图像匹配算法,但从总体上讲,这些匹配算法可以分成关系结构匹配方法、结合特定理论工具的匹配方法、基于灰度信息的匹配方法、基于亚像元匹配方法、基于内容特征的匹配方法五大类型 基于内容特征的匹配首先提取反映图像重要信息的特征,而后以这些特征为模型进行匹配。局部特征有点、边缘、线条和小的区域,全局特征包括多边形和称为结构的复杂的图像内容描述。特征提取的结果是一个含有特征的表和对图像的描述,每一个特征由一组属性表示,对属性的进一步描述包括边缘的定向和弧度,边与线的长度和曲率,区域的大小等。除了局部特征的属性外,还用这些局部特征之间的关系描述全局特征,这些关系可以是几何关系,例如两个相邻的三角形之间的边,或两个边之间的距离可以是辐射度量关系,例如灰度值差别,或两个相邻区域之间的灰度值方差或拓扑关系,例如一个特征受限于另一个特征。人们一般提到的基于特征的匹配绝大多数都是指基于点、线和边缘的局部特征匹配,而具有全局特征的匹配实质上是我们上面提到的关系结构匹配方法。特征是图像内容最抽象的描述,与基于灰度的匹配方法比,特相对于几何图像和辐射影响来说更不易变化,但特征提取方法的计算代价通常较,并且需要一些自由参数和事先按照经验选取的闭值,因而不便于实时应用同时,在纹理较少的图像区域提取的特征的密度通常比较稀少,使局部特征的提 取比较困难。另外,基于特征的匹配方法的相似性度量也比较复杂,往往要以特征属性、启发式方法及闭方法的结合来确定度量方法。基于图像特征的匹配方法可以克服利用图像灰度信息进行匹配的缺点,由于图像的特征点比象素点要少很多,因而可以大大减少匹配过程的计算量同时,特征点的匹配度量值对位置的变化比较敏感,可以大大提高匹配的精确程度而且,特征点的提取过程可以减少噪声的影响,对灰度变化,图像形变以及遮挡等都有较好的适应能力。所以基于图像特征的匹配在实际中的应用越来越广-泛。所使用的特征基元有点特征明显点、角点、边缘点等、边缘线段等。

编译原理词法分析器怎么处理标识符的

ANSI C中的标识符定义是:以字母开头的,字母、数字以及下划线的组合。
用正则表达式表示就是:[a-zA-Z]+[a-zA-Z0-9_]*
根据这个正则表达式画出它的NFA,转换成DFA,化简为最简DFA。最后根据这个最简的有限状态机就可以写出标识符的匹配算法了。

Ⅳ 什么是TAV自主引擎啊

tav自主引擎是中国唯一的自主杀毒引擎,它是腾讯电脑管家得以发挥功能的核心技术,已经获得了国际上的高度认可,TAV获得过国际知名的软件评测机构西海岸实验室和VB100的双重认证。
TAV是一款国内首款自主研发的,高性能,高检出,高处理能力,低消耗的杀毒引擎,对各类木马,感染型,手机病毒,office宏病毒以及脚本病毒能做到全方位的识别和处理,其中采用世界领先的虚拟机技术对各种复杂的感染型以及木马病毒进行完美快速的查杀,采用先进的多模匹配算法对各类脚本病毒进行快速识别,并且国内首创机器学习病毒查杀技术,全自动,智能,准确的处理病毒。尤其在office类宏病毒、漏洞以及感染型的处理方面一直处于世界领先水平,随着64位系统以及移动互联网的来临,TAV对apk和64位病毒的也处理取得了优异的成绩。
主要功能:
TAV是一款全方位,立体的杀毒引擎,对各类木马,感染型,手机病毒,office宏病毒,漏洞以及脚本类病毒具有完美的检出和处理能力。尤其在感染型完美清除和office宏病毒清除上做到了世界先进水平,可以极大的减少使用者中毒后信息和财产的丢失。
主要特点:
TAV作为一款技术世界领先的杀毒引擎主要有以下特点:
1、国内首个自主研发引擎。
2、对病毒的检出率世界领先,获得了西海岸和VB100两大国际着名第三方测评认证机构认证。
3、 高性能,杀毒速度一直处于世界领先水平。
4、杀毒干净,在office宏病毒以及感染型病毒方面做到完美清除,极大的减少使用者中毒信息和财产损失。
5、低消耗,TAV无论在cpu消耗,内存消耗还是在自身体积方面都做到了精益求精,一直处于同类产品消耗资源的最低水平。
采用技术:
TAV除了采用普通杀毒引擎通用的一般查杀技术以外,还独立创新的使用以下技术解决日益猖獗的病毒问题
1、 虚拟机技术,可以帮助识别和处理各类采用多态、变形等技术的顽固木马和感染型,让病毒无处遁形。
2、 国内首创机器学习,病毒识别技术,使用世界先进的机器学习人工智能算法,结合深入解析,让病毒的识别变得智能化,高效化,及时化。
3、采用高效的识别技术,如特征分类排序技术,多模匹配技术,使TAV在性能上一直处于世界领先水平。
应用范围:
TAV目前已经广泛的应用到安全防御的最前线,其中包括世界知名网站VirusTotal,国内一流的杀毒软件--腾讯电脑管家,以及国内一流的识别平台-哈勃平台上,时刻和病毒做最直接的对抗。

Ⅵ 举例说明词法分析中关键字,运算符及标识符的词法二元组的描述(编译原理)问题

ANSI C中的标识符定义是:以字母开头的,字母、数字以及下划线的组合。
用正则表达式表示就是:[a-zA-Z]+[a-zA-Z0-9_]*
根据这个正则表达式画出它的NFA,转换成DFA,化简为最简DFA。最后根据这个最简的有限状态机就可以写出标识符的匹配算法了。

Ⅶ 正则表达式原理

首先先讲解下正则表达式的基础知识:

1.字符串的组成

对于字符串”123“而言,包括三个字符四个位置。如下图所示:

2.占有字符和零宽度

正则表达式匹配过程中,如果子表达式匹配到东西,而并非是一个位置,并最终保存到匹配的结果当中。这样的就称为占有字符,而只匹配一个位置,或者是匹配的内容并不保存到匹配结果中,这种就称作零宽度,后续会讲到的零宽度断言等。占有字符是互斥的,零宽度是非互斥的。也就是一个字符,同一时间只能由一个子表达式匹配,而一个位置,却可以同时由多个零宽度的子表达式匹配。

3.控制权和传动

正则表达式由左到右依次进行匹配,通常情况下是由一个表达式取得控制权,从字符串的的某个位置进行匹配,一个子表达式开始尝试匹配的位置,是从前一子表达匹配成功的结束位置开始的(例如:(表达式一)(表达式二)意思就是表达式一匹配完成后才能匹配表达式二,而匹配表达式二的位置是从表达式一的位置匹配结束后的位置开始)。如果表达式一是零宽度,那表达式一匹配完成后,表达式二匹配的位置还是原来表达式以匹配的位置。也就是说它匹配开始和结束的位置是同一个。

举一个简单的例子进行说明:正则表达式:123

源数据:123

讲解:首先正则表达式是从最左侧开始进行匹配,也就是位置0处进行匹配,首先得到控制权的是正则表达式中的“1”,而不是源数据中的“1”,匹配源数据中的“1”,匹配成功,将源数据的“1”进行保存到匹配的结果当中,这就表明它占有了一个字符,接下来就将控制权传给正则表达式中的“2”,匹配的位置变成了位置1,匹配源数据中的“2”,匹配成功,将控制权又传动给了正则表达式的“3”,这时候匹配的位置变成了位置2,这时候就会将源数据中的“3”进行匹配。又有正则表达式“3”进行传动控制权,发现已经到了正则表达式的末尾,正则表达式结束。

Ⅷ DPDK ACL算法介绍

DPDK提供了三种classify算法:最长匹配LPM、精确匹配(Exact Match)和通配符匹配(ACL)。

其中的ACL算法,本质是步长为8的Multi-Bit Trie,即每次可匹配一个字节。一般来说步长为n时,Trie中每个节点的出边为2^n,但DPDK在生成run-time structures时,采用DFA/QRANGE/SINGLE这几种不同的方式进行数据结构的压缩,有效去除了冗余的出边。本文将为大家介绍ACL算法的基本原理,主要内容包括:trie树的构造、运行时的node array生成和匹配原理。对于ACL接口的使用,参考DPDK的官方文档即可。

ACL规则主要面向的是IP流量中的五元组信息,即IP/PORT/PROTO,算法在这个基础上进行了抽象,提供了三种类型的匹配区域:

熟悉这三种类型的使用后,完全可以用它们去匹配网络报文的其它区域,甚至将其应用到其它场景中。

具体来说,rte_acl_field_def有5个成员:type、size、field_index、input_index、offset。
如果要深入理解算法,可以思考这几个字段的意义,或者换个角度来看:

对于规则的定义,要注意如下两点:

比如定义了5个field,那么请给出每一个的具体定义:

像field[1]中IP和mask都为0,表示匹配所有的IP地址;field[3]中range由0到65535,表示匹配所有。类似这样的全匹配一定要显示的定义出来,因为如果不明确定义,这些字段的值取决于编译器的,最后编译的ACL规则很可能与原有设想存在偏差。

如果在规则中,对于某个field不进行限制,对于不同type的field,规则书写时有一定差异:
对于BITMASK和MASK类型,全0代表匹配所有,如上例中的field[0]、field[1];
对于RANGE,则按照上述field[3]中的形式定义。

规则定义好后,会转换为trie树并最终合并到一起。
实际处理过程中,build_trie函数会自底向上的将rule中的每个field转换为node,然后将这些node合并生成这条rule的trie,最后将这个trie与已有的trie进行merge,最终生成整个rule set的trie。

tire由node组成,其主要数据成员如下:

node中values成员用于记录匹配信息,ptrs则用于描述node的出边,用于指向转换后的node。

values采用bitmap进行压缩,其数据结构为struct rte_acl_bitset values; 一个byte取值范围是[0,255],可通过256个bit位来进行对应,并实现byte值的快速查找:即通过第x位的bit值是否为1来判断是否包含数值x(0 <= x < 256)。

num_ptrs用于描述出边数目,ptrs即为实际的出边,它记录了其匹配值values和匹配后的节点指针。
match_flag和mrt则用于记录匹配结果,trie树中叶子节点一定是记录匹配结果的节点。

trie树其详细结构比较复杂,这里将其结构进行简化,如下所示:

上图的trie树有4个node,通过ptrs进行指向,values字段为匹配值的bitmap表示,为了表述的简洁,后续会采用simple的方式进行描述。
在trie simple中,实心节点表示匹配节点,边上的数字代表匹配值(为便于阅读,采用实际值而不再是bitmap形式),…代表其它匹配值。

不同type的field,转换为node的方式会有所不同。
目前提供的3种类型:BITMASK描述一个byte的匹配,支持mask模式;MASK用于描述4个byte的匹配,支持mask模式;RANGE描述2个byte的匹配,此时mask表示上限。
field到node的转换,见build_trie中的for循环,具体转换函数则参考:

对于BITMASK,如{.value.u8 = 6, .mask_range.u8 = 0xff,},它最后的转换形式如下:

构造field的node时,总会在结尾添加一个空的end节点,最后一个field除外(它是match node)。在for循环中每完成了一个field的解析后,会将其合并到root中,从而生成这个rule的trie。
合并前,也会先构造一个空的end node(见build_trie函数中,while循环下的root创建),让它与field构成的node头合并,因为不相交,所以merge时会将匹配信息合并到end node并释放原有的头,并将field链的end节点返回(保存到end_prev中),下次合并时,就用此end节点与新的node头合并。
循环遍历完所有的field后,这些node就串联起来了,构成这个rule的trie。

对于多个rule,每次构造完成后会merge到整体的trie中。
这里详细介绍下merge算法原理,其实仔细阅读acl_merge_trie函数的注释即可。

对于node A和node B的merge, acl_merge_trie函数返回一个节点,这个节点指向它们路径的交集。
这里给出三个例子用于展示merge前后的变化。为了减少状态点,构造rte_acl_field_def如下:

示例1:

acl_rules[1]为trie A,acl_rules[0]对应trie B,最终trie B合并到trie A上,具体如下:

1和1’合并时,因为level为0,所以1’直接合并到1中;
4和4’合并时,因为节点无交集,所以创建新节点c1(node 4的拷贝),并将4'上的边拷贝到c1中。

示例2,rule类别相同,但优先级不同:

acl_rules[1]为trie A,acl_rules[0]对应trie B,最终trie B合并到trie A上,具体如下:

6和6’是match node,类别相同,且6的优先级为2大于6’的优先级。
6和6’合并时,直接返回6。而前面创建的新节点,如d1,已包含5’的所有边(非ACL_INTERSECT_B),所以最终返回5,free d1。
同理依次往上回溯,a4,b3,c2,也依次被释放,最终merge的trie即为原来的trie A。

示例3,rule类别不同,优先级相同:

acl_rules[1]为trie A,acl_rules[0]对应trie B,最终trie B合并到trie A上,具体如下:

6和6’是match node,因为类别不同,所以最终创建了新node e1,这也导致示例3和示例2最终merge结果的不同。

合并是一个递归的过程,逆向思考构造过程会有助于理解算法。另外,在build_trie之前会sort_rule,匹配范围更大的rule会放到前面优先构造trie,个人为这样node A包含node B的概率更大,这可能也是merge时创建的node C是A的拷贝而不是B的拷贝的原因,因为这样出现ACL_INTERSECT_B的概率相对较低。

一些说明:

trie树构造完成后,会将其由指针跳转的形式转换为等效的数组索引形式,即node array,既可让匹配数据更紧凑,也可提高匹配算法的效率。
采用node array的方式进行状态点的压缩是很常见的优化方式,比如snort里面的ac算法(acsmx.c):

笔者也曾经做过类似的优化,通过将出边由指针方式修改为索引方式,整个匹配tree的内存占用只需要原来的1/5。
将指针方式转换为node array形式是优化的第一步,对于Next[256]出边又可以采用多种压缩方式,比如snort中新的ac算法(acsmx2.c),就采用了Sparse rows和Banded rows等多种压缩方式,但其原理是将出边进行映射转换,本质上还是做DFA状态跳转。

DPDK对边的压缩方式与上述类似,不过它优化的粒度更细,不同type的node有不同的压缩方式:

比如在示例三中,node 1为DFA节点(根节点强制使用DFA方式),2、3、a5、b4、c3、d2为QRANGE,4、5为SINGLE,6、e1为MATCH。
2、3、a5、b4虽然在图上仅有一条有效边,但它不为SINGLE,因为对于无效的匹配其实也会有出边,所以它的真实出边数目并不唯一,只有像4、5这类全匹配节点才是真正的SINGLE节点。

在构造node array前,会调用acl_calc_counts_indices函数更新node的node type,fanout等信息。
node type依据其fanout值决定,fanout计算见acl_count_fanout函数,其原理是:

比如对于示例3中的d2节点:

fanout计算完成后,若其值为1则为SINGLE节点,(1, 5]为QRANGE节点,(5, 256]为DFA节点。
注意:对于trie树的root节点,不论fanout值为多少,会强制将其构造为DFA节点,且其fanout值会重新计算。

type和fanout计算完成后,会统计各类节点数目,信息保存在acl_calc_counts_indices传入的counts参数中,随后rte_acl_gen依据这些信息将整块的node array内存分配出来,其布局大致如下:

Data indexes中用于保存在rte_acl_field_def中定义的offset;
Results对应match node,用于保存匹配结果。
Trans table包含整个匹配过程中的跳转点:

静态将整块node array分配完成后,就需要依据trie 树的node信息填充Trans table和Results了,具体过程见acl_gen_node函数;Data indexes的填充则在acl_set_data_indexes中完成。

2.2中的内存布局大致描绘了各种类型节点的分布情况,DFAs内部由一个一个的DFA节点组成,QUADs和SINGLEs也一样,都是由相同类型的节点构成。
对于每一个节点,其结构则类似如下形式:

DFA节点的fanout一般为4,出边数为fanout*RTE_ACL_DFA_GR64_SIZE;(图中画的为fanout为4的情况,256条出边)
QUAD节点的fanout不超过5,即为节点的出边数不超过5;(图中画的为fanout为4的情况)
SINGLE节点只有一个出边;
图中的trans即为这个节点的出边,它本质是一个uint64的数据结构,通过trans和input信息即可计算得到下一个节点的index,从而实现匹配跳转。trans中不同bit位包含着丰富的信息,具体见acl.h中的说明即可。

高32位对于不同类型的节点有不同的解释:

低32位:

在实际处理过程中,通过高32位与input_byte计算得到index,与低32位中的addr,即可快速定位到下一个trans:trans_table + (addr+index)。
这里的处理其实与传统的DFA跳转差别很大,传统处理时,next = node[‘input’],跳转到下一个节点,然后采用next[‘input’]进行跳转和匹配,即使有数据结构的压缩,跳转目标仍是状态点。但DPDK中,跳转时直接采用trans_table + (addr+index),直接找到了状态点的边(trans),而不是到状态点。

跳转表具体构建时,采用acl_gen_node函数完成:

匹配的过程与跳转表的构建其实是互为一体的,如何构建跳转表就决定了如何进行匹配。

在2.3节,对于跳转的形式已进行了说明,具体可阅读rte_acl_classify_scalar函数:跳转时直接采用trans_table + (addr+index),直接找到了状态点的边(trans),而不是到状态点。

对于具体的匹配过程,还有一点需要注意,即GET_NEXT_4BYTES的使用,每次匹配时候都会去4BTYTES进行匹配,这也是为什么定义input fields时要求4字节连续。比如我在dpdk-dev邮件组中问的这个 问题 。

解决4字节连续,可以通过定义相同的input_index来解决,比如像邮件中提到的设置sport/dport的input_index相同,这是因为data indexes的构造取决于input_index,见acl_build_index函数;同时field_index不同、input_index相同时可避免对field区间的优化(如果优化,将某个field去掉了,这时4字节匹配会失效)。邮件中的问题,正是因为field[3]被优化掉后,4字节连续匹配出现问题。

在特定的场合还必须通过指定.size为32来解决,即使type类型为BITMASK,见DPDK的ACL文档中关于 tos示例的说明 。

另外再说下field_index,前面提出一个问题:field_index是否多余?
答案是不多余,因为算法中会对field进行优化,如果不指定field_index字段,这个优化就无法进行了,具体的优化处理见acl_rule_stats函数。
优化过程中要进行input_index的判断,这是因为相同的input_index可以有多个field,但其中只有某个field是completely wild时应避免进行优化。只有相同input_index的所有field都是completely wild时,才应该将这个field优化掉。

上面的一系列说明,都是针对GET_NEXT_4BYTES每次匹配四个字节的匹配进行的补充说明。

匹配的具体过程,这里用图形的方式进行简要说明,为了能有多种类型的node,这里构造规则如下:

trie树如下所述:

对应的node array如下图所示:

假设输入数据为:proto 16, ip 192.12.8.8,则transition跳转方式如上图红线所示:

注意:node array中indexes、DFA0和idle省略了。

关于trie树相关的理论知识参考 这里 。

本文主要介绍了DPDK的ACL算法,详细描述了如何由规则生成trie,并将trie转换为node array的过程,在文末通过示例介绍了具体的匹配过程。文章旨在介绍ACL算法的基本思路,希望对大家能有所帮助。

阅读全文

与多模匹配算法dfa相关的资料

热点内容
数字编程学院 浏览:94
程序员不时尚 浏览:745
不付费看网站 浏览:230
《代人受过》训诫文 浏览:258
1n.d5h49m6. 浏览:687
linuxweb目录权限 浏览:945
WWW 5a5e 浏览:544
id3v2java 浏览:222
怎么打开mysql命令行 浏览:522
linux文件星号 浏览:632
小城与小妈去北京旅游叫什么小说 浏览:230
pdf阅读器推荐 浏览:81
能免费看英语电影的软件 浏览:126
有部电影女主半夜出去卖淫 浏览:628
西门子编程试题 浏览:82
android转动360 浏览:334
服务器为什么要重装系统 浏览:438
华为尝鲜怎么还是原来的安卓系统 浏览:595
女主是警察的小说 浏览:792
魔兽宏命令是什么 浏览:250