Hallo alle zusammen! Mal zwei Fragen...
1.) Gibt es eine einfache Möglichkeit festzustellen, ob eine beliebiege Datei ausführbar - also ein Treiber, eine EXE oder eine DLL ... - ist?
2.) Besteht Interesse an einer einfachen Möglichkeit, dies mit Profan zu testen - also an einer PCU?
DLL erkennen
-
-
-
Ich würde sagen, ein einfaches LoadLibrary() genügt für so eine Erkennung schon fast.
-
-
Das funktioniert mal für exe und nicht ausführbare Dateien, nur dll's werden nicht als solche erkannt.
External("Kernel32.dll","GetBinaryTypeA",addr(file$),flag#) -
Zitat
Schon mal ausprobiert? Was passiert zum Beispiel, wenn man versucht eine Textdatei mittels LoadLibrary zu laden?
Es wird 0 zurück gegeben.
-
Hab's grad gefunden: Es wird aber nur 0 zurückgeben, wenn man LoadLibraryEx mit dem Flag LOAD_LIBRARY_AS_DATAFILE benutzt, ansonsten gibt es eine Messagebox (siehe Quelltexte weiter oben).
Für meine Zwecke wollte ich die "DLL" nicht gerne laden - ich habe da nach einer anderen Möglichkeit gesucht. Wie Bangkok schon berichtet hat, geht GetBinaryType nicht, denn das liefert keine DLLs. SHGetFileInfo liefert zwar einen String bezüglich der Datei zurück, es ist aber etwas schwierig den vernünftig auszuwerten. Ich habe mir also was gebaut, das die Info ob es nun eine DLL ist oder nicht direkt aus dem "Header" der Datei holt.
Es lohnt sich jetzt für mich nicht, aufs geratewohl daraus eine PCU zu bauen. Sollte jemand das aber für seine Anwendung brauchen, kann ich das noch nachholen. -
Die MessageBox, die da erscheint, enthält übrigens einen witzigen Übersetzungsfehler:
[Blockierte Grafik: http://s1.postimage.org/1TgbdS.jpg] -
Bei mir kommt keine Meldung.
Ich glaub auch, dass sich eine Unit kaum lohnen wird. Liesst du nur die beiden ersten Bytes aus? MZ.
-
Nein, natürlich nicht.
-
Diese Dateien sollten doch alle einen PE-Header haben. Wie wäre es wenn Du den ausliesst ?
Code
Alles anzeigenDeclare File# set("Filemode",0) CLS Var FName$ = $SysPath+"\\Kernel32.dll" Var Size& = Filesize(FName$) Dim File#,Size& Assign #1, FName$ OpenRW #1 BlockRead(#1, File#,0,Size&) Close #1 If MemPos(File#,0,"PE") > 0 Print "ausführbar" Else Print "nicht ausführbar" Endif Dispose File# Waitinput end
-
Zitat von Andreas Miethe;748239
Diese Dateien sollten doch alle einen PE-Header haben. Wie wäre es wenn Du den ausliesst ?
Jo, richtig, das tue ich ja - ich gehe aber noch einen Schritt weiter.
Ich kontrolliere zuerst e_magic des IMAGE_DOS_HEADER auf "MZ", dann hohle ich mir e_lfanew aus IMAGE_DOS_HEADER und Springe zum IMAGE_NT_HEADERS. Dort kontrolliere ich auf "PE" und rutsche dann zum IMAGE_OPTIONAL_HEADER herunter, wo ich auf IMAGE_NT_OPTIONAL_HDR32_MAGIC bzw. IMAGE_NT_OPTIONAL_HDR64_MAGIC kontrollierre. Das ist schon recht sicher.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!