Es hat mich verblüfft, wie die "AnyCPU" -Funktion in .NET funktioniert: Es lädt die ausführbare Datei als native 32 -Bit, wenn das System 32-Bit ist, und als 64-Bit, wenn das System 64-Bit ist (was Sie einfach mit Task-Manager bestätigen können). Das ist natürlich nicht unmöglich.Schreiben eines Cross-Platform (32-Bit und 64-Bit-kompatiblen) Programms für Windows (wie AnyCPU in .NET)
Die Frage ist, wie genau hat Microsoft das getan? Windows wusste ursprünglich nichts über das .NET-Framework, daher kann der Windows PE-Loader möglicherweise keine zusätzlichen Features in PE-Headern für den CLR-Header suchen. Diese Funktion muss durch eine Art Kernel-Modus-Erweiterung hinzugefügt worden sein. Aber das .NET-Framework scheint keine solche Sache zu installieren ... Ich bin völlig am Verlust, wie die gleiche ausführbare Datei native 32-Bit und 64-Bit zur gleichen Zeit sein kann, vor allem seit eine Disassemblierung von mscoree.dll doesn zeige nicht einmal Referenzen auf undokumentierte native Funktionen.
Hat jemand irgendwelche Kenntnisse und/oder vernünftige Vermutungen, wie dies getan wurde? Es ist natürlich möglich (also keine Dinge sagen wie „es nicht möglich ist“), und es macht mich versuchen zu wollen, einen nativen plattformübergreifende EXE ...
bearbeiten zu schreiben:
Wie Eine Randnotiz, bedenken Sie, wie Sie 32-Bit-ausführbare Dateien in einer 64-Bit-Windows PE-Umgebung nicht ausführen können ... es gibt haben, um eine Möglichkeit zu sein, den PE-Lader mit einer Art "Plugin" zu erweitern oder zu modifizieren ?
Es gibt einige Programme (z. B. Process Explores), die dies tun, um eine 32-Bit-ausführbare Datei zu verteilen, die * ein * 64-Bit-Image startet, wenn möglich. Z.B. ist eine "AnyCPU" ausführbare Datei jemals etwas anderes als eine 32-Bit-PE? –
@pst: Ich bin mir vollkommen bewusst, aber nein, sie sind anders. Alle ausführbaren CPU-Dateien sind 64-Bit, sobald sie auf 64-Bit-Betriebssystemen gestartet werden - es gibt kein Entpacken und es gibt nichts wie "Lassen Sie uns diesen Bytecode-Code in 64-Bit JIT und dann den 64-Bit-Prozess neu starten." Das macht mich verblüfft. – Mehrdad