DE60319418T2 - Verfahren und system zur heuristischen erkennung von viren in ausführbarem programmkode - Google Patents

Verfahren und system zur heuristischen erkennung von viren in ausführbarem programmkode Download PDF

Info

Publication number
DE60319418T2
DE60319418T2 DE60319418T DE60319418T DE60319418T2 DE 60319418 T2 DE60319418 T2 DE 60319418T2 DE 60319418 T DE60319418 T DE 60319418T DE 60319418 T DE60319418 T DE 60319418T DE 60319418 T2 DE60319418 T2 DE 60319418T2
Authority
DE
Germany
Prior art keywords
file
program code
program
instructions
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
DE60319418T
Other languages
English (en)
Other versions
DE60319418D1 (de
Inventor
Alexander Shipp
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
MessageLabs Ltd
Original Assignee
MessageLabs Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by MessageLabs Ltd filed Critical MessageLabs Ltd
Application granted granted Critical
Publication of DE60319418D1 publication Critical patent/DE60319418D1/de
Publication of DE60319418T2 publication Critical patent/DE60319418T2/de
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L51/00User-to-user messaging in packet-switching networks, transmitted according to store-and-forward or real-time protocols, e.g. e-mail
    • H04L51/21Monitoring or handling of messages
    • H04L51/212Monitoring or handling of messages using filtering or selective blocking

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Virology (AREA)
  • Health & Medical Sciences (AREA)
  • General Physics & Mathematics (AREA)
  • General Health & Medical Sciences (AREA)
  • Devices For Executing Special Programs (AREA)
  • Measuring Or Testing Involving Enzymes Or Micro-Organisms (AREA)
  • Debugging And Monitoring (AREA)
  • Electrotherapy Devices (AREA)
  • Selective Calling Equipment (AREA)
  • Measuring Pulse, Heart Rate, Blood Pressure Or Blood Flow (AREA)
  • Storage Device Security (AREA)
  • Stored Programmes (AREA)

Description

  • Die vorliegende Erfindung betrifft ein Verfahren und ein System zur heuristischen Erkennung von Viren in ausführbarem Code durch Analysieren der Frequenzverteilung von erzeugtem Maschinencode.
  • Eine übliche Form der Infektion mit einem Computervirus ist, dass der ausführbare Code des Virus an ein Programm oder eine andere Computerdatei, die ausführbaren Code enthält, angehangen oder in diese/s eingebettet wird, die oberflächlich betrachtet gutartig erscheint. Eine weit verbreitete Methode der Verbreitung eines Virus ist es, dass sich der Virus, sobald er auf einem Wirt-Gerät, wie beispielsweise dem PC eines Users, aktiviert ist, derart an ein oder mehrere Programme, die auf dem Wirt gefunden werden, anhängt, dass das Programm, sobald es gestartet wird, den Code des Virus ausführt, so dass diesem die Gelegenheit gegeben wird, sich erneut zu verbreiten und/oder sein bösartiges Verhalten (wie zum Beispiel die Zerstörung von Dateien etc.), für das er programmiert wurde, durchzuführen. Diese Methode der Verbreitung bietet selbstverständlich eine Gelegenheit, den Virus zu entdecken, zum Beispiel durch Zuordnen von Prüfsummen zu Programmdateien und Erkennen, wenn sich die Prüfsumme verändert. Dies ist selbstverständlich nur eine von vielen Strategien, die zum Erkennen von Viren erdacht wurden.
  • Ein anderes bekanntes Verfahren zum Erkennen von Viren, das in vielen der erhältlichen Antivirus-Softwarepakete implementiert ist, umfasst das Scannen eines Programms oder anderer Dateien nach bestimmten charakteristischen Sequenzen von Bytes (bekannt als Signaturen), die das wahrscheinliche Vorhandensein eines Virus anzeigen. Eins der Probleme in der Praxis bei der Signatur-basierten Erkennung ist, dass einige Kenntnisse und ein beträchtlicher Zeitaufwand erforderlich sind, wenn ein neuer Virus das erste Mal erkannt wird, um eine verwendbare charakteristische Signatur für diesen festzulegen. Diese Signatur muss so sein, dass nicht zu viele falsche Positiv-Meldungen erzeugt werden und den Virus nicht falsch identifizieren, zum Beispiel als einen existierenden mit weiteren gutartigen Nutzdaten. Die Information über diese Signatur muss dann an Sites verbreitet werden, die das in Frage kommende Antivirus-Paket verwenden, bevor es dort verwendet werden kann, um den neu identifizierten Virus zu erkennen. In den letzten Jahren waren an vielen der beachtlichen Viren-Ausbrüche Viren beteiligt, die sich über das Internet verbreiten, und die Herausgeber von Antivirus-Software brauchen Zeit zu reagieren, wenn ein Virus ausbricht.
  • Einige Internetdienst-Anbieter bieten das Antivirus-Scannen von Internet-Traffic, der über ihre Internet-Knoten geht, als zusätzlichen Dienst an.
  • In WO 01/69356 wird ein Verfahren zur heuristischen Erkennung von Viren unter Verwendung eines Histogramms beschrieben.
  • Die vorliegende Erfindung betrifft ein Verfahren zur Erkennung von Viren, welches als nützlich für ISPs (ISP = Internet Service Provider; Internetdienst-Anbieter (Provider)) erachtet wird, die ein Antivirus-Scannen durchführen, zum Beispiel von Ausführbarem, wie beispiels weise Programmdateien, die an E-Mails angehangen sind, obwohl es keinesfalls auf diese Anwendung beschränkt ist und in jedem Antivirus-Paket verwendet werden kann.
  • Gemäß der vorliegenden Erfindung wird ein Verfahren zum Scannen einer Computerdatei auf Virusinfektionen vorgesehen, wobei das Verfahren aufweist:
    • a) Identifizieren von Programmcode innerhalb der Datei;
    • b) Identifizieren des Compilers, der verwendet wurde, um den Programmcode zu erzeugen;
    • c) Bestimmen der Frequenzverteilung von ausgewählten Maschinencode-Instruktionen oder Sequenzen von solchen Instruktionen in dem Programmcode; und
    • d) Kennzeichnen der Datei als möglicherweise mit einem Virus infiziert, oder nicht, auf der Basis eines Vergleichs der bestimmten Frequenzverteilung mit einer Frequenzverteilung von Maschinencode-Instruktionen oder Sequenzen davon, die für diesen Compiler erwartet werden.
  • Mit der vorliegenden Erfindung wird ebenfalls ein System zum Scannen einer Computerdatei auf Virusinfektionen vorgesehen, welches aufweist:
    • a) Mittel zum Identifizieren von Programmcode innerhalb der Datei;
    • b) Mittel zum Identifizieren des Compilers, der verwendet wurde, um den Programmcode zu erzeugen;
    • c) Mittel zum Bestimmen der Frequenzverteilung von ausgewählten Maschinencode-Instruktionen oder Sequenzen von solchen Instruktionen in dem Programmcode; und
    • d) Mittel zum Kennzeichnen der Datei als möglicherweise mit einem Virus infiziert, oder nicht, auf der Basis eines Vergleichs der bestimmten Frequenzverteilung mit einer Frequenzverteilung von Maschinencode-Instruktionen oder Sequenzen davon, die für diesen Compiler erwartet werden.
  • Die Erfindung wird weiter beschrieben anhand eines nicht einschränkenden Beispiels unter Bezugnahme auf die beigefügten Zeichnungsfiguren, in denen:
  • 1 ein kombiniertes Block- und Ablaufdiagramm der Arbeitsweise einer Virusscan-Engine gemäß einer beispielhaften Ausführungsform der vorliegenden Erfindung ist; und
  • 2 ein Ablaufdiagramm der Arbeitsweise eines Beispiels für den Instruktions-Frequenzanalysators aus 1 ist.
  • Im Folgenden werden hexadezimale Werte mit einer vorstehenden 0x wie folgt dargestellt: 0xff78. 0x???? wird verwendet, um einen hexadezimalen Wert darzustellen, wobei der Wert nicht von Belang ist.
  • Zunächst wird Terminologie erläutert.
  • "MD5 (message digest 5) Prüfsumme": MD5 ist ein Einweg-Hash-Algorithmus – er erzeugt nach Analysieren eines Byte-Stroms – wie beispielsweise einer Datei – eine große Zahl (die MD5-Prüfsumme). Die Wahrscheinlichkeit, dass für zwei Dateien die gleiche große Zahl erzeugt wird, ist gering. Es ist ebenfalls sehr schwierig, eine Datei herzustellen, die irgendeine bestimmte MD5-Prüfsumme erzeugt.
  • "Falsch positiv": Ein falsch positiv tritt auf, wenn ein Antivirus-Produkt eine bestimmte Datei 'a' als Malware identifiziert, die keine ist.
  • "regulärer Ausdruck": Reguläre Ausdrücke sind Strings, die zur Mustererkennung verwendet werden können. Beispielsweise entspricht der reguläre Perl-Ausdruck
    /^he1lo [0–9]+/
    jeden String, der mit den Buchstaben 'hello' startet, wonach eine Leertaste folgt, danach eine oder mehr Stellen.
  • "Speicherabbild": Ein Speicherabbild ist ein eins-zu-eins-Abgleich der Stellen, die ein Programm belegen würde, wenn es in den Speicher geladen würde, zusammen mit einigen anderen Stellen. Somit könnte, wenn ein Programm die Stellen 0x400000 bis 0x410000 belegen würde, wenn es geladen wäre, ein Speicherabbild von 0x100000 bis 0x110000 erstellt werden. Wann immer das Programm auf eine bestimmte Stelle Bezug nähme, könnte (in diesem Fall) die äquivalente Stelle im Speicherabbild bestimmt werden, indem 0x300000 abgezogen würden. Somit bildet sich 0x400000 auf 0x100000 ab, 0x400001 bildet sich auf 0x100001 ab, und so weiter.
  • "Compiler": Gemäß strikter Anwendung erzeugt ein Compiler ein oder mehrere Objektmodule aus Programm-Quellcode. Diese Objektmodule sind üblicherweise per se nicht ausführbare Programme, sondern sie benötigen einen zusätzlichen Schritt des Verknüpfens mittels eines Linkers. Die Aufgabe eines Linkers ist üblicherweise, ein Abbild einer ausführbaren Datei zu erzeugen, indem das (die) Objektmodul(e) mit externen binären Programmbibliotheken (Libraries), auf die das (die) Modul(e) Bezug nimmt (nehmen), verknüpft werden; die Erzeugung eines Abbilds kann das Voranstellen eines Header-Bereiches gemäß eines ausführbaren Dateilayouts eines Ziel-Betriebssystems wie auch das Hinzufügen von Ressourcen wie beispielsweise Bitmaps und Ähnliches beinhalten. Der Ausdruck "Compiler" wie hier verwendet soll einen Linker umfassen, sofern dieser aus technischer Sicht erforderlich ist. Das, was der Compiler erzeugt, ist nicht notwendigerweise ein eigenständiges Programm, denn selbstverständlich: Compiler erzeugen ebenfalls ausführbare Dateien, wie beispielsweise dynamische Verbindungsbibliotheken (DLL = dynamic link library) und Gerätetreiber.
  • Compiler weisen oftmals Compiler-Flags auf (ebenso als "Schalter" bekannt), die von dem Benutzer gesetzt werden können und die den Kompiliervorgang und den erzeugten Code beeinflussen. Compiler-Flags können zum Beispiel steuern, ob erzeugter Code auf Geschwindigkeit, Code-Größe oder gar nicht optimiert wird, ob Stack-Frames für Subroutinen-Aufrufe verwendet werden sollen und so weiter. Unterschiedliche Einstellungen dieser Flags können die Frequenzverteilung von Instruktionen in dem erzeugten Code beeinflussen, und Ausführungsformen der Erfindung können dies berücksichtigen, indem erwartete Frequenzdaten für eine Vielzahl von Kombinationen der Compiler-Flag-Einstellungen pro Compiler vorhanden sind.
  • Der Ausdruck "Computerdatei" wie hier verwendet soll in einem allgemeinen Sinn verstanden werden und ist insbesondere nicht auf Dateien auf Platte (on-disk) beschränkt.
  • Um die Kontrolle zu übernehmen, muss ein Virus sich selbst in den Ausführungspfad von Programmcode einfügen. Der Virus-Code wird ursprünglich von einem bestimmten Compiler oder Assembler erzeugt worden sein und fügt sich üblicherweise selber in ein Programm ein, das von einem anderen Compiler oder Assembler erzeugt wurde. Oftmals erzeugt ein bestimmter Compiler Code, der als von diesem Compiler oder dieser Compiler-Familie stammend erkannt wird. Wenn dies der Fall ist, kann es möglich sein zu bestimmen, dass der eingefügte virale Code nicht von dem Compiler erzeugt wurde, der den Rest des Programms erzeugt hat, indem die tatsächliche Frequenzverteilung von Instruktionen in dem Programm mit der erwarteten Frequenzverteilung von Instruktionen, die von dem identifizierten Compiler erzeugt wurden, verglichen wird. Das Programm kann dann entweder als verdächtig oder als von einem Virus infiziert gekennzeichnet werden.
  • 1 stellt in Blockform eine Form eines Viruserkennungssystems 10 dar, das die vorliegende Erfindung verkörpert und das in einer Virusscan-Engine enthalten sein kann. Die Gesamt-Arbeitsweise dieses Systems 10 ist wie folgt:
    Zu scannende Dateien werden aufeinanderfolgend auf einen Eingang 20 angewendet, bilden zum Beispiel eine Eingangsschlange; wie Dateien in dieser Schlange angeordnet werden und von welcher (welchen) Quelle(n), ist für die vorliegende Erfindung nicht direkt von Belang, aber sie können beispielsweise Anhänge von E-Mails sein, die von einem Mail-Gateway bei einem ISP verarbeitet werden, oder Dateien in einem Verzeichnis, das von einem Platten-Scanvorgang verarbeitet wird.
  • Jede zu verarbeitende Datei wird an einen Dateityp-Analysator 30 gegeben, der versucht, anhand der Inhalte den Dateityp zu identifizieren. Beispielsweise kann sie ein Programm oder ein Nicht-Programm sein. Eine Nicht-Programm-Datei wird/werden nicht weiter analysiert, und die Verarbeitung wird bei 40 abgebrochen. Eine Datei, die für ein Programm gehalten wird, wird weiter abhängig von ihrem Typ klassifiziert – zum Beispiel DOS, Windows PE, Windows NE, Linux ELF, Macintosh etc. Wenn der Dateityp-Analysator 30 bestimmt, dass der Dateityp bekannt ist, wird die Datei weiter vom Compiler-Analysator 50 verarbeitet, welcher versucht, den Compiler zu identifizieren, der zur Erzeugung des Codes in der Datei verwendet wurde; falls er dabei scheitert, wird die Verarbeitung der Datei bei 40 abgebrochen, andernfalls wird die Datei als Nächstes von einem Instruktionsfrequenz-Analysator 60 verarbeitet.
  • Der Analysator 60 führt effektiv das Reverse Engineering des Programms durch und bereitet eine Aufstellung der Frequenzverteilung bestimmter Maschinencode-Opcodes und/oder Opcode-Konstrukte vor, wie nachstehend genauer beschrieben wird. Diese Aufstellung wird an einen Frequenzverteilungs-Prüfer 70 gegeben, wo sie mit einer oder mehreren Sätzen von charakteristischen Frequenzverteilungen, die in einer Datenbank 80 bereitgehalten werden, für den identifizierten Compiler verglichen wird. Jeder gegebene Compiler/Linker kann in der Lage sein, mehr als einen Typ ausführbare Datei zu erzeugen (GUI-Anwendung, Konsolen-Anwendung, Gerätetreiber etc.), und der Kompilierungs-/Linker-Ablauf kann beeinflusst werden von der Einstellung eines oder mehrerer Compiler-/Linker-Flags (zum Beispiel Flags, um das Erzeugen von Stack-Frames für Subroutinen-Aufrufe zu steuern oder nicht, um anzuzeigen, ob das erzeugte Programm eine Debug-Version ist, etc.), was verschiedene erwartete Frequenzverteilungen ergeben kann, die in der Datenbank gespeichert werden können und individuell zur Berücksichtigung von Frequenzverteilungs-Prüfer 70 ausgewählt werden können.
  • Wenn der Frequenzverteilungs-Prüfer 70 bestimmt, dass die tatsächliche Frequenzverteilung von Analysator 60 mit der für den identifizierten Compiler erwarteten ausreichend genau übereinstimmt, wird die Verarbeitung der Datei bei 40 nicht fortgesetzt; anderenfalls wird die Datei als verdächtig und möglicherweise einen Virus enthaltend erachtet. Um die Anzahl falsch Positiver zu verringern, werden verdächtige Dateien von einem Ausnahmelisten-Prüfer gegen eine Ausnahmeliste abgeglichen, das heißt, dass Dateien, die, obwohl sie gemäß Frequenzverteilungs-Prüfer 70 verdächtig sind, trotzdem als gutartig erachtet werden können. Der Ausnahmelisten-Prüfer kann Bezug nehmen auf eine Ausnahmeliste in Datenbank 80, zusammen mit Eigenschaften, die verwendet werden, um zu bestimmen, ob die zu berücksichtigende Datei mit einer Ausnahme übereinstimmt. Wenn die Datei nicht mit einer Ausnahme übereinstimmt, wird sie bei Ausgang 100 als viral gekennzeichnet. Das Setzen dieses Flags kann verwendet werden, um einen Bediener zu alarmieren und/oder um weitere Verarbeitung der Datei zu starten und/oder um geeignete Abhilfe schaffende Maßnahme zu starten (zum Beispiel in Quarantäne Setzen der Datei).
  • Erkennen einer ausführbaren Datei
  • Es folgt ein vereinfachtes Beispiel eines Algorithmus zum Bestimmen, ob eine Datei wahrscheinlich eine ausführbare Datei ist, welche von Dateityp-Analysator 30 verwendet werden könnte. Durch Analysieren der ersten paar Bytes einer Datei ist es möglich zu bestimmen, ob sie wahrscheinlich eine ausführbare Datei ist. Um beispielsweise eine Windows PE-Datei zu erkennen:
    Lese die ersten 2 Bytes ein. Sind diese nicht 'MZ', dann Stopp.
    Weitere 58 Bytes einlesen
    4 Bytes in Variable × einlesen (Behandlung unter Verwendung von Intel-Bytesortierung)
    Suche nach Absatz (Offset) × in Datei
    Lese 4 Bytes ein
    Wenn die Bytes P E\0\0 sind, dann ist die Datei wahrscheinlich eine Windows PE-Datei.
  • Dieser Algorithmus kann verbessert werden, um die Erkennung so vieler anderer Typen ausführbarer Dateien hinzuzufügen wie gewünscht. Wenn die ersten 4 Bytes einer Datei zum Beispiel 0x7F 0x45 0x46 sind, dann ist die Datei wahrscheinlich eine ausführbare Linux-Datei unter Verwendung des ELF-Formats.
  • Erkennen des Compilers
  • Es gibt verschiedene Wege, wie der Compiler-Analysator 50 erkennen kann, welcher Compiler ein bestimmtes Programm erzeugt hat. Zum Beispiel könnte er die Startsequenz des Programms oder den Subroutinen-Aufruf und die Return-Sequenz untersuchen. In einigen Fällen ist dies ausreichend, um die verwendete genaue Compiler-Version zu identifizieren. Anders formuliert wird dadurch eine mögliche Compiler-Familie identifiziert.
  • Reverse Engineering des Programms
  • Es folgt ein vereinfachtes Verfahren, durch welches dies von dem Instruktionsfrequenz-Analysator 60 ausgeführt werden kann. Dieses Verfahren ist in 2 dargestellt und ist wie folgt:
    Erzeuge ein Speicherabbild der Stellen, die von dem Programm verwendet wurden, wobei jedes Byte als 'nicht verwendet' gekennzeichnet wird (Schritt 210).
    Füge den Programm-Eingangspunkt einem Stack von zu berücksichtigenden Stellen hinzu (220).
    Solange es noch Stellen zu berücksichtigen gibt (230)
    Nimm die nächste Stelle als 'aktuelle Stelle' (240)
    Nächste Markierung (LblNext):
    Wenn Speicherabbild dieses Byte als 'Code' markiert (250), stoppe Verarbeitung dieser Stelle
    Lese die Instruktion an dieser Stelle ein, wobei ihre Länge in Bytes berechnet wird (260)
    Aktualisiere den Frequenzzähler für diese Instruktion (270)
    Markiere 'Länge'-Bytes in dem Speicherabbild als 'Code' (280)
    Wenn die Instruktion ein 'Aufruf, 'Sprung' oder eine andere Instruktion ist, die die Stelle der nächsten Instruktion verändern könnte (290), füge das Ziel dem Stack von zu berücksichtigenden Stellen hinzu (300)
    Wenn die Instruktion vom Typ 'Springe immer' oder 'Return' ist, stoppe Verarbeitung dieser Stelle (310)
    Wenn die Instruktion Daten an bestimmte Stellen lädt oder speichert (320), markiere das Ziel in dem Speicherabbild als 'mögliche Daten' (330)
    Inkrementiere 'aktuelle Stelle' um 'Länge'-Bytes (340)
    Fahre bei LblNext mit der Verarbeitung fort
    Wend
  • Dieser Algorithmus kann auf viele Arten verbessert werden, um bessere Ergebnisse vorzusehen. Zum Beispiel sind, wenn das Verarbeiten beendet ist, auf dem Speicherabbild viele Bereiche als 'Code', 'mögliche Daten' und 'nicht verwendet' markiert. Sind zu viele Bereiche als 'nicht verwendet' markiert, können diese Bereiche weiter analysiert werden, um zu versuchen zu bestimmen, ob sie Code oder Daten sind. Ein derartiger Algorithmus könnte sein: Prüfe Daten, um zu sehen, ob sie Zeichen im Bereich 0x20 bis 0x7F, plus ebenfalls 0x0A, 0x09 0x0d enthalten und entweder mit 0x00 oder '$' enden. Ist dies der Fall, könnte es sich um eine Nachricht handeln, die von dem analysierten Programm angezeigt wird und kann als Daten markiert werden. Die der Nachricht unmittelbar vorausgehenden Bytes können ebenfalls analysiert werden, um zu sehen, ob diese als eine 1-, 2- oder 4-Byte-Länge der Nachricht erscheinen. Viele andere Algorithmen sind möglich. Bestimmte Typen von Programmdateien, zum Beispiel Windows DLLs, können mehrere Eingangspunkte enthalten, und die oben genannten Algorithmen können auf jeden angewendet werden.
  • Prüfen bekannter Frequenz
  • Bestimmte Compiler führen jedes Mal eine bestimmte Sache auf die gleiche Art aus (wenn der gleiche Satz Compiler-Flags verwendet wird). Wenn beispielsweise Compiler 'A' dem eax-Register eins hinzufügen möchte, kann er den folgenden Code erzeugen:
    add eax, 0x01
  • Das eax-Register ist 4 Bytes lang. Jedoch erzeugt der Compiler eine Instruktion, einen Ein-Byte-Wert hinzuzufügen, wobei bekannt ist, dass der Prozessor korrekterweise 0x01 zu 0x00000001 auffüllt.
  • Dies ist jedoch nicht die einzige Art, dem eax-Register Eins hinzuzufügen, wenn also ein Teil des folgenden Codes in einem von Compiler A erzeugten Programm gefunden wird, wäre dies verdächtig:
    Figure 00080001
  • Viele Compiler erzeugen bestimmte Eingangs- und Ausgangssequenzen für Subroutinen.
  • Angenommen, der Compiler erzeugt immer das Folgende: Routine:
    Figure 00080002
  • Dann wäre, wenn das Programm 1000 'retn' enthält und wenn es retn nur während der Ausgangssequenz der Subroutine erzeugt, zu erwarten, dass ebenfalls wenigstens 100 'push ebp', 'mov ebp, esp', 'sub esp 0x????', 'mov esp, ebp' und 'pop ebp' zu sehen sind. Alles, was darunter liegt, würde anzeigen, dass möglicher viraler Code eingebracht wurde. Der Compiler kann ebenfalls eine bestimmte Art aufweisen, Subroutinen aufzurufen:
    Figure 00080003
  • Wenn also das Programm 100 'call' enthält, wäre zu erwarten, dass wenigstens 100 'add esp, 0x???': zu sehen sind.
  • Der Compiler kann manche Instruktionen niemals erzeugen. Wenn also das Programm eine oder mehrere davon enthielte, würde dadurch angezeigt, dass möglicher viraler Code eingebracht wurde.
    Zum Beispiel int 3, was bei Intel-Prozessoren der Serie x86 eine Debugger-Programmstopp-Instruktion ist
  • Ausnahmeregeln
  • Verschiedene Ausnahmeregeln können zu Datenbank 80 hinzugefügt und von dem Ausnahmelisten-Prüfer 90 verwendet werden. Als Beispiel sind int 3-Instruktionen in Viren üblich, können aber ebenfalls in Debug-Versionen von Programmen enthalten sein. Also könnte eine Regel sein, dass das Vorhandensein von 'int 3' ignoriert wird, wenn bestimmt wurde, dass das Programm eine Debug-Version ist.
  • Andere Instruktionen werden von System- oder Kernel-Programmen verwendet, aber nicht von Anwendungsprogrammen. Somit können diese, sofern vorhanden, ignoriert werden, wenn bestimmt wurde, dass ein Programm ein System- oder Kernel-Programm ist.
  • Programme, die mit einem Compiler kompiliert wurden, können mit Code aus Bibliotheken, die von anderen Compilern erzeugt wurden, verknüpft werden. Diese Bibliotheken können durch Musterabgleich und reguläre Ausdrücke erkannt und von der Analyse ausgeschlossen werden. Dieser Schritt könnte ebenfalls vor Schritt 3 (Reverse Engineering) ausgeführt werden, um Bereiche als 'von der Analyse ausschließen' zu markieren.
  • Bestimmte ausführbare Dateien können durch Vergleichen einer MD5-Prüfsumme des Programms mit einer Liste von Ausschluss-MD5 ausgeschlossen werden.
  • Verbesserungen
  • Dieses kann sowohl als eigenständiger Viruserkennungs-Algorithmus verwendet oder mit anderen Techniken als Teil eines größeren Systems verwendet werden. Zum Beispiel kann Programmen, die durch dieses Verfahren als verdächtig gekennzeichnet wurden, eine bestimmte Punktzahl zugewiesen werden, oder eine Vielfalt von Punktzahlen, abhängig davon, welche Tests bestanden werden oder nicht. Punktzahlen können ebenfalls unter Verwendung anderer heuristischer Techniken zugeordnet werden, und nur wenn die Gesamt-Punktzahl eine Grenze überschreitet, wird das Programm als viral gekennzeichnet.
  • Das System kann ebenfalls als Indikator verwendet werden oder als Indikator dafür verwendet werden, welche Teile des Programms weiter analysiert werden. Zum Beispiel können, wenn unübliche Verteilungen gefunden wurden, das Programm erneut analysiert werden, um herauszufinden, wo diese auftreten, sowie die Grenzen des bestimmten 'sonderbaren Code'. Dieser gekennzeichnete Code kann dann einer Analyse unterzogen werden, um zu versuchen herauszufinden, was dieser Code tatsächlich tut. Wenn er beispielsweise Dateien oder Massen-E-Mails löscht, ist dies ein wahrscheinlicher Hinweis darauf, dass das Programm viral ist.

