Feedback

C# - Erkennen ob eine EXE (oder DLL) als 64bit kompiliert wurde

Veröffentlicht von am 16.07.2009
(2 Bewertungen)
Das Problem ist das ich keine offizielle Funktion gefunden habe mit welcher man auslesen kann ob es sich bei einer Datei um eine 32bit bzw. 64bit Version handelt. Oft haben die DLL'' sogar die gleiche Versionsnummer.

Mit hilfe der Dokumentation "Microsoft Portable Executable and Common Object File Format Specification" kann man nachlesen das 64bit Anwendungen das neue Format PE+ und die 32bit Anwendungen das alte PE32 Format verwenden. Diese Information habe ich benutzt um 64bit und 32bit zu unterscheiden.

Mit Hilfe der COFF Informationen kann man auch noch andere Dinge auslesen z.b. Erstellungsdatum, Für welchen Prozessor die Datei erstellt wurde usw. . Ich habe den COFF File Header Ausgelesen habe ihn jedoch in diesem Beispiel auskommentiert.

Hinweis: Für die Ausgabe habe ich eine RichTextBox "richTextBox_Output" verwendet.

GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Aufbau

Nach dieser Schulung können Sie mittels objektorientierter Modelle in VB.NET 2017/2015/2013 wiederverwendbare Elemente eigenständig erstellen.

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

private bool CheckIsFile64bit(FileStream filestream)
{
    bool ret = false;

    Byte[] _data = new Byte[4];
    filestream.Seek(0x3c, SeekOrigin.Begin);
    filestream.Read(_data, 0, 4);
    int _offset = BitConverter.ToInt32(_data, 0);

    if (_offset > 0x3c)
    {
        _data = new Byte[4];
        filestream.Seek(_offset, SeekOrigin.Begin);
        filestream.Read(_data, 0, 4);

        if ((_data[0] == 0x50)
            && (_data[1] == 0x45)
            && (_data[2] == 0x00)
            && (_data[3] == 0x00))
        {

            // Read COFF File Header
            _data = new Byte[20];
            filestream.Read(_data, 0, 20);
            int _machine = BitConverter.ToInt16(_data, 0);
            //richTextBox_Output.Text += string.Format("Machine: 0x{0}" + System.Environment.NewLine, _machine.ToString("X4"));
            //int _numberOfSections = BitConverter.ToInt16(_data, 2);
            //richTextBox_Output.Text += string.Format("NumberOfSections: 0x{0}" + System.Environment.NewLine, _numberOfSections.ToString("X4"));
            //int _timeDateStamp = BitConverter.ToInt32(_data, 4);
            //double _secs = Convert.ToDouble(_timeDateStamp);
            //DateTime _dt = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(_secs);
            //DateTime _tds = System.TimeZone.CurrentTimeZone.ToLocalTime(_dt);
            //richTextBox_Output.Text += string.Format("TimeDateStamp: {0} (0x{1})" + System.Environment.NewLine, _tds.ToString(), _timeDateStamp.ToString("X8"));
            //int _pointerToSymbolTable = BitConverter.ToInt32(_data, 8);
            //richTextBox_Output.Text += string.Format("PointerToSymbolTable: 0x{0}" + System.Environment.NewLine, _pointerToSymbolTable.ToString("X8"));
            //int _numberOfSymbols = BitConverter.ToInt32(_data, 12);
            //richTextBox_Output.Text += string.Format("NumberOfSymbols: 0x{0}" + System.Environment.NewLine, _numberOfSymbols.ToString("X4"));
            //int _sizeOfOptionalHeader = BitConverter.ToInt16(_data, 16);
            //richTextBox_Output.Text += string.Format("SizeOfOptionalHeader: 0x{0}" + System.Environment.NewLine, _sizeOfOptionalHeader.ToString("X4"));
            //int _characteristics = BitConverter.ToInt16(_data, 18);
            //richTextBox_Output.Text += string.Format("Characteristics: 0x{0}" + System.Environment.NewLine, _characteristics.ToString("X4"));

            // Read Optional Header
            _data = new Byte[2];
            filestream.Read(_data, 0, 2);
            int _magicNumber = BitConverter.ToInt16(_data, 0);
            //richTextBox_Output.Text += string.Format("Magic Number: 0x{0}" + System.Environment.NewLine, _magicNumber.ToString("X4"));
            if (_magicNumber == 0x010b)
                richTextBox_Output.Text += String.Format("File {0} is 32bit!" + System.Environment.NewLine, filestream.Name);
            else if (_magicNumber == 0x020b)
            {
                richTextBox_Output.Text += String.Format("File {0} is 64bit!" + System.Environment.NewLine, filestream.Name);
                ret = true;
            }
        }
        else
            richTextBox_Output.Text = "No PE File!";
    }
    else
        richTextBox_Output.Text = "Wrong Offset or no PE File!";

    return ret;
}

Abgelegt unter 64bit, COFF, PE, dll, exe.

1 Kommentare zum Snippet

FB schrieb am 29.10.2010:
Danke, das hab ich gebraucht. Ging schnell, einfach und fehlerfrei.
 

Logge dich ein, um hier zu kommentieren!