Shared Object Rules
Shared object rules are written in C++ and loaded by Snort at runtime.
The following is a simple Snort3 SO rule example:
#include "main/snort_types.h"
#include "framework/so_rule.h"
using namespace snort;
static const char* rule_1337 = R"[Snort_SO_Rule](
alert tcp any any -> any any (
msg:"SERVER-OTHER SO Example";
soid:1337;
flow:to_server,established;
content:"foo",nocase;
so:eval;
gid:3;
sid:1337;
)
)[Snort_SO_Rule]";
static const unsigned rule_1337_len = 0;
static IpsOption::EvalStatus rule_1337_eval(void*, Cursor&, Packet*)
{
return IpsOption::MATCH;
}
static SoEvalFunc rule_1337_ctor(const char* /*so*/, void** pv)
{
*pv = nullptr;
return rule_1337_eval;
}
static const SoApi so_1337 =
{
{
PT_SO_RULE,
sizeof(SoApi),
SOAPI_VERSION,
0, // version
API_RESERVED,
API_OPTIONS,
"1337",
"SERVER-OTHER SO Example",
nullptr,
nullptr
},
(uint8_t*)rule_1337,
rule_1337_len,
nullptr, // pinit
nullptr, // pterm
nullptr, // tinit
nullptr, // tterm
rule_1337_ctor, // ctor
nullptr // dtor
};
const BaseApi* pso_1337 = &so_1337.base;
SO_PUBLIC const BaseApi* snort_plugins[] =
{
pso_1337,
nullptr
};