Claims (10)

  1. Verfahren zum Scannen einer Computerdatei auf Virusinfektionen, wobei das Verfahren aufweist: a) Identifizieren von Programmcode innerhalb der Datei; b) Identifizieren des Compilers, der verwendet wurde, um den Programmcode zu erzeugen; c) Bestimmen der Frequenzverteilung von ausgewählten Maschinencode-Instruktionen oder Sequenzen von solchen Instruktionen in dem Programmcode; und d) Kennzeichnen der Datei als möglicherweise mit einem Virus infiziert, oder nicht, auf der Basis eines Vergleichs der bestimmten Frequenzverteilung mit einer Frequenzverteilung von Maschinencode-Instruktionen oder Sequenzen davon, die für diesen Compiler erwarten werden.
  2. Verfahren nach Anspruch 1, wobei Schritt c) den Schritt aufweist, von einem Eingangspunkt des Programms arbeitend, a) b1) Verfolgen eines Ausführungsgraphen durch Decodierung von aufeinander folgenden Instruktions-Opcodes und Aktualisieren von Frequenzzählern von decodierten Instruktionen während dieses Verfolgen fortschreitet.
  3. Verfahren nach Anspruch 2, wobei, wenn während Schritt b1) ein Subroutinen-Aufruf oder eine bedingte Verzweigungsinstruktion angetroffen wird, die Bestimmung des Aufrufs oder der Verzweigungsinstruktion einem Stack hinzugefügt wird, das Verfolgen in den Subroutinen-Aufruf fortschreitet und, wenn eine Return-Instruktion angetroffen wird, die hinzugefügte Stelle von dem Stack entnommen wird und die Verfolgung mit den folgenden Instruktionen fortgesetzt wird, wenn irgendwelche.
  4. Verfahren nach Anspruch 1, 2 oder 3, wobei der Programmcode untersucht wird auf Opcode-Konstrukte, z. B. Subroutinen-Aufruf und Subroutinen-Return, Instruktions-Sequenzen, die erwartet werden mit einem bekannten Verhältnis zueinander aufzutreten, und, wenn das tatsächlich gefundene Verhältnis von dem bekannten um mehr als einen bestimmten Betrag abweicht, die Datei als möglicherweise viral gekennzeichnet wird, oder Gegenstand weiterer Verarbeitung.
  5. Verfahren nach einem der vorhergehenden Ansprüche, das den Schritt einschließt, wo Schritt d) die Datei als möglicherweise viral kennzeichnet, den Programmcode mit einer Liste von erlaubten Ausnahmen zu vergleichen und die Kennzeichnung zu unterdrücken, wenn der Programmcode als in der Ausnahmeliste enthalten betrachtet wird.
  6. System zum Scannen einer Computerdatei auf Virusinfektionen, aufweisend: a) Mittel zum Identifizieren von Programmcode innerhalb der Datei; b) Mittel zum Identifizieren des Compilers, der verwendet wurde, um den Programmcode zu erzeugen; c) Mittel zum Bestimmen der Frequenzverteilung von ausgewählten Maschinencode-Instruktionen oder Sequenzen von solchen Instruktionen in dem Programmcode; und d) Mittel zum Kennzeichnen der Datei als möglicherweise mit einem Virus infiziert, oder nicht, auf der Basis eines Vergleichs der bestimmten Frequenzverteilung mit einer Frequenzverteilung von Maschinencode-Instruktionen oder Sequenzen davon, die für diesen Compiler erwartet werden.
  7. System nach Anspruch 6, wobei die Frequenz-Bestimmungsmittel c) Verfolgungsmittel einschließen, wobei die Verfolgungsmittel ausgestaltet sind, arbeitend von einem Eingangspunkt des Programms, einen Ausführungsgraph zu verfolgen, durch Decodieren von aufeinander folgenden Instruktions-Opcodes und Aktualisieren von Frequenzzählern von decodierten Instruktionen während diese Verfolgung fortschreitet.
  8. System nach Anspruch 7, wobei die Verfolgungsmittel so ausgestaltet sind, dass, wenn ein Subroutinen-Aufruf oder eine bedingte Verzweigungsinstruktion angetroffen wird, die Bestimmung des Aufrufs oder der Verzweigungsinstruktion einem Stack hinzugefügt wird, die Verfolgung in den Subroutinen-Aufruf fortschreitet und, wenn eine Return-Instruktion angetroffen wird, die hinzugefügte Stelle von dem Stack entnommen wird und die Verfolgung mit den folgenden Instruktionen, wenn irgendwelche, fortschreitet.
  9. System nach Anspruch 6, 7 oder 8, das Mittel einschließt zum Prüfen des Programmcodes auf Opcode-Konstrukte, z. B. Subroutinen-Aufruf und Subroutinen-Return, Instruktionssequenzen, die erwartet werden, mit einem bekannten Verhältnis zueinander aufzutreten, und, wenn das tatsächlich gefundene Verhältnis von dem bekannten um mehr als einen bestimmten Betrag abweicht, die Datei als möglicherweise viral gekennzeichnet wird, oder Gegenstand einer weiteren Verarbeitung.
  10. System nach einem der Ansprüche 6 bis 9, weiterhin einschließend Mittel, die ausgestaltet sind, wenn die Mittel d) die Datei als möglicherweise viral kennzeichnen, den Programmcode mit einer Liste von zulässigen Ausnahmen zu vergleichen und die Kennzeich nung zu unterdrücken, wenn der Programmcode als in der Ausnahmeliste enthalten betrachtet wird.
