WOW64-Implementierungsdetails
Der WOW64-Emulator wird im Benutzermodus ausgeführt. Sie stellt eine Schnittstelle zwischen der 32-Bit-Version von Ntdll.dll und dem Kernel des Prozessors bereit und fängt Kernelaufrufe ab. Der WOW64-Emulator besteht aus den folgenden DLLs:
- Wow64.dll stellt die Kernemulationsinfrastruktur und die Thunks für die Ntoskrnl.exe Einstiegspunktfunktionen zur Verfügung.
- Wow64Win.dll stellt Thunks für die Win32k.sys Einstiegspunktfunktionen zur Verfügung.
- (nur x64) Wow64Cpu.dll unterstützt die Ausführung von x86-Programmen unter x64.
- (nur Intel Itanium) IA32Exec.bin enthält den x86-Softwareemulator.
- (nur Intel Itanium) Wowia32x.dll stellt die Schnittstelle zwischen IA32Exec.bin und WOW64 bereit.
- (nur ARM64) xtajit.dll enthält den x86-Softwareemulator.
- (nur ARM64) wowarmw.dll unterstützt die Ausführung von ARM32-Programmen auf ARM64.
Diese DLLs sind zusammen mit der 64-Bit-Version von Ntdll.dll die einzigen 64-Bit-Binärdateien, die in einen 32-Bit-Prozess geladen werden können. Auf Windows 10 ARM können auch CHPE-Binärdateien (Compiled Hybrid Portable Executable) in einen x86-32-Bit-Prozess geladen werden.
Beim Start lädt Wow64.dll die x86-Version von Ntdll.dll (oder die CHPE-Version, sofern aktiviert) und führt den Initialisierungscode aus, der alle erforderlichen 32-Bit-DLLs lädt. Fast alle 32-Bit-DLLs sind unveränderte Kopien von 32-Bit-Windows-Binärdateien, obwohl einige aus Leistungsgründen als CHPE geladen werden. Einige dieser DLLs sind so geschrieben, dass sie sich unter WOW64 anders verhalten als auf 32-Bit-Windows, da sie in der Regel Arbeitsspeicher mit 64-Bit-Systemkomponenten gemeinsam verwenden. Der adressraum im Benutzermodus oberhalb des 32-Bit-Grenzwerts wird vom System reserviert. Weitere Informationen finden Sie unter Leistung und Arbeitsspeicherverbrauch unter WOW64.
Anstatt die x86-Systemdienst-Aufrufsequenz zu verwenden, werden 32-Bit-Binärdateien, die Systemaufrufe tätigen, neu erstellt, um eine benutzerdefinierte Aufrufsequenz zu verwenden. Diese aufrufende Sequenz ist für WOW64 kostengünstig abzufangen, da sie vollständig im Benutzermodus verbleibt. Wenn die benutzerdefinierte Aufrufsequenz erkannt wird, geht die WOW64-CPU zurück in den nativen 64-Bit-Modus und ruft Wow64.dll. Das Klonen erfolgt im Benutzermodus, um die Auswirkungen auf den 64-Bit-Kernel zu verringern und das Risiko eines Fehlers im Thunk zu verringern, der einen Absturz im Kernelmodus, eine Datenbeschädigung oder eine Sicherheitslücke verursachen kann. Die Thunks extrahieren Argumente aus dem 32-Bit-Stapel, erweitern sie auf 64 Bits und nehmen dann den nativen Systemaufruf vor.
Umgebungsvariablen
Wenn ein 32-Bit-Prozess von einem 64-Bit-Prozess erstellt wird oder wenn ein 64-Bit-Prozess von einem 32-Bit-Prozess erstellt wird, legt WOW64 die Umgebungsvariablen für den erstellten Prozess fest, wie in der folgenden Tabelle gezeigt.
| Prozess | Umgebungsvariablen |
|---|---|
| 64-Bit-Prozess |
PROCESSOR _ ARCHITECTURE=AMD64 oder PROCESSOR _ ARCHITECTURE=IA64 oder PROCESSOR _ ARCHITECTURE=ARM64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Die Umgebungsvariablen ProgramW6432 und CommonProgramW6432 wurden ab Windows 7 und Windows Server 2008 R2 hinzugefügt. |
| 32-Bit-Prozess |
PROCESSOR _ ARCHITECTURE=x86 _PROZESSORPROZESSORTEW6432=%PROZESSORARCHITEKTUR% _ ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles% |
Globale Hooks
Die SetWindowsHookEx-Funktion kann verwendet werden, um eine DLL in einen anderen Prozess einzujizieren, wenn die folgenden Bedingungen erfüllt sind:
- Eine 32-Bit-DLL kann nur in einen 32-Bit-Prozess eingefügt werden, und eine 64-Bit-DLL kann nur in einen 64-Bit-Prozess eingefügt werden. Eine 32-Bit-DLL kann nicht in einen 64-Bit-Prozess oder umgekehrt injiziert werden.
- Die 32-Bit- und 64-Bit-DLLs müssen unterschiedliche Namen haben.
- Die Architekturen der DLL und des Prozesses müssen übereinstimmen. Beispielsweise können Sie keine 32-Bit-x86-DLL in einen 32-Bit-ARM-Prozess injizieren.
Weitere Informationen finden Sie unter SetWindowsHookEx.
Beachten Sie, dass die Hooks WH _ MOUSE, WH _ KEYBOARD, WH _ JOURNAL * _, _ WH _ SHELL und low-level für den Thread aufgerufen werden können, der den Hook installiert hat, anstatt den Thread, der den Hook verarbeitet. Für diese Hooks ist es möglich, dass sowohl die 32-Bit- als auch die 64-Bit-Hooks aufgerufen werden, wenn ein 32-Bit-Hook vor einem 64-Bit-Hook in der Hookkette liegt. Weitere Informationen finden Sie unter Verwenden von Hooks.