Wie kann ich feststellen, für welche Plattform eine ausführbare Datei kompiliert wird?
Ich habe müssen arbeiten mit Windows-Programme, die für x86 -, x64-und IA64. Ich möchte programmatisch herauszufinden, die Plattform durch Untersuchung der Dateien selbst.
Meine Zielsprache ist PowerShell, sondern ein C# - Beispiel wird das tun. Andernfalls, wenn Sie wissen, die Logik, die erforderlich, dass wäre toll.
InformationsquelleAutor der Frage halr9000 | 2008-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
(von einem anderen Q, da entfernt)
Maschinentyp: Dies ist eine schnelle wenig code, den ich basierend auf einige, bekommt der linker timestamp. Dies ist in der gleichen header, und es scheint zu funktionieren - es gibt I386 kompiliert, wenn -jeder cpu-und x64 bei der Kompilierung mit, dass als Ziel-Plattform.
Die Erkundung PE-Header (K. Stanton,MSDN) - blog-Eintrag, der zeigte mir den offset, wie eine andere Antwort festgestellt.
InformationsquelleAutor der Antwort Andrew Backer
Wenn Sie Visual Studio installiert haben, können Sie
dumpbin.exe
. Es gibt auch dieGet-PEHeader
cmdlet in der PowerShell Community Extensionsdie verwendet werden können, um test für ausführbare Bilder.Dumpbin-Bericht-DLLs als
machine (x86)
odermachine (x64)
Bekommen-PEHeader Bericht DLLs entweder als
PE32
oderPE32+
InformationsquelleAutor der Antwort Keith Hill
Müssen Sie die GetBinaryType win32-Funktion. Das liefert die relevanten Teile der PE-format von ausführbaren.
In der Regel erhalten Sie entweder SCS_32BIT_BINARY oder SCS_64BIT_BINARY in der "BinaryType" - Feld,
Alternativaly können Sie das PE-format selbst, um zu sehen, was die Architektur der ausführbaren Datei kompiliert wird.
Den IMAGE_FILE_HEADER.Maschine Feld "IMAGE_FILE_MACHINE_IA64" - set für IA64-Binärdateien, IMAGE_FILE_MACHINE_I386 für 32-bit-und IMAGE_FILE_MACHINE_AMD64 für 64-bit (ie x86_64).
Gibt es eine MSDN Magazin-Artikelum Ihnen zu helfen get going.
Nachtrag: Diese kann Ihnen helfen, ein wenig mehr. Lesen Sie die binäre Datei: check die ersten 2 bytes, die sagen, "MZ", dann überspringen Sie die nächsten 58 bytes und Lesen Sie die magic 32-bit-Wert auf 60 bytes, die in das Bild (das entspricht 0x00004550 für PE-executables). Die folgenden bytes sind dieser headerdie ersten 2 bytes, die dir sagen, welche Maschine die binäre ist ausgelegt für (0x8664 = x86_64, 0x0200 = IA64, 0x014c = i386).
(Zusammenfassung: bytes Lesen 65 und 66 der Datei, um das image Typ)
InformationsquelleAutor der Antwort gbjbaanb
Dem Ziel-Computer sollte dann in der Maschine.
Werde, dass nur Arbeit mit .NET-Assemblys obwohl.
InformationsquelleAutor der Antwort ICR
Gemäß dieser postkönnen Sie überprüfen, ob eine DLL oder EXE ist 32 oder 64, indem Sie es mit Editor und auf der Suche nach "PE" am Anfang, wenn sich der nächste Buchstabe ist "L" die Plattform ist 32-bit, es wird der Buchstabe "D" die Plattform ist 64bit.
Versuchte ich es auf meine dlls und es scheint richtig zu sein.
InformationsquelleAutor der Antwort mrelva
Bieten kann ich einen link zu einigen C# - code für den Zugriff auf die IMAGE_FILE_HEADER, die ich denke, könnte sein (leicht) und kompiliert in eine PowerShell-cmdlet. Ich bin einigermaßen sicher, dass Sie nicht verwenden können, diese Methode in PowerShell-Skript direkt, da fehlt es Zeiger und PInvoke-Funktion.
Jedoch, Sie sollten in der Lage sein zu verwenden Ihre inzwischen umfangreichen Kenntnisse des PE-header-format 😉 nur "straight" auf der rechten Byte und es herausfinden. Diese wird arbeiten in PowerShell-Skript, und Sie sollten in der Lage sein zu umwandeln, nur dieser C# - code von Tasos' blog Skript. Ich werde nicht die Mühe zu wiederholen, den code hier ein, da es nicht von mir.
InformationsquelleAutor der Antwort Jaykul
Unix-Betriebssysteme haben ein Dienstprogramm namens "Datei" die Dateien identifiziert. Die Regeln für die Identifizierung aufbewahrt werden, eine Beschreibung der Datei namens "magic". Sie könnten versuchen, die Datei zu sehen, ob es in der Lage ist, zu identifizieren, Ihre Dateien richtig und greifen die entsprechenden Regeln aus der magic-Datei.
InformationsquelleAutor der Antwort Sec
Hier ist meine eigene Implementierung dieser hat mehrere Kontrollen an Ort und Stelle und gibt immer ein Ergebnis.
Wie zu verwenden :
Für die enum-Werte, die hier verwendet werden, aus der Sie gewonnen pe.gehen . Der Grund warum dies funktioniert ist, dass für jede binäre ditribution von 'gehen' muss der korrekte fahne in der Montage, lassen Sie es pass des Betriebssystems, können Sie hier ein ? - check. Da 'gehen' ist cross-Plattform (alle Plattformen), ist es eine gute Basis, um diese Informationen zu erhalten. Es gibt wahrscheinlich andere Quellen für diese Informationen, aber Sie scheinen es zu verschachtelten knee-deep in google ca-ca-erfordern eine 10th dan schwarzen Gürtel in Google-fu zu suchen.
InformationsquelleAutor der Antwort Kraang Prime
Hier ist eine Implementierung in C.
InformationsquelleAutor der Antwort Jiminion
dumpbin.exe
verfügbar unterbin
- Verzeichnis von Visual Studio funktioniert sowohl für.lib
und.dll
InformationsquelleAutor der Antwort Saad Saadi