diosra2’s blog

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

iPhone 5でデュアルブートを利用したiOS 10の起動と完全脱獄の方法

概要は前回の記事と同じですが、今回は新たに適切なKernel PatchによってCydia Substrateを動かすことができました。 

IMG_4679.MOV

概要

デュアルブートがベースとなるので、iOS 9.0.2などの安定した完全脱獄環境である32-bitデバイスであることが条件になります。

デュアルブートするiOSはこれまで同様にSHSHは不要です。

この動画ではパッチされたLLBによりあらかじめFlashしたiBootを起動してブートするという方法(@ShadowLee19氏の利用している手法)をとってデュアルブートを実現しています。

パッチされたiBootはBootargsによってデュアルブートのiOSを署名認証を無効にした状態で起動します。そのため起動時にKernel Patchなどの脱獄作業を行うことでiOSは完全に脱獄された状態で起動します。

初回起動の場合はiOS 9.0.2の起動・脱獄を経由してkloaderを実行しているので起動には2分ほど時間がかかりますが(上の動画の最初の起動)、一度iOS 10を起動させていれば、iOS 10側でkloaderを実行することでiOS 9.0.2の起動をせずにiOS 10の起動を行えるので起動時間は1分程度と通常通りの時間で済みます(動画最後)。

方法

条件

A6デバイス (iPhone 5, iPhone 5c, iPad 4th)

iOS 7.0-8.4, 9.0-9.0.2の安定な完全脱獄、またはiOS 8.4.1, iOS 9.1-9.3.4の完全脱獄環境

tfp0 patch

手順

LLB/iBoot、またはiBECのパッチ

iOS 10はDeleloper Beta1以外のファームウェアは暗号化されてないので、基本的にはIVKeyは不要です。

・DeviceTree, KernelCache, (RestoreRamdisk :iBECを使用する場合)

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

 ・LLB, iBoot (iBEC)

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

・LLB Patch

User$ iBoot32Patcher [in] [out]

 ・iBoot (iBEC) Patch

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

 

iBECをベースに行う場合はこちらこちらを参考にしてください。

 

iBootベースの場合はさらに以下のパッチが必要です。

・BootArgsの有効化

*以下はiBoot-3393 (iOS 10.0b1 [14A5261v]) の場合

iBootをdisassemble、「rd=disk0s1s3 -v cs_enforcement_disable=1 amfi_get_out_of_my_way=1」を検索。

0xbff179dcのcmp r1, #0x0をcmp r1, #0x1に。

...

bff179cc         ldr        r4, = 0xbff565c8

bff179ce         ldr        r0, = 0xbff44844 ;"rd=disk0s1s3 -v cs_enforcement_disable=1 amfi_get_out_of_my_way=1"

bff179d0         ldr        r6, = 0xbff3f320

bff179d2         ldr        r1, [r4]

bff179d4         ldr.w      r2, [sl, #0x1c]

bff179d8         ldr.w      r8, [sl, #0x18]

bff179dc         cmp        r1, #0x0 <- replace #0x1

bff179de         str        r2, [sp, #0x88 + var_50]

bff179e0         ldr.w      sl, [sp, #0x88 + var_44]

bff179e4         nop

...

 

IMG3 TYPE TAG

Hex Editerで検索、タグの書き換え。

このままだと通常のファームウェアとタグがかぶるので書き換えることで回避させます。

・LLB

LLBからはiBootをロードします。iBootのタグはibotとなるので "tobi"で検索し、書き換えます。(例: tobi -> bobi)

・iBoot

上記の通り、iBootのタグはibotなので先頭の(0x10, 0x20) "tobi"を上で書き換えたように書き換えます (tobi -> bobi)。その後、iBootはDeviceTree(dtre) を読み込むので"ertd"で検索し、書き換えます。(例: ertd -> brtd)

また、KernelCacheは"/System/Library/Caches/com.apple.kernelcaches/kernelcache"を参照するので書き換えます。(例: /System/Library/Caches/com.apple.kernelcaches/kernelcache -> /System/Library/Caches/com.apple.kernelcaches/kernelcachb)

・DeviceTree 

上記の通り、DeviceTreeのタグはdtreなので先頭の(0x10, 0x20) "ertd"を上で書き換えたように書き換えます (ertd -> brtd)。

そのほか、ブートロゴやリカバリーロゴに関しても必要に応じて同じように作業を行います。(必須ではないのでパスして構いません。) 

最後にxpwntoolでimg3ファイルを完成させます。

 ・LLB, iBoot (iBEC)

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

User$ xpwntool [上記でpatchしたファイル] [out] -t [decrypt_img3] 

 

odysseusやfuturerestoreを利用してSHSHを使った復元、patch済みBootloaderのflash

上でパッチしたブートローダーをリネームします。

例えば、iBootなら"iBootB.[(iPhone5,2ならn42].RELEASE.img3"のように変更し、"Firmware/all_flash/all_flash.[(iPhone5,2ならn42ap].production"にLLB以外を格納します。(LLBはkloaderを使うのでflashしません。)

次に、all_flash.xxx.production内のmanifestに新たに格納したファイル名を以下のように追加します。ここに書き込むことで復元時にflashされます。

LLB.n42.RELEASE.img3
...
batteryfull@2x~iphone.s5l8950x.img3
iBootB.n42.RELEASE.img3
DeviceTreeB.n42ap.img3
applelogoB@2x~iphone.s5l8950x.img3
recoverymodeB@1136~iphone-lightning.s5l8950x.img3

 

あとはファームウェアをzipし、Odysseusやfuturerestoreを利用して通常通りに保存済みSHSHを使って復元します。

 

脱獄

環境にあったツールを使用して完全脱獄します。

JavaScriptが有効なら、iOSデバイスから私のブログの以下のページにアクセスすることで使用ツールを判別できます。

Jailbreak

 

パーティション分割

新しい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 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。

*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はデバイスのブロックサイズです。

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

これで作業は完了です。

 

デュアルブートのiOSのファイルシステムをインストール、調整

ファームウウェアからRoot Filesystemを取り出してiOSデバイスに転送します。iOS 10の場合はDeveloper Beta1も含め、完全に暗号化されていないのでそのまま利用できます。

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 /mnt3

root# mkdir /mnt4

root# mount_hfs /dev/disk0s1s3 /mnt3

root# mount_hfs /dev/disk0s1s4 /mnt4

root# mv -v /mnt3/private/var/* /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

root# cp -a -v /var/keybags/systembag.kb /mnt4/keybags

*この方法でKeyBagをコピーした場合はデュアルブートしたiOS上でパスコードを変更ないでください。

 

 

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

*KeyBagをリンクさせる方法です。 KeyBagに互換性がある場合のみ使用可能です。

iOS 6など古いバージョンのデータバーティションをiOS 9以降でマウントさせると破損するので注意が必要です。

 

・BaseBand

root# cp -a -r -v /usr/local /mnt3/usr

 

・Kernel Cache

iBootベースの場合、上記で書き換えたようにkernelcacheをリネームして設置します。(今回の場合は/System/Library/Caches/com.apple.kernelcachesにkernelcachbを設置。

 

起動 (semi-untethered)

root# kloader LLB

 

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