명령줄에서 IPA를 설치·백업·삭제하는 탈옥 기기용 도구입니다. autopear/ipainstaller 3.4.1을 최신 Theos(Linux) 툴체인으로 빌드할 수 있게 고치고, rootful / rootless 두 가지 패키지로 빌드하도록 구성했습니다.
packages/ 안에 두 개가 모두 들어 있습니다.
| 파일 | 설치 경로 | deb Architecture | 대상 |
|---|---|---|---|
ipainstaller_3.4.1_rootful.deb |
/usr/bin |
iphoneos-arm |
iOS 5.0 ~ 14.x 전 기종, 그리고 iOS 15/16의 rootful 탈옥 |
ipainstaller_3.4.1_rootless.deb |
/var/jb/usr/bin |
iphoneos-arm64 |
iOS 15+ rootless 탈옥 (Dopamine, palera1n rootless, XinaA15 등) |
패키지 저장소에 올릴 거라면 <패키지명>_<버전>_<아키텍처>.deb 형식이 관례입니다.
build.sh의 build_deb에서 파일명만 바꾸면 됩니다.
두 패키지 모두 ipainstaller와, 같은 바이너리를 가리키는 installipa 심볼릭 링크를 설치합니다.
rootful 패키지는 유니버설 바이너리이며, 슬라이스마다 최소 배포 타깃을 따로 잡아 링크했습니다.
| 슬라이스 | 최소 iOS | 대상 기기 |
|---|---|---|
armv7 |
5.0 | 32비트 기기 (iPhone 4/4S, iPad 1/2/3, iPod touch 4) — iOS 5.0 ~ 10.3.4 |
armv7s |
6.0 | iPhone 5/5c, iPad 4 — iOS 6.0 ~ 10.3.4 |
arm64 |
7.0 | 64비트 기기 전부 (arm64e 기기 포함) — iOS 7.0 이상 |
rootless 패키지는 arm64 슬라이스만 담습니다. rootless 탈옥 자체가 iOS 15 이상 64비트 전용이라 32비트 슬라이스는 의미가 없습니다.
- 아래쪽 한계는 iOS 5.0. Clang이
-stdlib=libc++를 iOS 5.0 미만 배포 타깃에서 거부합니다(invalid deployment target for -stdlib=libc++). 소스에 C++이 실제로 쓰이진 않지만.mm파일이라 ObjC++로 컴파일되고, upstream 소스를 그대로 두는 쪽을 택했기 때문에 5.0이 하한입니다. - armv6는 불가능. 최신 SDK의
.tbd스텁이armv7 / armv7s / arm64 / arm64e만 내보내므로 armv6(iPhone 3G/3GS)용 링크 자체가 되지 않습니다. 즉 iOS 4.x 이하 기기는 이 툴체인으로는 대상이 될 수 없습니다. - arm64e는 일부러 뺐습니다. 번들된 clang이 만드는 arm64e 오브젝트를 링커가
incompatible arm64e ABI compiler로 거부합니다. 잘못된 PAC ABI로 서명된 arm64e 슬라이스를 넣으면 A12 이상 기기에서 dyld가 그 슬라이스를 골라 실행에 실패할 수 있으므로, arm64 슬라이스만 두었습니다. arm64e 기기는 arm64 코드를 그대로 실행합니다.
빌드 산출물에 대해 확인한 것은 슬라이스 구성, 슬라이스별 LC_VERSION_MIN_IPHONEOS,
코드 서명과 엔타이틀먼트 삽입, deb 레이아웃과 권한까지입니다.
실제 기기에서의 동작은 테스트하지 않았습니다. 특히 이 코드는 2017년판이라
MobileInstallation / LSApplicationWorkspace 비공개 API에 의존하는데, 최신 iOS에서
그 SPI가 예전과 같이 동작하는지는 별도 확인이 필요합니다.
Theos와 iPhoneOS 16.5 SDK가 필요합니다.
export THEOS=/path/to/theos
./build.shbuild.sh는 슬라이스를 하나씩 따로 링크하고(Theos는 한 번 호출에 배포 타깃 하나만
다룹니다), lipo로 합친 뒤 sign.plist로 서명하고, rootful/rootless deb 두 개를
packages/에 만듭니다. 각 슬라이스가 의도한 최소 버전으로 링크됐는지 스크립트가
직접 확인하고, 어긋나면 빌드를 중단합니다.
Theos 표준 경로도 그대로 동작합니다.
make package FINALPACKAGE=1
make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless THEOS_PACKAGE_ARCH=iphoneos-arm64다만 이 경우 모든 슬라이스가 Makefile의 TARGET 하나를 공유합니다. 즉 arm64
슬라이스에도 min iOS 5.0이 찍히고(실제로 존재하지 않는 조합입니다), rootless
패키지에도 쓸모없는 32비트 슬라이스가 들어갑니다. 실제로 배포할 패키지는 build.sh로
만드세요.
Usage: ipainstaller [OPTION]... [FILE]...
ipainstaller -{bB} [APP_ID] [-o OUTPUT_PATH]
ipainstaller -i [APP_ID]...
ipainstaller -l
ipainstaller -u [APP_ID]...
Options:
-a Show tool about information.
-b Back up application with given identifier to IPA.
-B Back up application with given identifier and its documents and settings to IPA.
-c Perform a clean install. 기존 설치가 있으면 문서·리소스를 지웁니다 (-n 포함).
-d Delete IPA file(s) after installation.
-f Force installation, do not check capabilities and system version.
-h Display this usage information.
-i Display information of installed application(s).
-l List identifiers of all installed App Store applications.
-n Do not restore saved documents and other resources.
-o Output IPA to specified path (기본값 /var/mobile/Documents/).
-q Quiet mode, suppress all normal outputs.
-Q Quieter mode, suppress all outputs including errors.
-r Remove iTunesMetadata.plist after installation.
-u Uninstall application with given identifier(s).
UIDevice-Capabilities— 최신 SDK에는 GraphicsServices 헤더가 없어UIDevice/BOOL조차 선언되지 않은 채 컴파일이 깨졌습니다. 필요한 헤더를 포함시키고,GSSystemHasCapability(iOS 6 이하 경로)를MGGetBoolAnswer와 똑같이dlsym으로 지연 조회하게 바꿨습니다. 덕분에 GraphicsServices에 대한 링크 의존이 사라져, 구형·신형 펌웨어 어디서도 로드에 실패하지 않습니다.Makefile— 없어진 GraphicsServices private framework 참조 제거, 실제로 심볼을 하나도 쓰지 않으면서 armv7 전용이라 arm64 링크에서 경고만 내던MobileInstallation스텁 제거(코드가 어차피dlopen으로 씁니다), rootless 설치 프리픽스를 반영하도록before-package수정.layout/DEBIAN/control—gsc.armv7pre-dependency 제거. 64비트 기기의 패키지 관리자는 이 가상 패키지를 제공하지 않아 설치가 거부됩니다. 최소 펌웨어는 4.0에서 5.0으로 올렸습니다(위 "왜 이 범위인가" 참고).csu/crt1.3.1.o추가 — iOS 6.0 미만은LC_MAIN이전 방식이라 시작 오브젝트가 필요한데 최신 SDK에는 없습니다. 없으면 링커가 조용히 armv7 슬라이스를 iOS 7.0으로 올려버립니다. 자세한 내용은csu/README.md.build.sh추가 — 위의 슬라이스별 빌드와 두 가지 패키징을 자동화.
- ZipArchive — https://github.com/mattconnolly/ZipArchive
- UIDevice-Extension — https://github.com/erica/uidevice-extension
- capability 확인 방식 — https://github.com/a3tweaks/Flipswitch/blob/master/FSCapability.m
- MiniZip — http://www.winimage.com/zLibDll/minizip.html
fixblankicon은 ipod4g가 만든 실행 파일로, 예전 스크립트에서 빈 아이콘을 고치는 데
쓰였습니다. 바이너리에서는 사용하지 않습니다.