📄 sf_dynamic_plugins.c
字号:
{ DynamicEnginePlugin *plugin; RemoveDuplicateEngines(); plugin = loadedEngines; while (plugin) { if (plugin->initFunc(info)) { FatalError("Failed to initialize dynamic engine: %s version %d.%d.%d\n", plugin->metaData.uniqueName, plugin->metaData.major, plugin->metaData.minor, plugin->metaData.build); //return -1; } plugin = plugin->next; } return 0;}void DynamicSetRuleData(void *p, void *data){ Packet *pkt = (Packet *)p; if (stream_api && pkt) { stream_api->set_application_data(pkt->ssnptr, PP_RULES, data, &free); }}void *DynamicGetRuleData(void *p){ Packet *pkt = (Packet *)p; if (stream_api && pkt) { return stream_api->get_application_data(pkt->ssnptr, PP_RULES); } return NULL;}int InitDynamicEngines(){ int i; DynamicEngineData engineData; engineData.version = ENGINE_DATA_VERSION; engineData.altBuffer = &DecodeBuffer[0]; for (i=0;i<MAX_URIINFOS;i++) engineData.uriBuffers[i] = (UriInfo*)&UriBufs[i]; /* This is defined in dynamic-plugins/sp_dynamic.h */ engineData.ruleRegister = &RegisterDynamicRule; engineData.flowbitRegister = &DynamicFlowbitRegister; engineData.flowbitCheck = &DynamicFlowbitCheck; engineData.asn1Detect = &DynamicAsn1Detect; /* Pull this out of pv.dynamic_rules_path */ engineData.dataDumpDirectory = pv.dynamic_rules_path; engineData.logMsg = &LogMessage; engineData.errMsg = &ErrorMessage; engineData.fatalMsg = &FatalError; engineData.setRuleData = &DynamicSetRuleData; engineData.getRuleData = &DynamicGetRuleData; engineData.getPreprocOptFuncs = &GetPreprocessorRuleOptionFuncs; return InitDynamicEnginePlugins(&engineData);}int InitDynamicPreprocessorPlugins(DynamicPreprocessorData *info){ DynamicPreprocessorPlugin *plugin; RemoveDuplicatePreprocessorPlugins(); plugin = loadedPreprocessorPlugins; while (plugin) { if (plugin->initFunc(info)) { FatalError("Failed to initialize dynamic preprocessor: %s version %d.%d.%d\n", plugin->metaData.uniqueName, plugin->metaData.major, plugin->metaData.minor, plugin->metaData.build); //return -1; } plugin = plugin->next; } return 0;}/* Do this to avoid exposing Packet & PreprocessFuncNode from * snort to non-GPL code */typedef void (*SnortPacketProcessFunc)(Packet *, void *);void *AddPreprocessor(void (*func)(void *, void *), unsigned short priority, unsigned int preproc_id){ SnortPacketProcessFunc preprocessorFunc = (SnortPacketProcessFunc)func; return (void *)AddFuncToPreprocList(preprocessorFunc, priority, preproc_id);}void *AddPreprocessorCheck(void (*func)(void)){ return (void *)AddFuncToConfigCheckList(func);}void DynamicDisableDetection(void *p){ DisableDetect((Packet *)p);}void DynamicDisableAllDetection(void *p){ DisableAllDetect((Packet *)p);}int DynamicDetect(void *p){ return Detect((Packet *)p);}int DynamicSetPreprocessorBit(void *p, unsigned int preprocId){ return SetPreprocBit((Packet *)p, preprocId);}int DynamicDropInline(void *p){ return InlineDrop((Packet *)p);}void *DynamicGetRuleClassByName(char *name){ return (void *)ClassTypeLookupByType(name);}void *DynamicGetRuleClassById(int id){ return (void *)ClassTypeLookupById(id);}void DynamicRegisterPreprocessorProfile(char *keyword, void *stats, int layer, void *parent){#ifdef PERF_PROFILING RegisterPreprocessorProfile(keyword, (PreprocStats *)stats, layer, (PreprocStats *)parent);#endif}int DynamicProfilingPreprocs(){#ifdef PERF_PROFILING return pv.profile_preprocs_flag;#else return 0;#endif}int DynamicPreprocess(void *packet){ return Preprocess((Packet*)packet);}#ifndef DEBUGchar *no_file = "unknown";int no_line = 0;#endifint InitDynamicPreprocessors(){ int i; DynamicPreprocessorData preprocData; preprocData.version = PREPROCESSOR_DATA_VERSION; preprocData.altBuffer = &DecodeBuffer[0]; preprocData.altBufferLen = DECODE_BLEN; for (i=0;i<MAX_URIINFOS;i++) preprocData.uriBuffers[i] = (UriInfo*)&UriBufs[i]; /* Pull this out of pv.dynamic_rules_path */ preprocData.logMsg = &LogMessage; preprocData.errMsg = &ErrorMessage; preprocData.fatalMsg = &FatalError; preprocData.debugMsg = &DebugMessageFunc;#ifdef HAVE_WCHAR_H preprocData.debugWideMsg = &DebugWideMessageFunc;#endif preprocData.registerPreproc = &RegisterPreprocessor; preprocData.addPreproc = &AddPreprocessor; preprocData.addPreprocRestart = &AddFuncToPreprocRestartList; preprocData.addPreprocExit = &AddFuncToPreprocCleanExitList; preprocData.addPreprocConfCheck = &AddPreprocessorCheck; preprocData.preprocOptRegister = &RegisterPreprocessorRuleOption; preprocData.addPreprocProfileFunc = &DynamicRegisterPreprocessorProfile; preprocData.profilingPreprocsFunc = &DynamicProfilingPreprocs;#ifdef PERF_PROFILING preprocData.totalPerfStats = &totalPerfStats;#else preprocData.totalPerfStats = NULL;#endif preprocData.alertAdd = &SnortEventqAdd; preprocData.thresholdCheck = &sfthreshold_test; preprocData.inlineMode = &InlineMode; preprocData.inlineDrop = &DynamicDropInline; preprocData.detect = &DynamicDetect; preprocData.disableDetect = &DynamicDisableDetection; preprocData.disableAllDetect = &DynamicDisableAllDetection; preprocData.setPreprocBit = &DynamicSetPreprocessorBit; preprocData.streamAPI = stream_api; preprocData.searchAPI = search_api; preprocData.config_file = &file_name; preprocData.config_line = &file_line; preprocData.printfappend = &sfsnprintfappend; preprocData.tokenSplit = &mSplit; preprocData.tokenFree = &mSplitFree; preprocData.getRuleInfoByName = &DynamicGetRuleClassByName; preprocData.getRuleInfoById = &DynamicGetRuleClassById; preprocData.preprocess = &DynamicPreprocess;#ifdef DEBUG preprocData.debugMsgFile = &DebugMessageFile; preprocData.debugMsgLine = &DebugMessageLine;#else preprocData.debugMsgFile = &no_file; preprocData.debugMsgLine = &no_line;#endif preprocData.registerPreprocStats = &RegisterPreprocStats; return InitDynamicPreprocessorPlugins(&preprocData);}int InitDynamicDetectionPlugins(){ DynamicDetectionPlugin *plugin; VerifyDetectionPluginRequirements(); plugin = loadedDetectionPlugins; while (plugin) { if (plugin->initFunc()) { ErrorMessage("Failed to initialize dynamic detection library: " "%s version %d.%d.%d\n", plugin->metaData.uniqueName, plugin->metaData.major, plugin->metaData.minor, plugin->metaData.build); return -1; } plugin = plugin->next; } return 0;}int DumpDetectionLibRules(){ DynamicDetectionPlugin *plugin = loadedDetectionPlugins; DumpDetectionRules ruleDumpFunc = NULL; int retVal = 0; LogMessage("Dumping dynamic rules...\n"); while (plugin) { ruleDumpFunc = (DumpDetectionRules) getSymbol(plugin->handle, "DumpSkeletonRules", &(plugin->metaData), NONFATAL); LogMessage("Dumping dynamic rules for Library %s %d.%d.%d\n", plugin->metaData.uniqueName, plugin->metaData.major, plugin->metaData.minor, plugin->metaData.build); if (ruleDumpFunc != NULL) { if (ruleDumpFunc()) { LogMessage("Failed to open rules file %s for writing\n"); } } plugin = plugin->next; } LogMessage(" Finished dumping dynamic rules.\n"); return retVal;}int LoadDynamicPreprocessor(char *library_name, int indent){ DynamicPluginMeta metaData; /* Presume here, that library name is full path */ InitPreprocessorLibFunc preprocInit; PluginHandle handle; LogMessage("%sLoading dynamic preprocessor library %s... ", indent ? " " : "", library_name); handle = openDynamicLibrary(library_name, 1); metaData.libraryPath = library_name; GetPluginVersion(handle, &metaData); /* Just to ensure that the function exists */ preprocInit = (InitPreprocessorLibFunc) getSymbol(handle, "InitializePreprocessor", &metaData, FATAL); if (metaData.type != TYPE_PREPROCESSOR) { CloseDynamicLibrary(handle); LogMessage("failed, not a preprocessor library\n"); return 0; } AddPreprocessorPlugin(handle, preprocInit, &metaData); LogMessage("done\n"); return 0;}void LoadAllDynamicPreprocessors(char *path){ LogMessage("Loading all dynamic preprocessor libs from %s...\n", path); LoadAllLibs(path, LoadDynamicPreprocessor); LogMessage(" Finished Loading all dynamic preprocessor libs from %s\n", path);}void CloseDynamicPreprocessorLibs(){ DynamicPreprocessorPlugin *plugin = loadedPreprocessorPlugins; while (plugin) { CloseDynamicLibrary(plugin->handle); plugin = plugin->next; }}void *GetNextEnginePluginVersion(void *p){ DynamicEnginePlugin *lib = (DynamicEnginePlugin *) p; if ( lib != NULL ) { lib = lib->next; } else { lib = loadedEngines; } if ( lib == NULL ) { return lib; } return (void *) lib; }void *GetNextDetectionPluginVersion(void *p){ DynamicDetectionPlugin *lib = (DynamicDetectionPlugin *) p; if ( lib != NULL ) { lib = lib->next; } else { lib = loadedDetectionPlugins; } if ( lib == NULL ) { return lib; } return (void *) lib; }void *GetNextPreprocessorPluginVersion(void *p){ DynamicPreprocessorPlugin *lib = (DynamicPreprocessorPlugin *) p; if ( lib != NULL ) { lib = lib->next; } else { lib = loadedPreprocessorPlugins; } if ( lib == NULL ) { return lib; } return (void *) lib; }DynamicPluginMeta *GetDetectionPluginMetaData(void *p){ DynamicDetectionPlugin *lib = (DynamicDetectionPlugin *) p; DynamicPluginMeta *meta; meta = &(lib->metaData); return meta; }DynamicPluginMeta *GetEnginePluginMetaData(void *p){ DynamicEnginePlugin *lib = (DynamicEnginePlugin *) p; DynamicPluginMeta *meta; meta = &(lib->metaData); return meta; }DynamicPluginMeta *GetPreprocessorPluginMetaData(void *p){ DynamicPreprocessorPlugin *lib = (DynamicPreprocessorPlugin *) p; DynamicPluginMeta *meta; meta = &(lib->metaData); return meta; }#endif /* DYNAMIC_PLUGIN */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -