4.2 Snort 必需功能
每個動態模塊必須定義一組函數和數據對象才能在此框架內工作。
4.2.1 預處理器
每個動態預處理器必須定義以下項。這些必須在源文件的全局作用域中定義(例如spp_example.c)。
const int MAJOR_VERSION這指定了預處理器的主要版本。
const int MINOR_VERSION這指定了預處理器的次級版本。
const int BUILD_VERSION它指定預處理器的構建版本。
const char *PREPROC_NAME這指定預處理器的顯示名稱。
void DYNAMIC_PREPROC_SETUP(void)調用這個函數來注冊要用數據包數據調用的預處理器。
必須使用與Snort二進制文件定義相同的宏構建預處理器,并鏈接到在Snort構建期間創建的動態預處理器庫。包配置文件作為Snort構建的一部分導出,可以使用PKG_CONFIG_PATH=< >使用以下命令訪問:
pkg-config -cflags snort_preproc返回宏并包含編譯動態預處理器所需的路徑。
pkg-config -libs snort_preproc返回連接動態預處理器所需的庫和庫路徑。
4.2.2 檢測引擎
每個動態檢測引擎庫必須定義以下函數。
int LibVersion(DynamicPluginMeta *)此函數返回共享庫的元數據。
int InitializeEngineLib(DynamicEngineData *)這個函數初始化引擎使用的數據結構。
Snort提供的示例代碼預定義了這些函數,并定義了以下用于動態規則庫的api。
int RegisterRules(Rule **)這個函數迭代列表中的每個規則,初始化它以設置內容搜索、PCRE計算數據和注冊流位。
int DumpRules(char *,Rule **)這個函數迭代列表中的每個規則,并編寫規則停止,供snort使用,以控制規則的操作(警報、日志、刪除等)。
int ruleMatch(void *p, Rule *rule)如果規則沒有自己的規則評估函數,則使用該函數對規則進行評估。它為每個規則選項使用下面列出的單個函數,并處理重復的內容問題。
如果選項基于當前條件(光標位置等)匹配,下面的每個函數將返回RULE_MATCH。
int contentMatch(void *p, ContentInfo* content, u_int8_t **cursor)此函數計算給定包的單個內容,檢查是否存在由ContentInfo和cursor分隔的內容。游標位置以* Cursor*的形式更新并返回。
對于文本規則,With選項對應于深度,而distance選項對應于偏移量。
int checkFlow(void *p, FlowFlags *flowflags)此函數計算給定數據包的流。
int extractValue(void *p, ByteExtract *byteExtract, u_int8_t *cursor)此函數從給定數據包中提取字節,由ByteExtract指定并由游標分隔。提取的值存儲在ByteExtract memoryLocation參數中。
int processFlowbits(void *p, FlowBitsInfo *flowbits)根據FlowBitsInfo的指定,此函數計算給定數據包的流位。它將與基于文本的規則所使用的流位交互。
int setCursor(void *p, CursorInfo *cursorInfo, u_int8_t **cursor)此函數調整由CursorInfo分隔的光標。在cursor中返回新的光標位置。它處理指定緩沖區的邊界檢查,并在光標移出邊界時返回RULE_NOMATCH。
它還被contentMatch、byteJump和pcreMatch用于在成功匹配后調整光標位置。
int checkCursor(void *p, CursorInfo *cursorInfo, u_int8_t *cursor)此函數驗證游標是否在指定緩沖區的范圍內。
int checkValue(void *p, ByteData *byteData, u_int32_t value, u_int8_t *cursor)這個函數將value與字節數據中存儲的值進行比較。
int byteTest(void *p, ByteData *byteData, u_int8_t *cursor)這是extractValue()和checkValue()的包裝器。
int byteJump(void *p, ByteData *byteData, u_int8_t **cursor)這是extractValue()和setCursor()的包裝器。
int pcreMatch(void *p, PCREInfo *pcre, u_int8_t **cursor)這個函數計算給定數據包的單個pcre,檢查是否存在由PCREInfo和cursor分隔的表達式。游標位置以* Cursor*的形式更新并返回。
int detectAsn1(void *p, Asn1Context *asn1, u_int8_t *cursor)這個函數對給定的數據包(由Asn1Context和游標分隔)進行ASN.1檢查。
int checkHdrOpt(void *p, HdrOptCheck *optData)這個函數計算給定數據包的協議標頭,由HdrOptCheck指定。
int loopEval(void *p, LoopInfo *loop, u_int8_t **cursor)這個函數遍歷由LoopInfo和游標分隔的LoopInfo的子規則。游標位置以* Cursor*的形式更新并返回。
int preprocOptionEval(void *p, PreprocessorOption *preprocOpt, u_int8_t **cursor)這個函數計算由PreprocessorOption指定的預處理器定義選項。游標位置以* Cursor*的形式更新并返回。
void setTempCursor(u_int8_t **temp_cursor, u_int8_t **cursor)此函數用于處理重復的內容,以臨時保存光標位置,以便稍后重新設置。
void revertTempCursor(u_int8_t **temp_cursor, u_int8_t **cursor)此函數用于恢復到先前保存的臨時游標位置。
注意:如果您決定編寫自己的規則評估函數,出現多次的模式可能會導致false negatives。要特別注意處理這種情況,如果后續規則選項無法匹配,則再次搜索匹配的模式。對于content和PCRE選項都應該這樣做。
4.2.3 規則
每個動態規則庫必須定義以下函數。示例定義在文件’ sfnort_dynamic_detection_lib.c ‘中。預處理器的元數據和設置函數應該在‘sfsnort_dynamic_detection_lib.h’中定義。
int LibVersion(DynamicPluginMeta *)此函數返回共享庫的元數據。
int EngineVersion(DynamicPluginMeta *)這個函數定義了相應的檢測引擎庫的版本需求。
int DumpSkeletonRules()這個函數寫出所加載規則的規則存根。
int InitializeDetection()這個函數注冊規則庫中的每個規則。它應該設置快速的模式匹配器內容、寄存器流位等。
Snort提供的示例代碼預定義了這些函數,并在動態規則庫中使用以下數據。
Rule *rules[]此庫定義的以NULL結尾的規則結構列表。
Snort安裝使用中文手冊
推薦文章: