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