지원 중단된 기기에서 비공식 iOS 실행하기

1 week ago 7

  • iPod touch 3세대에서 공식적으로 지원되지 않는 iOS 6을 구동하기 위한 기술적 과정을 상세히 설명한 프로젝트
  • DeviceTree, iBoot, Kernelcache, Restore Ramdisk, Root Filesystem 등 iOS의 핵심 구성요소를 수정·재구성해 구형 기기에서 최신 버전을 실행
  • Python 스크립트를 이용해 iPhone 3GS와 iPod touch 3의 DeviceTree 차이를 자동으로 비교·적용하고, iBoot 패치로 코드 서명 검증을 우회
  • Kernelcache 재생성에는 macOS의 kcgen 도구를 활용해 armv7용 커널과 kext를 통합, 불필요한 심볼 제거 및 압축 처리
  • 구형 하드웨어의 잠재력을 확장하고, iOS 내부 구조 분석 및 커스텀 펌웨어 제작 기술을 공유한 점에서 높은 기술적 의의

iOS 구성요소 개요

  • iOS는 iBoot, Kernelcache, DeviceTree, 사용자 공간 파일시스템, 보조 프로세서용 펌웨어 등으로 구성
    • iBoot은 부트로더로, iBSS·iBEC·LLB·iBoot 네 가지 형태 존재
    • Kernelcache는 커널과 커널 확장(kext)을 하나의 바이너리로 묶은 파일
    • DeviceTree는 하드웨어 구성과 소프트웨어 동작 파라미터를 정의하며, iBoot이 실행 중 수정
    • 파일시스템은 설치용 restore ramdisk와 영구 저장용 root filesystem으로 구분

iPhone 3GS 테스트

  • iPhone 3GS와 iPod touch 3는 유사한 S5L8920X / S5L8922X SoC를 사용
  • iPhone 3GS는 iOS 6을 공식 지원하므로, iOS 6.0을 iOS 5.1.1의 iBoot 및 DeviceTree와 함께 부팅 테스트
  • 주요 문제는 DeviceTree 불일치로, iOS 6에서 새로 추가된 노드와 속성(nvram-proxy-data)이 필요

DeviceTree 수정

  • Python 스크립트를 작성해 두 DeviceTree 간의 차이를 계산하고 적용
    • 스크립트는 SundanceInH2A 저장소에 공개
  • nvram-proxy-data 속성은 NVRAM 덤프를 포함해야 하며, 비워둘 경우 커널이 초기 단계에서 멈춤
  • iPod touch 3에 적용 시 iPhone 전용 항목을 제거한 후 diff 적용

iBoot 패치

  • 기본적으로 Image3 서명 검사 우회, boot-args 주입, debug-enabled 패치 수행
  • nvram-proxy-data를 동적으로 채워야 하며, 정적 값 사용 시 실제 NVRAM이 덮어써질 위험 존재
  • UpdateDeviceTree() 호출을 대체해 nvram-proxy-data와 random-seed를 삽입
  • amfi=0xff 인자를 추가해 코드 서명 비활성화
  • 다른 iBoot+커널 조합에서는 DeviceTree 차이와 boot_args 구조 확인 필요

Kernelcache 생성

  • iPod touch 3용 iOS 6 커널과 kext가 내부 빌드에 존재했으나, 이를 동시에 로드하려면 사전 링크된 커널캐시(prelinked kernelcache) 생성 필요
  • macOS의 kcgen 도구를 이용해 armv7용 커널캐시 생성
    • 주요 옵션: -arch armv7, -all-personalities, -strip-symbols, -uncompressed
    • 불필요한 심볼 제거 후 lipo -thin armv7으로 단일 슬라이스로 변환
  • 생성된 커널캐시는 압축 후 Image3 컨테이너에 패키징
  • kext 목록은 iPhone 3GS의 iOS 5.1.1과 6.0을 비교해 작성, Wi-Fi kext의 Info.plist 수정 필요

Restore Ramdisk 수정

  • asr 패치 및 options.n88.plist를 options.n18.plist로 변경해 파티션 배치 조정
  • iBoot 익스플로잇 설치를 위해 rc.boot 바이너리를 재구현
    • 램디스크 재마운트 및 umask 설정
    • restored_external -server 호출로 복원 후 재부팅 방지
    • 복원 완료 시 세 번째 파티션 생성, 익스플로잇 기록, boot-partition을 2로 설정 후 재부팅

Root Filesystem 수정

  • /System/Library/CoreServices/SpringBoard.app/N18AP.plist 추가 및 iOS 6 기능 반영
  • iOS 5.1.1과 iPod touch 4의 홈 화면 구성을 병합
  • Multitouch, Wi-Fi, Bluetooth 펌웨어 추가
    • Bluetooth는 /usr/sbin/BlueTool의 하드코딩을 /etc/bluetool로 오버라이드
  • FairPlay 데몬의 LimitLoadToHardware 키 제거로 iPod touch 3에서도 활성화 가능
  • iOS 6.1 이상에서는 LaunchDaemon 서명 캐시로 인해 추가 패치 필요
  • Product ID 맵 수정: iPhone 3GS의 0x2714를 iPod touch 3의 0x2715로 교체
  • MobileGestalt의 getDeviceVariant()를 수정해 항상 "A" 반환
  • DYLD 공유 캐시 수정 시 SHA-1 해시 재계산으로 코드 서명 복구 가능

iBoot 익스플로잇

  • iOS 5의 HFS+ 드라이버 버그를 이용한 익스플로잇 재작성
  • 이전 버전보다 결정적(deterministic)으로 개선

결론 및 향후 계획

  • 전체 작업은 예상보다 어렵지 않았으며, 도구 공개 후 탈옥(jailbreak) 관련 문의 다수 발생
  • 커널 패치와 Cydia 설치로 간단히 탈옥 가능성 존재
  • 다음 목표는 iPad 1에서의 iOS 6 실행 테스트
  • 본 프로젝트는 iOS 내부 구조 분석과 구형 기기 활용에 대한 실질적 참고 자료 제공

Read Entire Article