diosra2’s blog

iOS 脱獄、ダウングレード等

Jailbreak information

32bit Jailbreakが可能な最新バージョンはiOS 9.3.5です。
64bit Jailbreakが可能な最新バージョンはiOS 10.2です。
iPhone 7 Jailbreakが可能な最新バージョンはiOS 10.1.1です。
32bit Untethered Jailbreakが可能な最新バージョンはiOS 9.0.2です。
64bit Untethered Jailbreakが可能な最新バージョンはiOS 9.1です。

iOS 5へデュアルブートをしてみる

注意: この内容は一部不安定です。

注意2: この内容は実験的なものです。これを行ったことでiOS端末が文鎮化(大手ネットメディアの言う、iTunesで復元すれば解決するものではない)する恐れがあります。自己責任で。

 


"Untethered" Dual boot iOS 6.1.3 and iOS 5.1.1 on iPhone 4.

 

iOS 6.xや7.xにはCoolBooterを使ってデュアルブートできますが、iOS 5.xは対応外です。

今回は、そのiOS 5を起動させてみます。

0, 用意したもの

iPhone 4 (iOS 6.1.3)

Tool

dualbootstuff

OpenSSH

 

MacOS

Tool

xpwntool

dmg

iBoot32Patcher

image3maker

Hex Editer

 

iOS 5.1.1 (9B208)のFW(ipsw)

 

注意事項: この記事の内容では、現在のiOSがiPhone 4のiOS 6以下に限って有効です。

他のデバイスでは一部の動作が異なるため、この記事のままでは使えません。一部を変える必要があります。

また、現在のiOSがiOS 7以降ではこの記事の内容は使えません。

 

以下のページの内容がdualbootするのに役立ちます。

https://nyansatan.github.io/dualboot/

 

1, パーティション分割

新しいOSをインストールするスペースを作ります。

危険(ここが一番文鎮化リスクが高い)なので注意。

壊れても自己責任で。

 

SSH等でiOSデバイスに接続します。

まず、dfコマンドで残り容量を確認します。

User:~ root# df -B1

Filesystem       1B-blocks       Used   Available Use% Mounted on

/dev/disk0s1s1  1255940096 1001906176   241475584  81% /

devfs                36352      36352           0 100% /dev

/dev/disk0s1s2 14682333184 1267920896 13414412288   8% /private/var

 

/dev/disk0s1s2を分割するので、サイズを縮小します。

新たに作成するiOS 5のパーティションの分(iOS 5ならRootfs用に1.2GB程度と、適度なデータ領域を足した値)を引いて、その引いた値を/dev/disk0s1s2の容量とします。

User:~ root# hfs_resize 10118860800 /private/var

 

変更されました。

User:~ root# df -B1

Filesystem       1B-blocks       Used  Available Use% Mounted on

/dev/disk0s1s1  1255940096 1001906176  241475584  81% /

devfs                36352      36352          0 100% /dev

/dev/disk0s1s2 10118860800 1267920896 8850939904  13% /private/var

 

gptfdiskを使い、パーティションを分割します。

User:~ root# gptfdisk /dev/rdisk0s1

...

Command (? for help):

 

pを入力。このsector sizeを確認してください。この場合は4096。

Command (? for help): p

Disk /dev/rdisk0s1: 3891211 sectors, 14.8 GiB

Logical sector size: 4096 bytes

 

iを入力、そのあと2を入力。下の赤文字unique GUID部分を確認。

Command (? for help): i

Partition number (1-2): 2

Partition GUID code: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX (Apple HFS/HFS+)

Partition unique GUID: AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE

First sector: 306632 (at 1.2 GiB)

Last sector: 3891188 (at 14.8 GiB)

Partition size: 3584556 sectors (13.7 GiB)

Attribute flags: 0003000000000000

Partition name: 'Data'

 

dを入力、続けて2を入力。

Command (? for help): d

Partition number (1-2): 2

 

nを入力、<enter>、Last sectorの値は、hfs_resizeで縮小したサイズ(この場合は10118860800)をsector size(この場合は4096)で割った値にFirst sector(306632)を足す。

10118860800/4096 + 306632 = 2777057

<enter>、<enter>。

Command (? for help): n

Using 2

First sector (306632-3891205, default = 306632) or {+-}size{KMGTP}: 

Last sector (306632-3891205, default =3891205) or {+-}size{KMGTP}: 2777057

Current type is 'Apple HFS/HFS+'

Hex code or GUID (L to show codes, Enter = AF00): 

Changed type of partition to 'Apple HFS/HFS+'

 

cを入力、続けて2、Data。

Command (? for help): c

Partition number (1-4): 2

Enter name: Data

 

x、a、2、48、49、<enter>。

Command (? for help): x

 

Expert command (? for help): a

Partition number (1-2): 2

 

Toggle which attribute field (0-63, 64 or <Enter> to exit): 48

 

Toggle which attribute field (0-63, 64 or <Enter> to exit): 49

 

 

c、2、Enter the partition's new unique GUIDは最初にiコマンドで確認したunique GUID。この場合は、AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE。

 

