Ich möchte feststellen, ob eine native Assembly von einer verwalteten Codeanwendung ( C # ) als x64 oder x86 erfüllt wird .
Ich denke, es muss sich irgendwo im PE-Header befinden, da der OS-Loader diese Informationen kennen muss, aber ich konnte sie nicht finden. Natürlich bevorzuge ich es in verwaltetem Code, aber wenn es nötig ist, kann ich natives C ++ verwenden.
Antworten:
Sie können auch DUMPBIN verwenden . Verwenden Sie das Flag
/headers
oder/all
und den ersten aufgelisteten Dateikopf.64-Bit
32-Bit
'finden' kann das Leben etwas erleichtern:
quelle
mspdb100.dll
:(mspdb100.dll
in den Ordner kopiert habe, in dem siedumpbin.exe
sich befindet.DUMPBIN
kann danach laufen. Für mich ist die EXE bei<Visual Studio Install folder>\VC\bin
und die DLL ist bei<Visual Studio Install folder>\Common7\IDE
.Mit CorFlags ist dies auf einfache Weise möglich . Öffnen Sie die Visual Studio-Eingabeaufforderung und geben Sie "corflags [Ihre Assembly]" ein. Sie werden so etwas bekommen:
Sie betrachten speziell PE und 32BIT.
Beliebige CPU :
PE: PE32
32BIT: 0
x86 :
PE: PE32
32BIT: 1
x64:
PE: PE32 +
32BIT: 0
quelle
Dieser Trick funktioniert und erfordert nur Notepad.
Öffnen Sie die DLL-Datei mit einem Texteditor (wie Notepad) und suchen Sie das erste Vorkommen der Zeichenfolge
PE
. Das folgende Zeichen definiert, ob die DLL 32 oder 64 Bit umfasst.32 Bit:
64 Bit:
quelle
Das
Magic
Feld vonIMAGE_OPTIONAL_HEADER
(obwohl der Header in ausführbaren Windows-Images (DLL / EXE-Dateien) nicht optional ist) gibt Auskunft über die Architektur des PE.Hier ist ein Beispiel für das Abrufen der Architektur aus einer Datei.
Die einzigen zwei Architekturkonstanten im Moment sind:
Prost
UPDATE Es ist schon eine Weile her, dass ich diese Antwort gepostet habe, aber ich sehe immer noch, dass es ab und zu ein paar Upvotes gibt, also dachte ich, dass es sich lohnt, sie zu aktualisieren. Ich habe einen Weg geschrieben, um die Architektur eines
Portable Executable
Bildes zu erhalten, der auch prüft, ob es als kompiliert wurdeAnyCPU
. Leider ist die Antwort in C ++, aber es sollte nicht zu schwierig sein, auf C # zu portieren, wenn Sie ein paar Minuten Zeit haben, um die Strukturen nachzuschlagenWinNT.h
. Wenn die Leute interessiert sind, schreibe ich einen Port in C #, aber wenn die Leute es nicht wirklich wollen, werde ich nicht viel Zeit damit verbringen, darüber nachzudenken.Die Funktion akzeptiert einen Zeiger auf ein In-Memory-PE-Bild (so können Sie Ihr Gift auswählen, wie Sie es erhalten möchten; Speicherzuordnung oder Einlesen des Ganzen in den Speicher ... was auch immer).
quelle
32BIT
Flagge in der PE bezieht. Ich weiß es nicht genau.Bei einer nicht verwalteten DLL-Datei müssen Sie zunächst prüfen, ob es sich um eine 16-Bit-DLL-Datei handelt (hoffentlich nicht). Dann überprüfen Sie das
IMAGE\_FILE_HEADER.Machine
Feld.Jemand anderes hat sich die Zeit genommen, dies bereits zu klären, deshalb werde ich hier nur wiederholen:
quelle
Eine C # -Beispielimplementierung für die
IMAGE_FILE_HEADER
Lösung finden Sie hierquelle
64-Bit-Binärdateien werden im PE32 + -Format gespeichert. Versuchen Sie, http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486 zu lesen
quelle
Öffnen Sie die DLL mit einem Hex-Editor wie HxD
Wenn es in der 9. Zeile ein "dt" gibt, ist es 64bit.
Wenn es ein "L." in der 9. Zeile ist es 32bit.
quelle
Ich habe die C ++ - Lösung in der ersten Antwort im Powershell-Skript umgeschrieben. Das Skript kann diese Arten von EXE- und DLL-Dateien bestimmen:
Diese Lösung hat einige Vorteile gegenüber corflags.exe und dem Laden von Assemblys über Assembly.Load in C # - Sie erhalten niemals eine BadImageFormatException oder eine Meldung über einen ungültigen Header.
Anwendungsbeispiel:
Sie können den zweiten Parameter weglassen, wenn Sie keine Details sehen müssen
quelle
Eine schnelle und wahrscheinlich schmutzige Vorgehensweise wird hier beschrieben: https://superuser.com/a/889267 . Sie öffnen die DLL in einem Editor und überprüfen die ersten Zeichen nach der "PE" -Sequenz.
quelle
Anscheinend finden Sie es in der Kopfzeile der tragbaren ausführbaren Datei. Das Dienstprogramm corflags.exe kann Ihnen anzeigen, ob es auf x64 abzielt oder nicht. Hoffentlich hilft Ihnen dies dabei, weitere Informationen darüber zu finden.
quelle
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header