Hier ist meine eigene Implementierung dieser ist, die mehrere Kontrollen an Ort und Stelle hat und gibt immer ein Ergebnis .
// the enum of known pe file types
public enum FilePEType : ushort
{
IMAGE_FILE_MACHINE_UNKNOWN = 0x0,
IMAGE_FILE_MACHINE_AM33 = 0x1d3,
IMAGE_FILE_MACHINE_AMD64 = 0x8664,
IMAGE_FILE_MACHINE_ARM = 0x1c0,
IMAGE_FILE_MACHINE_EBC = 0xebc,
IMAGE_FILE_MACHINE_I386 = 0x14c,
IMAGE_FILE_MACHINE_IA64 = 0x200,
IMAGE_FILE_MACHINE_M32R = 0x9041,
IMAGE_FILE_MACHINE_MIPS16 = 0x266,
IMAGE_FILE_MACHINE_MIPSFPU = 0x366,
IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466,
IMAGE_FILE_MACHINE_POWERPC = 0x1f0,
IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1,
IMAGE_FILE_MACHINE_R4000 = 0x166,
IMAGE_FILE_MACHINE_SH3 = 0x1a2,
IMAGE_FILE_MACHINE_SH3DSP = 0x1a3,
IMAGE_FILE_MACHINE_SH4 = 0x1a6,
IMAGE_FILE_MACHINE_SH5 = 0x1a8,
IMAGE_FILE_MACHINE_THUMB = 0x1c2,
IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169,
}
// pass the path to the file and check the return
public static FilePEType GetFilePE(string path)
{
FilePEType pe = new FilePEType();
pe = FilePEType.IMAGE_FILE_MACHINE_UNKNOWN;
if(File.Exists(path))
{
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
byte[] data = new byte[4096];
fs.Read(data, 0, 4096);
ushort result = BitConverter.ToUInt16(data, BitConverter.ToInt32(data, 60) + 4);
try
{
pe = (FilePEType)result;
} catch (Exception)
{
pe = FilePEType.IMAGE_FILE_MACHINE_UNKNOWN;
}
}
}
return pe;
}
Wie verwenden:
string myfile = @"c:\windows\explorer.exe"; // the file
FilePEType pe = GetFilePE(myfile);
System.Diagnostics.WriteLine(pe.ToString());
Für die ENUM-Werte hier verwendet wurden, wurden sie von pe.go erhalten. Der Grund, warum dies funktioniert, ist, dass für jede binäre Verteilung von 'go' die korrekte Flagge in der Assembly verwendet werden muss, damit sie die Betriebssysteme passieren kann. "Können Sie hier laufen?" prüfen. Da "go" plattformübergreifend ist (alle Plattformen), ist es eine gute Basis, um diese Informationen zu erhalten. Es gibt wahrscheinlich andere Quellen für diese Informationen, aber sie scheinen in Google ca-ca geschachtelt zu sein, was einen 10. dan black belt in Google-fu erfordert.
Dies funktioniert gut, wenn die Ziel-Binärdatei geladen werden kann. In meinem Fall gab es eine .NET-DLL, die VCRedist benötigte und ich versuchte herauszufinden, welcher (x86 oder x64) der .NET-DLL entspricht. Aber logisch und ironisch kann ich diese .NET-DLL nicht laden, ohne dass VCRedist installiert ist und daher nicht erkennen kann, welche (mit dieser Methode) benötigt wird. – Nicolas