Expert command (? for help): c

Partition number (1-2): 2

Enter the partition's new unique GUID ('R' to randomize): AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE

 

x、s、4、m

Command (? for help): x

 

Expert command (? for help): s

Current partition table size is 2.

Enter new size (32 up, default 128): 4

 

Expert command (? for help): m

 

n、3、<enter>、先ほどと同じく、今度は、[iOS 5のRootfs用(システムパーティション)のサイズ]/[sector size] + [First Sector size](この場合は2777058)。

<enter>、<enter>

Command (? for help): n

Partition number (1-4): 3

First sector (2777058-3891205, default = 2777058) or {+-}size{KMGTP}: 

Last sector (2777058-3891205, default =3891205) or {+-}size{KMGTP}:3104738

Current type is 'Apple HFS/HFS+'

Hex code or GUID (L to show codes, Enter = AF00): 

Changed type of partition to 'Apple HFS/HFS+'

 

n、4、<enter>、先ほどと同じく、今度は、[iOS 5のデータパーティションのサイズ]/[sector size] + [First Sector size](この場合は3104740)。

<enter>、<enter>

Command (? for help): n

Partition number (1-4): 4

First sector (3104740-3891205, default = 3104740) or {+-}size{KMGTP}: 

Last sector (3104740-3891205, default =3891205) or {+-}size{KMGTP}:3891188

Current type is 'Apple HFS/HFS+'

Hex code or GUID (L to show codes, Enter = AF00): 

Changed type of partition to 'Apple HFS/HFS+'

  

x、a、4、48、49、<enter>、m

Command (? for help): x

 

Expert command (? for help): a

Partition number (1-4): 4

 

Toggle which attribute field (0-63, 64 or <Enter> to exit): 48

 

Toggle which attribute field (0-63, 64 or <Enter> to exit): 49

 

Expert command (? for help): m

 

※pで正常に分割できているか確認。

wでセーブ。上書きされます。

Command (? for help): w

 

syncコマンドを数回実行。

User:~ root# sync; sync; sync;

 

lsでパーティションが生成されたか確認します。

User:~ root# ls /dev/disk0s1*

/dev/disk0s1  /dev/disk0s1s1  /dev/disk0s1s2  /dev/disk0s1s3  /dev/disk0s1s4

 

*bsizeはデバイスのブロックサイズです。

User:~ root# /sbin/newfs_hfs -s -v System -J -b bsize -n a=bsize,c=bsize,e=bsize /dev/disk0s1s3

User:~ root# /sbin/newfs_hfs -s -v Data -J -P -b bsize -n a=bsize,c=bsize,e=bsize /dev/disk0s1s4

 

これで作業は完了です。

 

2, Rootfs

まずはFW(.ipsw -> .zip)を解凍して、OSファイルを取り出します。

iPhone3,1 - 5.1.1 (9B208)なら038-5508-003.dmgです。

これを復号化します。

iOS 5.xならVFDecryptが使えたはずなので、これでも良いです。

iOS 6以降ではdmgを使うことになります。

 

MacOS側でdmgを作成します。

User$ dmg extract 038-5508-003.dmg decrypt.dmg -k key

User$ dmg build decrypted.dmg UDZO.dmg

できたら復号(この場合はUDZO.dmg)したRootfsをiOSデバイスに送信します。

 

3, インストール

@nyan_satan氏のリポジトリ

https://nyansatan.github.io/apt/

にあるdualbootstuffをインストールします。

 

SSH等でiOSデバイス上でasrを使ってiOSファイルをインストールします。

root# asr restore --source [Rootfs] --target /dev/disk0s1s3 --erase

途中(Erase contents of /dev/disk0s1s3 ()? [ny]:)と聞かれるので、 yを選択します。

Validating target...done

Validating source...done

Erase contents of /dev/disk0s1s3 ()? [ny]: y [← yを選択]

Retrieving scan information...done

Validating sizes...done

Restoring  ....10....20....30....40....50....60....70....80....90....100

Copied xxxxxxxxxx bytes in xx.yy seconds, xxxxx.yy KiB/s

Verifying  ....10....20....30....40....50....60....70....80....90....100

Verified SHA-1 checksum xxxxxxxxxx bytes in xx.yy seconds, xxxx.yy KiB/s

こんな感じにインストールが完了したらOKです。

次に、fsckを実行します。

root# fsck_hfs -f /dev/disk0s1s3

次に、デュアルブートの環境でも動くようにいくつかファイルの変更を行います。

まず、先ほどインストールを終えたOSのあるディスクをマウントします。

User$ mkdir /mnt3

User$ mkdir /mnt4

root# mount_hfs /dev/disk0s1s3 /mnt3

root# mount_hfs /dev/disk0s1s4 /mnt4

 

・fstab

(上の通りの場合、/mnt3/etc/fstab)

/dev/disk0s1 / hfs ro 0 1

/dev/disk0s2 /private/var hfs rw 0 2

となっているところを、

/dev/disk0s1s3 / hfs ro 0 1

/dev/disk0s1s4 /private/var hfs rw 0 2

と変更します。

 

・keybag