DE60319418T 2002-12-12 2003-12-08 Verfahren und system zur heuristischen erkennung von viren in ausführbarem programmkode Expired - Lifetime DE60319418T2 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB0229032 2002-12-12
GB0229032A GB2396227B (en) 2002-12-12 2002-12-12 Method of and system for heuristically detecting viruses in executable code
PCT/GB2003/005328 WO2004053663A1 (en) 2002-12-12 2003-12-08 Method of and system for heuristically detecting viruses in executable code

Publications (2)

Publication Number Publication Date
DE60319418D1 DE60319418D1 (de) 2008-04-10
DE60319418T2 true DE60319418T2 (de) 2009-02-19

Family

ID=9949592

Family Applications (1)

Application Number Title Priority Date Filing Date
DE60319418T Expired - Lifetime DE60319418T2 (de) 2002-12-12 2003-12-08 Verfahren und system zur heuristischen erkennung von viren in ausführbarem programmkode

Country Status (12)

Country Link
US (1) US7519997B2 (de)
EP (1) EP1573465B1 (de)
JP (1) JP4464832B2 (de)
AT (1) ATE387673T1 (de)
DE (1) DE60319418T2 (de)
DK (1) DK1573465T3 (de)
ES (1) ES2302962T3 (de)
GB (1) GB2396227B (de)
HK (1) HK1074687A1 (de)
PT (1) PT1573465E (de)
SI (1) SI1573465T1 (de)
WO (1) WO2004053663A1 (de)

