2008-12-01 22 views
11

Ich habe einige Methoden von checking if a PEFile is a .NET assembly by examining the binary structure gesehen.Überprüfen, ob eine Datei eine .NET-Assembly ist

Ist das die schnellste Methode zum Testen mehrerer Dateien? Ich nehme an, dass der Versuch, jede Datei (z. B. über Assembly.ReflectionOnlyLoad) Datei zu laden, möglicherweise ziemlich langsam ist, da es Dateitypinformationen laden wird.

Hinweis: Ich bin auf der Suche nach einer Möglichkeit, Dateien programmgesteuert zu überprüfen.

Antwort

6

Vielleicht hilft das

von http://www.grimes.nildram.co.uk/dotnet/vistaAndDotnet.htm

Als nächstes prüfe ich, ob es sich um eine .NET-Assembly ist. Dazu überprüfe ich, ob die Datei den CLR-Header enthält. Dieser Header enthält wichtige Informationen zum Speicherort des .NET-Codes in der Datei und der Version des Frameworks, die zum Schreiben des Codes verwendet wurde. Der Speicherort dieses Headers wird in der Tabelle Data Directory der Datei angegeben. Wenn das Datenverzeichniselement Nullwerte aufweist, wird die Datei nicht verwaltet. Wenn es Werte ungleich Null hat, ist die Datei eine .NET-Assembly.

Sie können dies selbst testen, indem Sie das Dienstprogramm dumpbin mit dem Schalter/headers verwenden. Dieses Dienstprogramm druckt die verschiedenen Header in einer Datei in der Befehlszeile. Am Ende der optionalen Header-Werte sehen Sie eine Liste der Datenverzeichnisse (es gibt immer 16 von ihnen) und wenn das COM-Deskriptor-Verzeichnis einen von Null verschiedenen Ort hat, zeigt es an, dass die Datei eine .NET-Assembly ist. Der Inhalt des CLR-Headers kann auch mit dem Schalter/clrheader aufgelistet werden (wenn die Datei nicht verwaltet wird, werden keine Werte angezeigt). XP testet beim Ausführen einer Datei den CLR-Header und wenn der CLR-Header vorhanden ist, initialisiert er die Laufzeit und übergibt den Eintrittspunkt der Assembly an die Laufzeit, sodass die Datei vollständig innerhalb der Laufzeit ausgeführt wird.

+0

Das ist hilfreich, aber ich bin auf der Suche nach einer programmatischen Überprüfung. –

+0

Haben Sie einen anderen Link? (Aktuelle Verbindung ist nicht verfügbar) – Fab

+0

@FabienBondi, aktualisiert den Link – Stormenet

1

Der erste Link dort wird die schnellste und einfachste Methode der Überprüfung sein (der PE-Datei-Header eins). Sie haben richtig angenommen, dass das Aufrufen von Assembly.ReflectionOnlyLoad ziemlich langsam ist.

5

In der Vergangenheit habe ich AssemblyName.GetAssemblyName() verwendet, das eine Ausnahme auslöst, wenn es sich nicht um eine verwaltete Assembly handelt. Ich habe es jedoch noch nie getestet, daher kann ich nicht sagen, wie schnell es ist.

+2

Die Ausnahme ist System.BadImageFormatException –

7

Ich denke, Stormenet's Antwort ist technisch programmatisch, so werde ich meine Antwort in eine Antwort trennen.

Um die beste Leistung zu erzielen, wird nichts das Öffnen der Datei (en) mit StreamReader, das Lesen der ersten (n) Bytes und die Überprüfung der .NET-Dateisignaturdatenstrukturen im Byte-Datenstrom verhindern.

So ziemlich die gleiche Art und Weise Sie etwas überprüfen würde, ist eine ausführbare DOS:

http://en.wikipedia.org/wiki/DOS_executable

Achten Sie auf die „MZ“ Header-Bytes, die auch die Initialen von Mark Zbikowski geschehen sein, einer der die Entwickler von MS-DOS ..

Verwandte Themen