diosra2’s blog

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

iPhone 5でiOS 9.0 betaのデュアルブート。

重要: この記事の内容により生じた損害について、当ブログでは一切責任を取りません。自己責任でお願いします。

 

以下の記事の内容です。

iPhone 5でiOS 9.0 beta 1を脱獄して動かしてみた。 - diosra2’s blog

*デュアルブート先のiOSを脱獄する方法は含まれていません。

使用したもの

iPhone 5 iOS 9.0.2 [13A452] ...Pangu9でUntethered Jailbreak

Mac

 

使用したツール

iOS: dualbootstuff (by @nyan_satan), OpenSSH ...いずれもCydiaからインストール可能。

Mac: 0xED (Hex editor), Hopper Disassembler(v4), XPwn (xpwntool, dmg), iBoot32Patcher (by iH8sn0w)

 

1, 脱獄 [iOS/Mac]

省略します。

Untethered Jailbreakの方が便利かなと思います。iOS 9とiOS 6以下は相性が最悪なので、iOS 8.0-9.3.4を使うといいかなと思います。

 

2, デュアルブート用のiOSイメージの作成 [Mac]

・RootFS

iOS 9.3.5まではRootFS含めて全てが、iOS 10.0 beta 1まではRootFS以外が暗号化されています。

そのため、復号化が必要です。

"dmg"を使用してdecryptします。

User$ dmg [extract|build|build2048|res|iso|dmg] <in> <out> (-k <key>) (partition)

FW Keyはこちらです。

MonarchVailPrime 13A4254v (iPhone5,2) - The iPhone Wiki

 

User$ dmg extract 058-21658-023.dmg decrypt.dmg -k [Key]

User$ dmg build decrypt.dmg rootfs.dmg

rootfs.dmgが復号化されたRoot FileSystemとなります。

 

・iBSS

xpwntoolで復号化し、iBoot32Patcherでパッチします。

User$ xpwntool iBSS.n42.RELEASE.dfu iBSS.dec -k [Key] -iv [IV]

User$ iBoot32Patcher iBSS.dec PwnediBSS

 

multi_kloaderで利用できるように、さらにPwnediBSSをHex Editorで以下のように書き換えます。

0x0000099C: 00 BF 00 BF

0x00000A28: 00 00 D0 7F

 

・iBEC

xpwntoolで復号化し、iBoot32Patcherでパッチします。

User$ xpwntool iBEC.n42.RELEASE.dfu iBEC.dec -k [Key] -iv [IV]

User$ iBoot32Patcher iBEC.dec PwnediBEC -b "-v rd=disk0s1s3"

 

Hex Editorで以下のように書き換えます。

0x000012F8: 00 BF 00 68

0x000012FC: 00 BF 00 BF

0x00001304: 02 0F F8 D1

0x00038A3D: 00 66 73 62 6F 6F 74 00 (Text: upgrade -> fsboot)

0x00038BF2: 74 72 75 65 00 (Text: false -> true )

0x00038CBA: 30 (Text: 2 -> 0)

 

最後にIMG3ファイルを作成します。

User$ xpwntool iBEC.n42.RELEASE.dfu iBEC.img3 -k [Key] -iv [IV] -decrypt

User$ xpwntool PwnediBEC PwnediBEC.img3 -t iBEC.img3

 

・DeviceTree, KernelCache, Ramdisk

xpwntoolで復号化します

User$ xpwntool DeviceTree.n42ap.img3 DeviceTree.img3 -k [Key] -iv [IV] -decrypt

User$ xpwntool kernelcache.release.n42 kernelcache.img3 -k [Key] -iv [IV] -decrypt

User$ xpwntool 058-20975-024.dmg Ramdisk.img3 -k [Key] -iv [IV] -decrypt

 

3, パーティション

iOS 10.2.1デュアルブート時の記事を流用します。ほぼ同じです。

 

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

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

壊れても自己責任でお願いします。

!!!!警告!!!! 

注意点を守らないとデバイスが何をやっても完全に復元不能(brick)な鉄クズになります

 

SSHでiOSデバイスに接続します。(OpenSSHをインストールしておいてください。)

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を分割するので、hfs_resizeでサイズを縮小します。

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

単位はByteです。(以下の数値は全てiOS 5の値なので注意してください。)

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。

*cはパーティションの名前を設定します。第1パーティションは"System"となっていますが、この"System"を他のパーティションに設定しないでください。文鎮化して復元不能なります。

Command (? for help): c

Partition number (1-4): 2

Enter name: Data

-> Attribute flagsが"0003000000000000"なので

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>、先ほどと同じく、今度は、[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>、先ほどと同じく、今度は、[データパーティションのサイズ]/[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+'

-> 第4パーティション(新規作成のデータパーティション)のAttribute flagsを"0003000000000000"にセットします。

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

 

newfs_hfsでディスクをフォーマットします。*bsizeはデバイスのブロックサイズです。(新しいデバイスはおそらく4096)

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

 

これで作業は完了です。

 

4, iOS 9.0 betaを2番目の領域にインストール [iOS]

先ほど作成したRoot Filesystem(rootfs.dmg)を使用します。

AFC2, SSHなどなんでもいいのでMacからデバイスに転送してください。

以下のコマンドが復元コマンドです。([Rootfs]=rootfs.dmgの場所)

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

 

インストールが完了したらデュアルブート用にファームウェアを調整します。

root# mkdir /mnt1

root# mkdir /mnt2

root# mount_hfs /dev/disk0s1s3 /mnt1

root# mount_hfs /dev/disk0s1s4 /mnt2

root# mv -v /mnt1/private/var/* /mnt2

root# cp -a -v /usr/local /mnt1/usr

root# mkdir /mnt1/mnt2

root# ln -s /mnt2/keybags /mnt2/keybags

 

さらに、以下のファイルを書き換えます。

*私の手法ではKeyBagはメインシステムに対してsymbolic linkを貼って共有しています。

・/mnt1/etc/fstab

/dev/disk0s1s3 / hfs ro 0 1

/dev/disk0s1s4 /private/var hfs rw,nosuid,nodev 0 2

/dev/disk0s1s2 /mnt2 hfs rw 0 2

 

5, 起動 [iOS]

Root("/")に2で作成したファイルを設置します。

・PwnediBSS -> /iBSS

・PwnediBEC.img3 -> /iBEC

・DeviceTree.img3 -> /devicetree

・KernelCache.img3 -> /kernelcache

・Ramdisk.img3 -> /ramdisk

 

ターミナルやSSHで以下のコマンドを入力することで起動します。

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

 

できました(´・ω・`)

f:id:diosra2:20180326110847j:plain

Copyright (C) 2017-2018 Diosra2. All Rights Reserved.