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