Szczegóły implementacji WOW64
Emulator WOW64 działa w trybie użytkownika. Zapewnia interfejs między 32-bitową wersją Ntdll.dll a jądrem procesora i przechwytuje wywołania jądra. Emulator WOW64 składa się z następujących bibliotek DLL:
- Wow64.dll zapewnia podstawową infrastrukturę emulacji i thunks dla funkcji punktu wejścia Ntoskrnl.exe.
- Wow64Win.dll zapewnia thunks dla funkcji punktu wejścia Win32k.sys.
- (tylko x64) Wow64Cpu.dll zapewnia obsługę uruchamiania programów x86 na x64.
- (Tylko Intel Itanium) IA32Exec.bin zawiera emulator oprogramowania x86.
- (Tylko Intel Itanium) Wowia32x.dll zapewnia interfejs między IA32Exec.bin i WOW64.
- (tylko ARM64) xtajit.dll zawiera emulator oprogramowania x86.
- (tylko ARM64) wowarmw.dll zapewnia obsługę uruchamiania programów ARM32 w usłudze ARM64.
Te biblioteki DLL, wraz z 64-bitową wersją Ntdll.dll, są jedynymi 64-bitowymi plikami binarnymi, które można załadować do procesu 32-bitowego. W systemie Windows 10 w usłudze ARM pliki binarne CHPE (skompilowany hybrydowy przenośny plik wykonywalny) mogą być również ładowane do procesu x86 32-bitowego.
Podczas uruchamiania Wow64.dll ładuje wersję x86 Ntdll.dll (lub wersję CHPE, jeśli jest włączona) i uruchamia kod inicjowania, który ładuje wszystkie niezbędne 32-bitowe biblioteki DLL. Prawie wszystkie 32-bitowe biblioteki DLL są niezmodyfikowanymi kopiami 32-bitowych plików binarnych systemu Windows, choć niektóre są ładowane jako CHPE ze względu na wydajność. Niektóre z tych bibliotek DLL są zapisywane w inny sposób w systemie WOW64 niż w 32-bitowym systemie Windows, zwykle dlatego, że współużytkują pamięć ze składnikami systemu 64-bitowego. Cała przestrzeń adresowa trybu użytkownika powyżej limitu 32-bitowego jest zarezerwowana przez system. Aby uzyskać więcej informacji, zobacz Wydajność i zużycie pamięci w obszarze WOW64.
Zamiast używać sekwencji wywołań systemu x86, 32-bitowe pliki binarne, które tworzą wywołania systemowe, są odtwarzane w celu używania niestandardowej sekwencji wywołań. Ta sekwencja wywołań jest niedroga dla WOW64 do przechwycenia, ponieważ pozostaje całkowicie w trybie użytkownika. Po wykryciu niestandardowej sekwencji wywołań procesor WOW64 przechodzi z powrotem do natywnego trybu 64-bitowego i wywołuje do Wow64.dll. Thunking odbywa się w trybie użytkownika, aby zmniejszyć wpływ na 64-bitowe jądro i zmniejszyć ryzyko błędu w thunk, który może spowodować awarię trybu jądra, uszkodzenie danych lub dziurę zabezpieczeń. Thunks wyodrębnić argumenty ze stosu 32-bitowego, rozszerzyć je na 64 bity, a następnie wywołać natywny system.
Zmienne środowiskowe
Gdy proces 32-bitowy jest tworzony przez 64-bitowy proces lub gdy proces 64-bitowy jest tworzony przez 32-bitowy proces, WOW64 ustawia zmienne środowiskowe dla utworzonego procesu, jak pokazano w poniższej tabeli.
Proces | Zmienne środowiskowe |
---|---|
Proces 64-bitowy |
PROCESSOR_ARCHITECTURE=AMD64 lub PROCESSOR_ARCHITECTURE=IA64 lub PROCESSOR_ARCHITECTURE=ARM64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008, Windows Vista, Windows Server 2003 i Windows XP: ProgramW6432 i CommonProgramW6432 zmienne środowiskowe zostały dodane począwszy od systemów Windows 7 i Windows Server 2008 R2. |
Proces 32-bitowy |
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles% |
Globalne haki
Funkcja SetWindowsHookEx może służyć do wstrzykiwania biblioteki DLL do innego procesu, jeśli spełnione są następujące warunki:
- 32-bitowa biblioteka DLL może być wstrzykiwana tylko do 32-bitowego procesu, a 64-bitowa biblioteka DLL może być wstrzykiwana tylko do procesu 64-bitowego. Nie można wstrzyknąć 32-bitowej biblioteki DLL do procesu 64-bitowego lub odwrotnie.
- 32-bitowe i 64-bitowe biblioteki DLL muszą mieć różne nazwy.
- Architektury biblioteki DLL i procesu muszą być zgodne. Na przykład nie można wstrzyknąć 32-bitowej biblioteki DLL x86 do 32-bitowego procesu ARM.
Aby uzyskać więcej informacji, zobacz SetWindowsHookEx.
Należy pamiętać, że WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELLi haki niskiego poziomu mogą być wywoływane na wątku, który zainstalował hak, a nie wątk przetwarzania haka. W przypadku tych haków możliwe jest, że zarówno 32-bitowe, jak i 64-bitowe haki będą wywoływane, jeśli 32-bitowy hak jest przed 64-bitowym hakiem w łańcuchu haka. Aby uzyskać więcej informacji, zobacz Using Hooks.