⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acsmx.c

📁 linux下IDS软件,来源于snort社团.
💻 C
📖 第 1 页 / 共 2 页
字号:
		    if( !px )		    {		    printf("*** Out of memory Initializing Aho Corasick in acsmx.c ****");		    }			    /* Insert at front of MatchList */ 		    px->next = acsm->acsmStateTable[s].MatchList;		    acsm->acsmStateTable[s].MatchList = px;		}	    }	}    }      /* Clean up the queue */     queue_free (queue);}/**   Build Deterministic Finite Automata from NFA*/ static voidConvert_NFA_To_DFA (ACSM_STRUCT * acsm) {  int r, s;  int i;  QUEUE q, *queue = &q;      /* Init a Queue */     queue_init (queue);      /* Add the state 0 transitions 1st */     for (i = 0; i < ALPHABET_SIZE; i++)    {      s = acsm->acsmStateTable[0].NextState[i];      if (s)	{	  queue_add (queue, s);	}    }      /* Start building the next layer of transitions */     while (queue_count (queue) > 0)    {      r = queue_remove (queue);      	/* State is a branch state */ 	for (i = 0; i < ALPHABET_SIZE; i++)	{	  if ((s = acsm->acsmStateTable[r].NextState[i]) != ACSM_FAIL_STATE)	    {	      queue_add (queue, s);	    }	  else	    {	      acsm->acsmStateTable[r].NextState[i] =		acsm->acsmStateTable[acsm->acsmStateTable[r].FailState].		NextState[i];	    }	}    }      /* Clean up the queue */     queue_free (queue);}/***/ ACSM_STRUCT * acsmNew () {  ACSM_STRUCT * p;  init_xlatcase ();  p = (ACSM_STRUCT *) AC_MALLOC (sizeof (ACSM_STRUCT));  MEMASSERT (p, "acsmNew");  if (p)    memset (p, 0, sizeof (ACSM_STRUCT));  return p;}/**   Add a pattern to the list of patterns for this state machine*/ intacsmAddPattern (ACSM_STRUCT * p, unsigned char *pat, int n, int nocase,		int offset, int depth, void * id, int iid) {  ACSM_PATTERN * plist;  plist = (ACSM_PATTERN *) AC_MALLOC (sizeof (ACSM_PATTERN));  MEMASSERT (plist, "acsmAddPattern");  plist->patrn = (unsigned char *) AC_MALLOC (n);  ConvertCaseEx (plist->patrn, pat, n);  plist->casepatrn = (unsigned char *) AC_MALLOC (n);  memcpy (plist->casepatrn, pat, n);  plist->n = n;  plist->nocase = nocase;  plist->offset = offset;  plist->depth = depth;  plist->id = id;  plist->iid = iid;  plist->next = p->acsmPatterns;  p->acsmPatterns = plist;  return 0;}/**   Compile State Machine*/ intacsmCompile (ACSM_STRUCT * acsm) {  int i, k;  ACSM_PATTERN * plist;      /* Count number of states */     acsm->acsmMaxStates = 1;  for (plist = acsm->acsmPatterns; plist != NULL; plist = plist->next)    {      acsm->acsmMaxStates += plist->n;    }  acsm->acsmStateTable =    (ACSM_STATETABLE *) AC_MALLOC (sizeof (ACSM_STATETABLE) *				   acsm->acsmMaxStates);  MEMASSERT (acsm->acsmStateTable, "acsmCompile");  memset (acsm->acsmStateTable, 0,	    sizeof (ACSM_STATETABLE) * acsm->acsmMaxStates);      /* Initialize state zero as a branch */     acsm->acsmNumStates = 0;      /* Initialize all States NextStates to FAILED */     for (k = 0; k < acsm->acsmMaxStates; k++)    {      for (i = 0; i < ALPHABET_SIZE; i++)	{	  acsm->acsmStateTable[k].NextState[i] = ACSM_FAIL_STATE;	}    }      /* Add each Pattern to the State Table */     for (plist = acsm->acsmPatterns; plist != NULL; plist = plist->next)    {      AddPatternStates (acsm, plist);    }      /* Set all failed state transitions to return to the 0'th state */     for (i = 0; i < ALPHABET_SIZE; i++)    {      if (acsm->acsmStateTable[0].NextState[i] == ACSM_FAIL_STATE)	{	  acsm->acsmStateTable[0].NextState[i] = 0;	}    }      /* Build the NFA  */     Build_NFA (acsm);      /* Convert the NFA to a DFA */     Convert_NFA_To_DFA (acsm);      /*      printf ("ACSMX-Max Memory: %d bytes, %d states\n", max_memory,	     acsm->acsmMaxStates);     */      //Print_DFA( acsm );    return 0;}static unsigned char Tc[64*1024];/**   Search Text or Binary Data for Pattern matches*/   intacsmSearch (ACSM_STRUCT * acsm, unsigned char *Tx, int n,	    int (*Match) (void *  id, int index, void *data), void *data) {  int state;  ACSM_PATTERN * mlist;  unsigned char *Tend;  ACSM_STATETABLE * StateTable = acsm->acsmStateTable;  int nfound = 0;  unsigned char *T;  int index;    /* Case conversion */   ConvertCaseEx (Tc, Tx, n);  T = Tc;  Tend = T + n;   for (state = 0; T < Tend; T++)    {      state = StateTable[state].NextState[*T];      if( StateTable[state].MatchList != NULL )	{	  for( mlist=StateTable[state].MatchList; mlist!=NULL;	       mlist=mlist->next )	    {	      index = T - mlist->n + 1 - Tc;	      if( mlist->nocase )		{		  nfound++;		  if (Match (mlist->id, index, data))		    return nfound;		}	      else		{		  if( memcmp (mlist->casepatrn, Tx + index, mlist->n) == 0 )		    {		      nfound++;		      if (Match (mlist->id, index, data))			return nfound;		    }		}	    }	}    }  return nfound;}/**   Free all memory*/   voidacsmFree (ACSM_STRUCT * acsm) {  int i;  ACSM_PATTERN * mlist, *ilist;  for (i = 0; i < acsm->acsmMaxStates; i++)        {      if (acsm->acsmStateTable[i].MatchList != NULL)		{	  mlist = acsm->acsmStateTable[i].MatchList;	  while (mlist)	    	    {	      ilist = mlist;	      mlist = mlist->next;	      AC_FREE (ilist);	    }	}    }  AC_FREE (acsm->acsmStateTable);}/* *  */ /*static void Print_DFA( ACSM_STRUCT * acsm ){    int k;    int i;    int next;        for (k = 0; k < acsm->acsmMaxStates; k++)    {      for (i = 0; i < ALPHABET_SIZE; i++)	{	  next = acsm->acsmStateTable[k].NextState[i];	  if( next == 0 || next ==  ACSM_FAIL_STATE )	  {           if( isprint(i) )             printf("%3c->%-5d\t",i,next);           else             printf("%3d->%-5d\t",i,next);	  }	}      printf("\n");    }    } */	int acsmPrintDetailInfo(ACSM_STRUCT * p){    return 0;}	int acsmPrintSummaryInfo(ACSM_STRUCT *acsm ){#ifdef XXXXX    char * fsa[]={      "TRIE",      "NFA",      "DFA",    };    ACSM_STRUCT2 * p = &summary.acsm;    if( !summary.num_states )	    return;        printf("+--[Pattern Matcher:Aho-Corasick Summary]----------------------\n");    printf("| Alphabet Size    : %d Chars\n",p->acsmAlphabetSize);    printf("| Sizeof State     : %d bytes\n",sizeof(acstate_t));    printf("| Storage Format   : %s \n",sf[ p->acsmFormat ]);    printf("| Num States       : %d\n",summary.num_states);    printf("| Num Transitions  : %d\n",summary.num_transitions);    printf("| State Density    : %.1f%%\n",100.0*(double)summary.num_transitions/(summary.num_states*p->acsmAlphabetSize));    printf("| Finite Automatum : %s\n", fsa[p->acsmFSA]);    if( max_memory < 1024*1024 )    printf("| Memory           : %.2fKbytes\n", (float)max_memory/1024 );    else    printf("| Memory           : %.2fMbytes\n", (float)max_memory/(1024*1024) );    printf("+-------------------------------------------------------------\n");#endif    return 0;}#ifdef ACSMX_MAIN  /**  Text Data Buffer*/ unsigned char text[512];/* *    A Match is found*/   intMatchFound (unsigned id, int index, void *data) {  fprintf (stdout, "%s\n", (char *) id);  return 0;}/***/   intmain (int argc, char **argv) {  int i, nocase = 0;  ACSM_STRUCT * acsm;  if (argc < 3)        {      fprintf (stderr,		"Usage: acsmx pattern word-1 word-2 ... word-n  -nocase\n");      exit (0);    }  acsm = acsmNew ();  strcpy (text, argv[1]);  for (i = 1; i < argc; i++)    if (strcmp (argv[i], "-nocase") == 0)      nocase = 1;  for (i = 2; i < argc; i++)        {      if (argv[i][0] == '-')	continue;      acsmAddPattern (acsm, argv[i], strlen (argv[i]), nocase, 0, 0,			argv[i], i - 2);    }  acsmCompile (acsm);  acsmSearch (acsm, text, strlen (text), MatchFound, (void *) 0);  acsmFree (acsm);  printf ("normal pgm end\n");  return (0);}#endif /*  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -