WOW64 구현 세부 정보

WOW64 에뮬레이터는 사용자 모드에서 실행됩니다. 32비트 버전의 Ntdll.dll 프로세서의 커널 간에 인터페이스를 제공하고 커널 호출을 가로챌 수 있습니다. WOW64 에뮬레이터는 다음 DLL로 구성됩니다.

  • Wow64.dll Ntoskrnl.exe 진입점 함수에 대한 핵심 에뮬레이션 인프라 및 썽크를 제공합니다.
  • Wow64Win.dll Win32k.sys 진입점 함수에 대한 썽크를 제공합니다.
  • (x64에만 해당) Wow64Cpu.dll x64에서 x86 프로그램 실행을 지원합니다.
  • (Intel Itanium만 해당) IA32Exec.bin에는 x86 소프트웨어 에뮬레이터가 포함되어 있습니다.
  • (Intel Itanium에만 해당) Wowia32x.dll IA32Exec.bin과 WOW64 사이의 인터페이스를 제공합니다.
  • (ARM64에만 해당) xtajit.dll x86 소프트웨어 에뮬레이터를 포함합니다.
  • (ARM64에만 해당) wowarmw.dll ARM64에서 ARM32 프로그램 실행을 지원합니다.

이러한 DLL은 64비트 버전의 Ntdll.dll 함께 32비트 프로세스에 로드할 수 있는 유일한 64비트 이진 파일입니다. ARM의 Windows 10 CHPE(컴파일된 하이브리드 이식 가능한 실행 파일) 이진 파일도 x86 32비트 프로세스에 로드될 수 있습니다.

시작 시 Wow64.dll x86 버전의 Ntdll.dll(또는 CHPE 버전(사용하도록 설정된 경우)을 로드하고 초기화 코드를 실행하여 필요한 모든 32비트 DLL을 로드합니다. 거의 모든 32비트 DLL은 32비트 Windows 이진 파일의 수정되지 않은 복사본이지만 일부는 성능상의 이유로 CHPE로 로드됩니다. 이러한 DLL 중 일부는 WOW64에서 32비트 Windows와 다르게 동작하도록 작성됩니다. 일반적으로 64비트 시스템 구성 요소와 메모리를 공유하기 때문입니다. 32비트 제한을 초과하는 모든 사용자 모드 주소 공간은 시스템에서 예약합니다. 자세한 내용은 WOW64의 성능 및 메모리 소비를 참조하세요.

x86 시스템 서비스 호출 시퀀스를 사용하는 대신 시스템 호출을 만드는 32비트 이진 파일은 사용자 지정 호출 시퀀스를 사용하도록 다시 빌드됩니다. 이 호출 시퀀스는 WOW64가 사용자 모드로 완전히 유지되므로 가로채는 데 저렴합니다. 사용자 지정 호출 시퀀스가 검색되면 WOW64 CPU가 다시 네이티브 64비트 모드로 전환되고 Wow64.dll 호출됩니다. Thunking은 사용자 모드에서 수행되어 64비트 커널에 미치는 영향을 줄이고 커널 모드 충돌, 데이터 손상 또는 보안 허점을 일으킬 수 있는 썽크의 버그 위험을 줄입니다. 썽크는 32비트 스택에서 인수를 추출하고 64비트까지 확장한 다음 네이티브 시스템 호출을 합니다.

환경 변수

64비트 프로세스에서 32비트 프로세스를 만들거나 32비트 프로세스에서 64비트 프로세스를 만들 때 WOW64는 다음 표와 같이 생성된 프로세스에 대한 환경 변수를 설정합니다.

Process 환경 변수
64비트 프로세스
PROCESSOR_ARCHITECTURE=AMD64 또는 PROCESSOR_ARCHITECTURE=IA64 또는 PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: ProgramW6432 및 CommonProgramW6432 환경 변수는 Windows 7 및 Windows Server 2008 R2부터 추가되었습니다.
32비트 프로세스
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

글로벌 후크

SetWindowsHookEx 함수를 사용하여 다음 조건이 충족되는 경우 다른 프로세스에 DLL을 삽입할 수 있습니다.

  • 32비트 DLL은 32비트 프로세스에만 삽입할 수 있으며 64비트 DLL은 64비트 프로세스에만 삽입할 수 있습니다. 32비트 DLL을 64비트 프로세스에 삽입하거나 그 반대로 삽입할 수 없습니다.
  • 32비트 및 64비트 DLL의 이름은 서로 달라야 합니다.
  • DLL 및 프로세스의 아키텍처가 일치해야 합니다. instance 경우 32비트 x86 DLL을 32비트 ARM 프로세스에 삽입할 수 없습니다.

자세한 내용은 SetWindowsHookEx를 참조하세요.

후크를 처리하는 스레드가 아니라 크를 설치한 스레드에서 WH_MOUSE,WH_KEYBOARD, WH_JOURNAL*, WH_SHELL 및 하위 수준 후크를 호출할 수 있습니다. 이러한 후크의 경우 32비트 후크가 후크 체인의 64비트 후크보다 앞서 있는 경우 32비트 후크와 64비트 후크가 모두 호출될 수 있습니다. 자세한 내용은 후크 사용을 참조하세요.