場所: /var/keybags/systembag.kb

これが問題です。

これをデュアルブートしたOSの同じ位置(この場合は/mnt4/keybags/)にsystembag.kbをコピーすれば起動はしますが、これではいくつか問題があります。

まず、そもそもこれがないと起動に失敗し、リカバリーモードとなります。

keybagはiOSの通常の復元時に生成されるもので、通常はあり得ません。

次に、これはパスコードの変更等で更新されます。したがって、2番目のOSでパスコードを変更し、そのまま再起動させると起動に失敗し、リカバリーモードとなります。

最後に、iOS 7以降のkeybagはiOS 6以下とでは互換性がないのでコピーしたところで起動しません。

iOS 6の場合はDeviceTreeを改変して、このシステムを無効にし、2番目のOS起動時に新たなkeybagを生成することで安全に起動させられますが、iOS 5ではおそらく(?)それは無効っぽいので使えません。

iOS 5ではCootBooterの方式を使うのが一番安全なのかな?と思います。 

 

今回は実験なので、(起動さえすれば良いので)気にせずkeybagを普通にコピーして、パスコードを変更しないようにします。

/var/keybags/systembag.kb/mnt4/keybags/にコピー。

※上記の通り、この手法はメインのOSがiOS 7以上では使えません。 

 

※安定化(非公式)

root# mount_hfs /dev/disk0s1s3 /mnt3

root# mount_hfs /dev/disk0s1s4 /mnt4

root# rm -rf /mnt4/keybags

root# mkdir /mnt3/mnt2

root# ln -s /mnt2/keybags /mnt4

・/mnt3/etc/fstab

/dev/disk0s1s3 / hfs ro 0 1

/dev/disk0s1s4 /private/var hfs rw 0 2

/dev/disk0s1s2 /mnt2 hfs rw 0 2

 

iOS 6.1.3側のkeybagをiOS 5.1.1のデータパーティションにリンクさせます。これならどちらからでもパスコードの設定が可能です。(パスコードは共有されます。)

 

3, ブートローダー

・必要なもの

iBSS

iBEC

DeviceTree

RestoreRamdisk

KernelCache

(AppleLogo)

これらをFW(ipsw)から用意してください。

 

MacOS側で、xpwntool等でdecryptします

・DeviceTree, RestoreRamdisk, KernelCache

User$ xpwntool [in] [out] -k [key] -iv [iv] -decrypt

 

・iBSS, iBEC

User$ xpwntool [in] [out] -k [key] -iv [iv] 

  

iBSS, iBECはiBoot32Patcherを使って署名チェックを除去するようパッチを当てます。

・iBSS

User$ iBoot32Patcher [in] [out]

 

・iBEC

User$ iBoot32Patcher [in] [out] -b "rd=disk0s1s3 -v cs_enforcement_disable=1 amfi=0xff" 

rd=disk0s1s3: 起動ディスクを/dev/disk0s1s3に。

-v: verbose bootで起動。

cs_enforcement_disable=1 amfi=0xff: CodeSignを無効化。 

 

続いて、multi_kloaderで起動できるようにiBSS, iBECにパッチを当てます。

Hex Editer (私は0xEDを使用。)で以下のように書き換えてください。

(これはiPhone 4 (N90AP)のiOS 5.1.1の場合です。他のデバイスやiOSでは異なります。)

・iBSS

C4 F6 F0 74 -> C7 F6 D0 74

08 F0 7F FF -> 00 BF 00 BF

 

・iBEC

75 70 67 72 61 64 65 00 70 6F 77 -> 66 73 62 6F 6F 74 00 00 70 6F 77

66 61 6C 73 65 00 32 00 66 -> 74 72 75 65 00 00 32 00 66

 

・iBEC (Applelogo Patch) E1FEFFFFEA000000000000000000000000000000000000000000000000000000000000000000000000 -> E1FEFFFFEA0748C6F66F4117F053F900F0E5FE00200021002216F062FD16F0D4FD01F036F867FAF25F

1B481FE01B484FF080414FF0806216F0F3FB46F26F711848C6F66F4116F012F9164811F0 -> 1B481FE0FEF7C6FF00BF00BF00BF00BF00BF00BF00BF00BF00BF00BF00BF00BF164811F0

 

iBECはimg3ファイルに変換してください。

User$ image3maker -t ibec -f [in] -o [out]

 

decryptしたdevicetree, RestoreRamdisk KernelCacheは、以下のように配置します。

/mnt3/devicetree

/mnt3/ramdisk

/mnt3/kernelcache

(/mnt3/applelogo)

 

※Applelogoを表示させるには、iBECにAppleLogo Patchが必要。

 

 

4, 起動

multi_kloaderを使います。

iOSデバイスで以下のコマンドを実行。

root# multi_kloader [iBSS] [iBEC]

 

※ターミナルで実行する場合は、以下のコマンドでないとおそらく起動できません。

root# multi_kloader [iBSS] [iBEC] > /dev/null

 

そのあと、画面が真っ暗になったらスリープボタンかホームボタンか何かを押すと起動が開始されます。

 

起動できました!