The following is an example of a simple preprocessor. This preprocessor always alerts on a packet if the TCP port matches the one configured.
The following code is defined in spp_example.c and is compiled together with libsf_dynamic_preproc.a, using pkg-config, into lib_sfdynamic_preprocessor_example.so.
Define the required meta data variables.
#define GENERATOR_EXAMPLE 256 extern DynamicPreprocessorData _dpd; const int MAJOR_VERSION = 1; const int MINOR_VERSION = 0; const int BUILD_VERSION = 0; const char *PREPROC_NAME = "SF_Dynamic_Example_Preprocessor"; #define ExampleSetup DYNAMIC_PREPROC_SETUP
Define the Setup function to register the initialization function.
void ExampleInit(unsigned char *);
void ExampleProcess(void *, void *);
void ExampleSetup()
{
_dpd.registerPreproc("dynamic_example", ExampleInit);
DEBUG_WRAP(_dpd.debugMsg(DEBUG_PLUGIN, "Preprocessor: Example is setup\n"););
}
The initialization function to parse the keywords from snort.conf.
u_int16_t portToCheck;
void ExampleInit(unsigned char *args)
{
char *arg;
char *argEnd;
unsigned long port;
_dpd.logMsg("Example dynamic preprocessor configuration\n");
arg = strtok(args, " \t\n\r");
if(!strcasecmp("port", arg))
{
arg = strtok(NULL, "\t\n\r");
if (!arg)
{
_dpd.fatalMsg("ExamplePreproc: Missing port\n");
}
port = strtoul(arg, &argEnd, 10);
if (port < 0 || port > 65535)
{
_dpd.fatalMsg("ExamplePreproc: Invalid port %d\n", port);
}
portToCheck = port;
_dpd.logMsg(" Port: %d\n", portToCheck);
}
else
{
_dpd.fatalMsg("ExamplePreproc: Invalid option %s\n", arg);
}
/* Register the preprocessor function, Transport layer, ID 10000 */
_dpd.addPreproc(ExampleProcess, PRIORITY_TRANSPORT, 10000);
DEBUG_WRAP(_dpd.debugMsg(DEBUG_PLUGIN, "Preprocessor: Example is initialized\n"););
}
The function to process the packet and log an alert if the either port matches.
#define SRC_PORT_MATCH 1
#define SRC_PORT_MATCH_STR "example_preprocessor: src port match"
#define DST_PORT_MATCH 2
#define DST_PORT_MATCH_STR "example_preprocessor: dest port match"
void ExampleProcess(void *pkt, void *context)
{
SFSnortPacket *p = (SFSnortPacket *)pkt;
if (!p->ip4_header || p->ip4_header->proto != IPPROTO_TCP || !p->tcp_header)
{
/* Not for me, return */
return;
}
if (p->src_port == portToCheck)
{
/* Source port matched, log alert */
_dpd.alertAdd(GENERATOR_EXAMPLE, SRC_PORT_MATCH,
1, 0, 3, SRC_PORT_MATCH_STR, 0);
return;
}
if (p->dst_port == portToCheck)
{
/* Destination port matched, log alert */
_dpd.alertAdd(GENERATOR_EXAMPLE, DST_PORT_MATCH,
1, 0, 3, DST_PORT_MATCH_STR, 0);
return;
}
}