여정의 시작
- 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가 제대로 표시될 준비가 완료됨.