java/src/org/openantivirus/engine/credo StringsParser.java,1.4,1.5

Kurt Huwig <[email protected]> Thu, 20 May 2004 13:04:51 +0000
Newsgroups gmane.comp.security.virus.openantivirus.cvs
Message-ID <[email protected]>
Update of /cvsroot/openantivirus/java/src/org/openantivirus/engine/credo
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5503/src/org/openantivirus/engine/credo

Modified Files:
	StringsParser.java 
Log Message:
Added multipart string finder
Speed improvements

Index: StringsParser.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/credo/StringsParser.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- StringsParser.java	19 May 2004 07:33:41 -0000	1.4
+++ StringsParser.java	20 May 2004 13:04:49 -0000	1.5
@@ -27,6 +27,7 @@
 package org.openantivirus.engine.credo;
 
 import java.io.*;
+import java.util.*;
 
 import org.openantivirus.engine.censor.*;
 
@@ -50,29 +51,42 @@
         final BufferedReader br = new BufferedReader(patternReader);
         String sLine;
         while ((sLine = br.readLine()) != null) {
-            int iPos = sLine.indexOf('=');
-            if (iPos == -1) {
+            int equalsPos = sLine.indexOf('=');
+            if (equalsPos == -1) {
                 System.err.println("Malformed pattern line: " + sLine);
                 continue;
             }
             
-            String sVirusName = sLine.substring(0, iPos);
-            String sPattern   = sLine.substring(iPos + 1);
+            final int offsetStart = sLine.lastIndexOf('[');
+            final String sVirusName = sLine.substring(0, offsetStart);
+            final String sPattern   = sLine.substring(equalsPos + 1);
             
             try {
-                final int offsetStart = sLine.lastIndexOf('[');
-                final int[] skipList = new int[1];
-                skipList[0] = sPattern.length() / 2;
-                final WildcardPattern wp = new WildcardPattern(sPattern);
-                stringFinder.addString(
-                        wp.pattern,
-                        wp.skipList,
-                        offsetStart != -1
-                            ? Integer.parseInt(sLine.substring(
-                                    offsetStart + 1, iPos - 1))
-                            : 0,
-                        new StringVirusFoundListener(
-                                sVirusName.substring(0, offsetStart)));
+                if (sPattern.indexOf('*') != -1) {
+                    final StringTokenizer stOffsets = new StringTokenizer(
+                            sLine.substring(offsetStart + 1, equalsPos - 1),
+                            "*");
+                    
+                    final int partCount = stOffsets.countTokens();
+                    int part = 0;
+                    for (StringTokenizer stPatterns = new StringTokenizer(
+                            sPattern, "*");
+                         stPatterns.hasMoreTokens();
+                         part++) {
+                        stringFinder.addString(
+                                new WildcardPattern(stPatterns.nextToken()),
+                                Integer.parseInt(stOffsets.nextToken()),
+                                new StringPartFoundListener(sVirusName,
+                                                            part,
+                                                            partCount));
+                    }
+                } else {
+                    stringFinder.addString(
+                            new WildcardPattern(sPattern),
+                            Integer.parseInt(
+                                    sLine.substring(offsetStart + 1, equalsPos - 1)),
+                            new StringFoundListener(sVirusName));
+                }
             } catch (Exception e) {
                 System.err.println(sLine);
                 e.printStackTrace();
@@ -81,10 +95,10 @@
         // br may not be closed!
     }
     
-    public static class StringVirusFoundListener implements PositionFoundListener {
-        private String virusName, pattern;
+    private static class StringFoundListener implements PositionFoundListener {
+        private final String virusName;
         
-        public StringVirusFoundListener(String virusName) {
+        public StringFoundListener(String virusName) {
             this.virusName = virusName;
         }
         
@@ -94,4 +108,43 @@
         }
     }
     
+    private static class StringPartFoundListener
+    implements PositionFoundListener {
+        private static final Integer ZERO = new Integer(0);
+        
+        private final String virusName;
+        private final int part, partCount;
+
+        public StringPartFoundListener(String virusName,
+                                       int part,
+                                       int partCount) {
+            this.virusName = virusName;
+            this.part = part;
+            this.partCount = partCount;
+        }
+
+        public void positionFound(PositionFoundEvent pfe)
+        throws MalwareFoundException {
+            final Integer foundPart =
+                (Integer) pfe.entry.attributes.get(virusName);
+            
+            if (foundPart == null) {
+                if (part != 0) {
+                    return;
+                } else {
+                    pfe.entry.attributes.put(virusName, ZERO);
+                }
+            } else {
+                if (foundPart.intValue() == part - 1) {
+                    if (part == partCount - 1) {
+                        throw new MalwareFoundException(virusName, pfe.entry);
+                    } else {
+                        pfe.entry.attributes.put(virusName, new Integer(part));
+                    }
+                }
+            }
+            
+            
+        }
+    }
 }



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click