導航:首頁 > 源碼編譯 > 多模匹配演算法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相關的資料

熱點內容
彼時曾相伴免費觀看完整版 瀏覽:253
網站在線觀看什 瀏覽:159
食嬰鬼整部電影 瀏覽:360
印度電影愛經 瀏覽:642
搜播比神馬更好看的影視 瀏覽:82
特警力量同人小說 瀏覽:253
葉天明柳韻為主角的小說全文免費閱讀 瀏覽:929
比愛戀尺度大的電影 瀏覽:135
主人公叫楊凡的小說 瀏覽:860
在船上做皮肉生意的電影 瀏覽:655
倫理電影飛在天上的船 瀏覽:224
求個網址能在線看 瀏覽:549
美國古埃及電影 瀏覽:78
韓國電影成人學院演員有誰 瀏覽:957
美國大胸電影 瀏覽:140
主角重生老北京的小說 瀏覽:199
邵氏100部恐怖影片 瀏覽:101
青春期2裡面的跳舞的歌 瀏覽:37
國產動作愛情片 瀏覽:420
韓國有部特種兵與護士的電影 瀏覽:662