QEMU에서 iPhone 에뮬레이션

1 month ago 11

여정의 시작

  • iOS 에뮬레이션을 시작하며 기존 오픈 소스 솔루션을 검토함.
  • alephsecurity/xnu-qemu-arm64를 성공적으로 실행했으나, 읽기 전용 프로젝트임이 우려됨.
  • TrungNguyen1909/qemu-t8030를 시도하며 여러 흥미로운 기능을 발견함:
    • iOS 복원 가능
    • iOS 14 실행
    • 최신 QEMU 버전
    • 에뮬레이터 설정 방법에 대한 유용한 위키
  • QEMU에 xnu 커널 패치를 추가한 점이 불만족스러워 PongoOS와 checkra1n 패치를 사용하여 문제를 해결하고자 함.

PongoOS 실행

  • PongoOS 실행 시 부트 코드가 누락되는 문제 발생.
  • ARM 문서와 구글링을 통해 문제 해결.
  • A13 이후 기기에서 지원되지 않는 기능으로 인해 패턴 매칭이 깨짐.

패치 생성 도구

  • Mach-O 파일 간의 차이를 비교하고 어셈블리 차이를 텍스트 패치 파일로 생성하는 도구 개발.
  • PongoOS로 부팅 후 QEMU 모니터를 사용하여 메모리 섹션을 덤프하고 패치 파일 생성.

그래픽 렌더링 문제

  • Apple Silicon GPU 에뮬레이션이 복잡하여 소프트웨어 렌더링과 Metal 호출 전달을 고려함.
  • 소프트웨어 렌더링이 가능하다는 것을 확인했으나, UI가 느리고 아티팩트 발생.
  • Metal 호출 전달은 복잡하여 나중으로 미룸.

IOSurface 문제 해결

  • 프레임버퍼 장치가 필요하여 IOMFB 지원을 시도함.
  • 디스플레이가 검은 화면으로 남아 있어 디버깅 시작.
  • 두 가지 디스플레이 모드 확인: 고정 하드웨어 주소의 원시 프레임버퍼와 DMA를 사용하는 복잡한 API.

주소 랜덤화

  • 커널과 사용자 공간 컴포넌트를 GDB로 디버깅하기 위해 주소 랜덤화 비활성화.
  • dyld 캐시의 동적 라이브러리 주소 랜덤화 해결.

시스템 로그

  • 시스템 로그를 통해 문제를 파악하고자 함.
  • USB를 통한 상호작용이 가능했으나 lockdownd가 제대로 작동하지 않음.
  • 키 쌍을 파일 시스템에서 읽어와 문제 해결.

PAC 문제

  • 백보드의 픽셀 형식 오류를 수정하며 iOS 보안 문제 발생.
  • ARM8.3에서 추가된 포인터 인증 문제 해결을 위해 QEMU에서 PAC 비활성화 시도.

결론

  • 백보드가 제대로 작동하지 않는 이유를 파악하기 위해 더 깊이 조사.
  • 물리적 DMA 메모리를 덤프하여 문제를 파악하려 했으나 실패.
  • iPhone X의 DTB를 수정하여 Apple 로고 표시 성공.
  • 사용자 인증 문제를 해결하며 UI가 복원 단계의 진행 바를 표시.
  • PreBoard를 사용하여 시스템 프로세스를 실험하고 VNC 서버를 추가하여 UI를 잠금 해제.
  • AMX 명령어를 소프트웨어 버전으로 패치하여 문제 해결.
  • SpringBoard가 제대로 표시될 준비가 완료됨.

Read Entire Article