java/src/org/openantivirus/engine/censor/trie Trie.java,1.1,1.2 PositionFoundEvent.java,1.1,1.2 StringFinder.java,1.1,1.2 TrieCensor.java,1.1,1.2

Kurt Huwig <[email protected]> Tue, 18 May 2004 09:03:30 +0000
Newsgroups gmane.comp.security.virus.openantivirus.cvs
Message-ID <[email protected]>
Update of /cvsroot/openantivirus/java/src/org/openantivirus/engine/censor/trie
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8196/src/org/openantivirus/engine/censor/trie

Modified Files:
	Trie.java PositionFoundEvent.java StringFinder.java 
	TrieCensor.java 
Log Message:
Added '?'-wildcard pattern matching

Index: Trie.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/censor/trie/Trie.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- Trie.java	14 Dec 2003 11:08:26 -0000	1.1
+++ Trie.java	18 May 2004 09:03:27 -0000	1.2
@@ -36,7 +36,7 @@
  * @version $Revision$
  */
 public class Trie {
-    public final static int MINIMUM_LENGTH = 4;
+    public final static int MINIMUM_LENGTH = 3;
     
     private TrieNode nRoot = new TrieNode();
     
@@ -52,7 +52,7 @@
         
         // add nodes into the tree for the prefix with length MINIMUM_LENGTH
         for (int i = 0; i < MINIMUM_LENGTH; i++) {
-            int iCharacter = (abPattern[i] + 256) & 0xff;
+            int iCharacter = abPattern[i] & 0xff;
             
             TrieNode next = nPos.isLastNode() ? null
                                               : nPos.getTrans(iCharacter);

Index: TrieCensor.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/censor/trie/TrieCensor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- TrieCensor.java	14 Dec 2003 11:08:26 -0000	1.1
+++ TrieCensor.java	18 May 2004 09:03:27 -0000	1.2
@@ -43,7 +43,7 @@
     private static final int BUFFER_SIZE = 32768;
 
     private TrieNode nRoot, nCurrent;
-
+    
     public TrieCensor(Trie trie) {
         nRoot = trie.getRootNode();
     }
@@ -60,7 +60,8 @@
                 is.close();
             }
             
-            return 0;
+            return NOTHING_FOUND;
+            
         } catch (IOException ioe) {
             throw new ScanException(ioe);
         }
@@ -127,7 +128,7 @@
                           int iOffset,
                           int iLength,
                           int iPrefix,
-                          int iPostfix) throws MalwareFoundException {
+                          int iSuffix) throws MalwareFoundException {
         for (int i = iOffset; i < iOffset + iLength; i++) {
             nCurrent = nCurrent.getTrans(ab[ i ] & 0xff);
             if (nCurrent.isLastNode()) {
@@ -139,8 +140,7 @@
                         iPosition,
                         Trie.MINIMUM_LENGTH,
                         iPosition - iOffset + iPrefix,
-                        iOffset + iLength - iPosition + iPostfix
-                            - Trie.MINIMUM_LENGTH);
+                        iOffset + iLength - iPosition + iSuffix);
                 
                 for (Iterator it =
                         nCurrent.getStringSearchListener().iterator();

Index: PositionFoundEvent.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/censor/trie/PositionFoundEvent.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- PositionFoundEvent.java	14 Dec 2003 11:08:26 -0000	1.1
+++ PositionFoundEvent.java	18 May 2004 09:03:27 -0000	1.2
@@ -39,7 +39,7 @@
     public final byte[] buffer;
     public final VfsEntry entry;
     public final long fileOffset;
-    public final int bufferOffset, length, prefix, postfix;
+    public final int bufferOffset, length, prefix, suffix;
 
     /**
      * @param entry the entry containing the position
@@ -48,18 +48,18 @@
      * @param bufferOffset offset of the start of the string within the buffer
      * @param length length of the string found
      * @param prefixLength number of valid bytes before the offset byte
-     * @param postfixLength number of valid bytes after the offset byte
+     * @param suffixLength number of valid bytes after the offset byte
      */
     public PositionFoundEvent(VfsEntry entry,
                               long fileOffset,
                               byte[] buffer, int bufferOffset, int length,
-                              int prefix, int postfix) {
+                              int prefix, int suffix) {
         this.entry        = entry;
         this.fileOffset   = fileOffset;
         this.buffer       = buffer;
         this.bufferOffset = bufferOffset;
         this.length       = length;
         this.prefix       = prefix;
-        this.postfix      = postfix;
+        this.suffix       = suffix;
     }
 }
\ No newline at end of file

Index: StringFinder.java
===================================================================
RCS file: /cvsroot/openantivirus/java/src/org/openantivirus/engine/censor/trie/StringFinder.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- StringFinder.java	14 Dec 2003 11:08:26 -0000	1.1
+++ StringFinder.java	18 May 2004 09:03:27 -0000	1.2
@@ -42,39 +42,73 @@
         this.trie = trie;
     }
     
-    public void addString(byte[] abPattern, PositionFoundListener pfl) {
-        trie.addString(abPattern,
-                       new PartialStringFoundListener(abPattern, pfl));
+    public void addString(byte[] abPattern,
+                          int[] skipList,
+                          int offset,
+                          PositionFoundListener pfl) {
+        final byte[] searchPattern = new byte[Trie.MINIMUM_LENGTH];
+        System.arraycopy(abPattern, offset,
+                         searchPattern, 0, Trie.MINIMUM_LENGTH);
+        trie.addString(searchPattern,
+                       new PartialStringFoundListener(abPattern,
+                                                      skipList,
+                                                      offset,
+                                                      pfl));
     }
     
     private class PartialStringFoundListener implements PositionFoundListener {
-        private byte[]                abPattern;
+        private byte[] abPattern;
+        private int [] skipList;
+        private int offset;
         private PositionFoundListener pfl;
         
         public PartialStringFoundListener(byte[] abPattern,
+                                          int[] skipList,
+                                          int offset,
                                           PositionFoundListener pfl) {
             this.abPattern = abPattern;
+            this.skipList  = skipList;
+            this.offset    = offset;
             this.pfl       = pfl;
         }
         
         public void positionFound(PositionFoundEvent pfe)
         throws MalwareFoundException {
-            byte[] abBuffer    = pfe.buffer;
-            int    iBufferPos  = pfe.bufferOffset + pfe.length;
-            int    iPostfixEnd = pfe.bufferOffset + pfe.length
-                                 + pfe.postfix;
+            if (pfe.fileOffset < offset) {
+                return;
+            }
             
-            for (int i = pfe.length; i < abPattern.length; i++) {
+            byte[] abBuffer = pfe.buffer;
+            
+            int iBufferPos  = pfe.bufferOffset - offset;
+            if (iBufferPos < 0) {
+                iBufferPos += abBuffer.length;
+            }
+            
+            int iSuffixEnd = pfe.bufferOffset + pfe.suffix;
+
+            boolean skip = false;
+            int skipIndex = 0;
+            int skipCount = skipList[0];
+            for (int i = 0; i < abPattern.length; i++) {
                 iBufferPos %= abBuffer.length;
-                if (iBufferPos == iPostfixEnd) {
+                if (iBufferPos == iSuffixEnd) {
                     return;
                 }
                 
-                if (abPattern[i] != abBuffer[iBufferPos]) {
+                if (skipCount == 0) {
+                    skipCount = skipList[++skipIndex];
+                    skip = !skip;
+                }
+                
+                skipCount--;
+                
+                if (!skip && abPattern[i] != abBuffer[iBufferPos]) {
                     return;
                 }
                 iBufferPos++;
             }
+            
             pfl.positionFound(pfe);
         }
     }



-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click