-
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 내부 구조 분석과 구형 기기 활용에 대한 실질적 참고 자료 제공