Families Citing this family (33)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2004059506A1 (en) * 2002-12-26 2004-07-15 Commtouch Software Ltd. Detection and prevention of spam
GB2400197B (en) * 2003-04-03 2006-04-12 Messagelabs Ltd System for and method of detecting malware in macros and executable scripts
US7984304B1 (en) * 2004-03-02 2011-07-19 Vmware, Inc. Dynamic verification of validity of executable code
US20050283519A1 (en) * 2004-06-17 2005-12-22 Commtouch Software, Ltd. Methods and systems for combating spam
US7694340B2 (en) 2004-06-21 2010-04-06 Microsoft Corporation Anti virus for an item store
US8037534B2 (en) * 2005-02-28 2011-10-11 Smith Joseph B Strategies for ensuring that executable content conforms to predetermined patterns of behavior (“inverse virus checking”)
US20070028291A1 (en) * 2005-07-29 2007-02-01 Bit 9, Inc. Parametric content control in a network security system
US8984636B2 (en) * 2005-07-29 2015-03-17 Bit9, Inc. Content extractor and analysis system
US7895651B2 (en) * 2005-07-29 2011-02-22 Bit 9, Inc. Content tracking in a network security system
US8272058B2 (en) * 2005-07-29 2012-09-18 Bit 9, Inc. Centralized timed analysis in a network security system
CN100374972C (zh) * 2005-08-03 2008-03-12 珠海金山软件股份有限公司 一种检测和防御计算机恶意程序的系统和方法
GB2430284A (en) * 2005-09-16 2007-03-21 Jeroen Oostendorp Platform for message management
US7873833B2 (en) * 2006-06-29 2011-01-18 Cisco Technology, Inc. Detection of frequent and dispersed invariants
US8261344B2 (en) * 2006-06-30 2012-09-04 Sophos Plc Method and system for classification of software using characteristics and combinations of such characteristics
US8365286B2 (en) * 2006-06-30 2013-01-29 Sophos Plc Method and system for classification of software using characteristics and combinations of such characteristics
US20080134333A1 (en) * 2006-12-04 2008-06-05 Messagelabs Limited Detecting exploits in electronic objects
US20090013405A1 (en) * 2007-07-06 2009-01-08 Messagelabs Limited Heuristic detection of malicious code
US9237166B2 (en) * 2008-05-13 2016-01-12 Rpx Corporation Internet search engine preventing virus exchange
US8904536B2 (en) * 2008-08-28 2014-12-02 AVG Netherlands B.V. Heuristic method of code analysis
JP5133192B2 (ja) * 2008-10-06 2013-01-30 日本電信電話株式会社 オリジナルコードの抽出装置、抽出方法、および抽出プログラム
JP5588781B2 (ja) 2010-08-10 2014-09-10 富士通株式会社 セキュアモジュールおよび情報処理装置
CN102110220B (zh) * 2011-02-14 2013-01-23 宇龙计算机通信科技(深圳)有限公司 一种应用程序监控方法及装置
CN103902901B (zh) * 2013-09-17 2017-10-31 北京安天网络安全技术有限公司 一种基于编译器识别的apt检测方法及系统
JP6326502B2 (ja) * 2013-12-27 2018-05-16 マカフィー, エルエルシー 頻度に基づくレピュテーション
US9262296B1 (en) 2014-01-31 2016-02-16 Cylance Inc. Static feature extraction from structured files
RU2606559C1 (ru) * 2015-10-22 2017-01-10 Акционерное общество "Лаборатория Касперского" Система и способ оптимизации антивирусной проверки файлов
KR101947737B1 (ko) * 2016-12-06 2019-02-13 서울대학교산학협력단 명시적 및 암시적 정보 흐름 추적 방법 및 그 장치
US11556618B2 (en) * 2020-02-18 2023-01-17 At&T Intellectual Property I, L.P. Split ledger software license platform
US11663113B2 (en) 2020-02-20 2023-05-30 International Business Machines Corporation Real time fault localization using combinatorial test design techniques and test case priority selection
US11176026B2 (en) 2020-02-20 2021-11-16 International Business Machines Corporation Assignment of test case priorities based on combinatorial test design model analysis
US11086768B1 (en) * 2020-02-20 2021-08-10 International Business Machines Corporation Identifying false positives in test case failures using combinatorics
US11307975B2 (en) 2020-02-20 2022-04-19 International Business Machines Corporation Machine code analysis for identifying software defects
US11604740B2 (en) * 2020-12-01 2023-03-14 Capital One Services, Llc Obfuscating cryptographic material in memory

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5440723A (en) * 1993-01-19 1995-08-08 International Business Machines Corporation Automatic immune system for computers and computer networks
US5675711A (en) * 1994-05-13 1997-10-07 International Business Machines Corporation Adaptive statistical regression and classification of data strings, with application to the generic detection of computer viruses
US6016546A (en) * 1997-07-10 2000-01-18 International Business Machines Corporation Efficient detection of computer viruses and other data traits
US6357008B1 (en) * 1997-09-23 2002-03-12 Symantec Corporation Dynamic heuristic method for detecting computer viruses using decryption exploration and evaluation phases
US6971019B1 (en) * 2000-03-14 2005-11-29 Symantec Corporation Histogram-based virus detection
US7069589B2 (en) * 2000-07-14 2006-06-27 Computer Associates Think, Inc.. Detection of a class of viral code
US7502939B2 (en) * 2001-04-19 2009-03-10 Cybersoft, Inc. Software virus detection methods and apparatus

