<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    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結尾的規則結構列表。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类