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

> Clean Markdown view of GeekNews topic #24668. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24668](https://news.hada.io/topic?id=24668)
- GeekNews Markdown: [https://news.hada.io/topic/24668.md](https://news.hada.io/topic/24668.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-11-28T06:37:18+09:00
- Updated: 2025-11-28T06:37:18+09:00
- Original source: [nyansatan.github.io](https://nyansatan.github.io/run-unsupported-ios/)
- Points: 1
- Comments: 1

## Topic Body

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

## Comments



### Comment 46894

- Author: neo
- Created: 2025-11-28T06:37:18+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=46063272) 
- iDevices에도 이런 게 꼭 필요하다고 생각함  
  오래됐지만 여전히 쓸 만한 iPad Air 1세대가 **e-waste**로 버려지는 건 말이 안 됨  
  Apple이 더 이상 지원하지 않고, 다른 **운영체제 설치조차 막는 정책**이 문제임  
  Mac에는 [OpenCore Legacy Patcher](https://github.com/dortania/OpenCore-Legacy-Patcher)가 있어서 구형 Mac에서도 최신 macOS를 돌릴 수 있음
  - 관련해서, 오래된 iOS 기기에서 동작하는 앱들을 필터링해 볼 수 있는 [앱 리스트](https://cjstewart88.github.io/vintage/)를 만들어둠
  - 이런 논의는 **전자폐기물 현실 부정**처럼 느껴짐  
    “오래됐지만 쓸만하다”기보다는 그냥 “오래된 기기”일 뿐임  
    기술 발전 속도가 너무 빠르기 때문에, 2013년 iPad Air 같은 기기는 이제 웹 브라우징조차 버거움  
    OpenCore Legacy Patcher로 2012년 Mac mini를 써봤지만, **성능 저하와 커널 패닉** 때문에 결국 Linux로 바꿨음  
    결국 이런 기기들은 일종의 **임시 소비재**로 봐야 함  
    수리권은 중요하지만, 대부분의 사용자는 오래된 기기를 계속 쓰지 않음  
    자동차 비유로 말하자면, 1999년식 Corolla가 완전히 오픈소스가 되어도 대부분은 새 차를 살 것임
  - Apple Silicon과 **Tahoe**의 등장으로 OCLP의 미래가 불투명해졌음  
    Dortania 팀도 Apple Silicon 지원은 사실상 불가능하다고 했고, T2 칩이 들어간 Intel Mac들도 곧 지원이 끊길 듯함  
    결국 구형 Mac도 iPhone, iPad처럼 **지원 종료 논의**를 하게 될 날이 올 것 같음
  - 최근 Mercari에서 iPad Air 1을 25달러에 구입했는데 상태가 아주 좋음  
    EPUB과 PDF는 잘 처리하지만, **WebKit이 너무 오래되어** 웹 브라우징은 거의 불가능함  
    커널은 2021년 버전으로 보이지만 WebKit은 2018년 이후 멈춘 듯함
  - “다른 OS 설치를 막는다”는 게 구체적으로 **어떻게 구현되는지** 궁금함

- 약간 주제에서 벗어나지만, iPhone 5/5s/SE를 여러 대 가지고 있음  
  오프라인 전용으로 **심박수 기록, 액션캠 제어, 음성 녹음** 등에 사용 중임  
  여전히 작고 빠르고, 2025년에도 충분히 쓸 만함
  - 나도 더 벗어나서, Samsung Galaxy IV의 **라디오 모듈을 제거**해봤음  
    iPhone에서도 가능한지는 모르겠지만 흥미로운 실험이었음

- Apple 입사 초기에 iOS 6과 Snow Leopard 프로젝트를 경험했음  
  이 글을 보니 예전 **폐쇄형 OS 구조와 용어들**이 떠올라서 반가웠음

- 2014년산 iPad Air를 여전히 사랑함  
  iOS 12.5가 마지막 버전이지만, 대부분의 앱은 잘 작동함  
  하루 6~7시간씩 쓰는데, **조금 더 최신 브라우저**만 있으면 충분함
  - 이게 바로 **계획적 진부화**의 사례라고 생각함  
    Apple은 iOS에서 자체 렌더링 엔진을 쓰는 브라우저를 금지함  
    그래서 iOS 업데이트가 멈추면 Safari뿐 아니라 **모든 브라우저와 WebView 앱**이 동시에 구형이 되어버림

- 흥미롭긴 한데, 이 방법으로 iOS 26에서 **iOS 18로 다운그레이드**할 수 있으면 정말 마법 같을 것 같음
  - 26(Tahoe)은 모든 플랫폼에서 **버그가 많고 완성도가 낮음**  
    MacBook과 iPhone 모두에서 품질이 예전만 못함
  - 아마 **EU 소송**이라도 있어야 OS 다운그레이드가 가능해질 듯함  
    나도 옛날 폰을 iOS 16으로 돌려서 **탈옥**해보고 싶음
  - 아쉽게도, 해당 기기에는 **익스플로잇이 없음**  

- Apple 기기에도 **Lineage OS 같은 대안 OS**가 있었으면 좋겠음
  - 문제의 근원은 **부트로더 잠금 정책**임  
    Apple이 이를 풀지 않는 한, 자유로운 OS 설치는 불가능함

- 혹시 이 방법으로 iPhone 2G에 **iPhone OS 1.0**을 부팅할 수 있을까 궁금함  
  내 기기에서는 1.1.4까지만 부팅되고, 1.1.1은 **FTL 초기화 실패**로 멈춤  
  예전 **긴급전화 해킹 활성화**를 다시 해보고 싶지만, 그때 쓰던 2G는 잃어버렸음

- 흥미로운 글이었음  
  다만 코드 예시에서 `--bundle-id`는 각 줄 앞에 붙는 것이므로, **prepend**가 맞음

- 오래된 iPad Air 1을 가지고 있는데, iOS 12에서 **업그레이드 가능한지** 궁금함

- 기업들이 더 이상 지원하지 않는 기기는 **강제로 개방하도록 법제화**되면 좋겠음