Also Published As

Publication number Publication date
GB2396227B (en) 2006-02-08
EP1573465B1 (de) 2008-02-27
SI1573465T1 (sl) 2008-08-31
WO2004053663A1 (en) 2004-06-24
DE60319418D1 (de) 2008-04-10
US7519997B2 (en) 2009-04-14
DK1573465T3 (da) 2008-06-23
ATE387673T1 (de) 2008-03-15
AU2003288435A1 (en) 2004-06-30
GB2396227A (en) 2004-06-16
HK1074687A1 (en) 2005-11-18
JP2006510089A (ja) 2006-03-23
JP4464832B2 (ja) 2010-05-19
US20050022016A1 (en) 2005-01-27
GB0229032D0 (en) 2003-01-15
PT1573465E (pt) 2008-04-16
EP1573465A1 (de) 2005-09-14
ES2302962T3 (es) 2008-08-01

Similar Documents

Publication Publication Date Title
DE60319418T2 (de) Verfahren und system zur heuristischen erkennung von viren in ausführbarem programmkode
US7496963B2 (en) Method of, and system for, heuristically detecting viruses in executable code
DE60303753T2 (de) Selektives Erkennen von böswilligem Rechnercode
US7937693B2 (en) System and method for obfuscation of reverse compiled computer code
DE69805406T2 (de) Fehlerverwaltung in emulationbasierter antivirenabtastung
DE69802831T2 (de) Dynamisches heuristisches verfahren zur erkennung von computerviren
DE60105611T2 (de) Erkennung von viren durch histogramme
DE69523029T2 (de) Bytecodeprograminterpreter, Verfahren und Anordnung mit Vorprüfung von Datentyprestriktionen
US7707634B2 (en) System and method for detecting malware in executable scripts according to its functionality
US20060010495A1 (en) Method for protecting a computer from suspicious objects
US20050027686A1 (en) Method of, and system for, heuristically detecting viruses in executable code
WO2004088483A2 (en) System for and method of detecting malware in macros and executable scripts
Akram et al. The making of indicator of compromise using malware reverse engineering techniques
CN110210216B (zh) 一种病毒检测的方法以及相关装置
CN104933359B (zh) 一种恶意软件的多执行路径构造方法
US10909243B2 (en) Normalizing entry point instructions in executable program files
EP2302554A2 (de) Verfahren zur Kennzeichnung eines in einem Computerspeichersystem enthaltenen Computerprogrammabschnitts
Venable et al. Analyzing memory accesses in obfuscated x86 executables
Lupascu et al. An overview of obfuscation techniques used by malware in visual basic for application scripts
AU2003288435B2 (en) Method of and system for heuristically detecting viruses in executable code
CN118246006A (zh) 一种文档文件的行为检测方法、装置、设备及存储介质
Leitold Independent AV testing
Schade FCScan: A new lightweight and effective approach for detecting malicious content in electronic documents
CN112989345A (zh) 一种威胁处置方法及框架
Jafer Website Malicious Codes Detection

Legal Events

Date Code Title Description
8364 No opposition during term of opposition