au HTL22 HTC J One 2.15.970.1から1.05.970.2へのダウングレードについて (HTC速報Dev)
2013年11月08日現在最新バージョンとなっているAndroid 4.2.2 + New Sense 5.0の2.15.970.1へのアップデートですがこれによりrun_root_shellで利用していた一部のexploitとrevoneによるS-OFFが不可能になっています。
しかし今回、fi01さんがHTCのフィードバックアプリを利用しrun_root_shellの一部のexploitの有効化を行ってくれた為に再度temprootが可能になりました。
その為こちらで管理者権限を利用し、確認済みだったRUUチェック回避のダウングレードが可能になったためまとめとして記載しておきます。
準備物
- HTL22 2.15.970.1対応版 run_root_shell
- HTL22 2.15.970.1のOTAファイル内のfirmware.zip
- HT:22 1.05.970.2の公式RUU
- HTL22 2.15.970.1向けfi01さん作成、FakeFeedBackアプリ
- JDK利用可能環境
FakeFeedBackアプリは以下から
#HTL22 2.15.970.1の#9950697 によるsystem権限取得について。ここからのrootまで確認済み。http://t.co/SIiFXHA6So 結局HTL22もdexは条件が満たせず、#SH06E #F07E と同じやり方になってしまった。。。 orz
— fi01@4.7インチIGZO端末欲しい (@fi01_IS01) November 7, 2013
OTAファイル
- OTA_M7_WLJ_JB422_SENSE50_MR_KDDI_JP_2.15.970.1-1.07.970.4_release_3331417doal9gnjh1c57xx.zip
- http://www.androidfilehost.com/?fid=23125694133306288
公式RUUファイル(手順ではrom.zipとリネームし操作を行っています。)
HTL22 2.15.970.1対応版 run_root_shell
JDKのインストールについてはこちらを参考にしました。
Java(JDK)ダウンロードとインストール – JavaDrive
ダウングレードの手順
本体のUSBデバッグをONにし、PCと接続します。
最初に管理者権限を得るためにtemprootを取得します。
コマンドプロンプトでFakeFeedBackアプリをインストールしアプリを実行します。 (こちらのプロンプトはADBプロンプトと記載します。)
adb install -r Fake.apk adb shell am start -D -a android.intent.action.MAIN -n com.htc.feedback/android.app.Activity
アプリのプロセスIDを確認し、デバッガ接続の接続先にプロセスIDを指定します。(Xは変数)
adb jdwp XXXX adb forward tcp:8600 jdwp:XXXX
別窓でコマンドプロンプトを起動し、jdbを利用します。(こちらのプロンプトはJDBプロンプトと記載します)
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8600 > threads グループsystem: (java.lang.Thread)0xc1412f4190 <8> FinalizerWatchdogDaemonは条件を待機中です (java.lang.Thread)0xc1412f3fe0 <7> FinalizerDaemon は条件を待機中です (java.lang.Thread)0xc1412f3e78 <6> ReferenceQueueDaemon は条件を待機中です (java.lang.Thread)0xc1412f3d88 <5> Compiler は条件を待機中です (java.lang.Thread)0xc1412f2440 <3> Signal Catcher は条件を待機中です (java.lang.Thread)0xc1412f2360 <2> GC は条件を待機中です グループmain: (java.lang.Thread)0xc140eeac10 <1> main は実行中です (java.lang.Thread)0xc1412f7498 <10> Binder_2 は実行中です (java.lang.Thread)0xc1412f72b8 <9> Binder_1 は実行中です
mainのスレッドを選択します。(上では0xc140eeac10)
> thread 0xc140eeac10
ブレークポイントを設定します。
<1> main[1] stop in android.os.MessageQueue.next()
ADBのプロンプトに戻り、スレッドを中断します。
adb shell am start --activity-clear-task -a android.intent.action.MAIN -n com.htc.feedback/android.app.Activity
JDBのプロンプトに戻り、ランタイムがnullでないことを確認します。
<1> main[1] print java.lang.Runtime.getRuntime() java.lang.Runtime.getRuntime() = "java.lang.Runtime@4193d910"
run_root_shellで利用する/dev/msm_acdbの権限を設定します。
<1> main[1] print java.lang.Runtime.getRuntime().exec("chmod 666 /dev/msm_acdb")
ADBのプロンプトで/dev/msm_acdbの権限を確認します。
adb shell ls -l /dev/msm_acdb crw-rw-rw- system audio 10, 52 2013-11-07 22:25 msm_acdb
これでrun_root_shellの利用が可能になりますので、run_root_shellを端末に送り実行します。
adb push run_root_shell /data/local/tmp/ adb shell chmod 755 /data/local/tmp/run_root_shell adb shell $ ./data/local/tmp/run_root_shell
これで管理者権限の取得が完了しました。
バージョン情報を書き換え偽装します。
# dd if=/dev/block/mmcblk0p19 of=/sdcard/p19 # exit adb pull /sdcard/p19
抜いた「p19」をバイナリエディタで開き、”2.15.970.1″を”1.00.000.0″に書き換え「p19mod」として保存します。
改変したp19modを書き込みます。
adb push p19mod /sdcard/ adb shell $ ./data/local/tmp/run_root_shell # dd if=/sdcard/p19mod of=/dev/block/mmcblk0p19 # reboot bootloader
fastbootが起動するので、「OS-」部分が「1.00.000.0」となっていればOKです。
次に旧RUUをフラッシュする準備を行います。
fastboot oem rebootRUU fastboot flash zip firmware.zip sending 'zip' (40429 KB)... OKAY [ 2.918s] writing 'zip'... (bootloader) adopting the signature contained in this image... (bootloader) signature checking... (bootloader) zip header checking... (bootloader) zip info parsing... (bootloader) checking model ID... (bootloader) checking custom ID... (bootloader) checking main version... (bootloader) checking hboot version... (bootloader) start image[hboot] unzipping for pre-update check... (bootloader) start image[hboot] flushing... (bootloader) signature checking... (bootloader) [RUU]WP,hboot,0 (bootloader) [RUU]WP,hboot,99 (bootloader) [RUU]WP,hboot,100 (bootloader) ...... Successful FAILED (remote: 90 hboot pre-update! please flush image again immediately) finished. total time: 12.663s
FAILED (remote: 90 hboot pre-update! please flush image again immediately)
このエラーが出れば旧RUUのフラッシュが可能です。
fastboot flash zip rom.zip sending 'zip' (863212 KB)... OKAY [ 30.130s] writing 'zip'... (bootloader) adopting the signature contained in this image... (bootloader) signature checking... (bootloader) rom parsing start ... (bootloader) rom parsing finish ... (bootloader) zip header checking... (bootloader) zip info parsing... (bootloader) checking model ID... (bootloader) checking custom ID... (bootloader) checking main version... (bootloader) checking hboot version... (bootloader) start image[boot] unzipping & flushing... (bootloader) [RUU]UZ,boot,0 (bootloader) [RUU]UZ,boot,12 (bootloader) [RUU]UZ,boot,22 (bootloader) [RUU]UZ,boot,35 ......略 (bootloader) ...... Successful OKAY [369.387s] finished. total time: 399.517s fastboot reboot
これでダウングレードが完了となります。
S-ON時のダウングレードについての解説
temprootの詳細については私も解らない事が殆どな為、割愛させていただきます。
今回行ったHTCデバイス側の操作について解説を行うと、RUUには「ファームウェア類(システム、ブートローダー、セカンドブートローダー等)」「本体の判定を行うファイル(android-info.txt)」が入っており、S-ONデバイスでRUUzipを適用可能にする署名に加えて2012年度後半以降の公式RUUにはHTCオリジナルで解凍を不可能にする暗号化が行われています。
次にS-ON時のダウングレードで重要なのは次の通りとなっており、
- 含んでいるファームウェアのシステムバージョン情報
- 含んでいるHBOOTのバージョン
S-ON状態だとこの2つがダウングレードを妨げる要因になっています。
RUUについてもう少し詳しく知りたい方はこちら
HTC機を工場出荷状態に戻すRom Update Utility(RUU)の利用方法 (HTC速報Dev)
RUUの署名がどうにかなれば、全く問題なく改変RUUを焼いてしまえばダウングレード終了!となるのですが、やはりその署名がどうにもならない為、本体を調整した上でRUUがチェックする判定を騙しダウングレードを行うという方針を取ります。
バイナリエディタにて行ったmiscパーティション(mmcblk0p19)の改変はバージョン偽装で、偽装を行うためには管理者権限が必要となります。
HTCのデバイスはmiscパーティションにファームウェア更新等でバージョン情報やその他の頻繁に書き換えが行われ一時的に設定される値が記載されています。
その値を管理者権限を利用し、2.15.970.1から1.00.000.0に改変を行いRUUのチェック判定を1つクリアします。
FAILED (remote: 90 hboot pre-update! please flush image again immediately)
次に上のエラーを誘発させた操作で行った事はHBOOTバージョンのチェックパスで、チェックパスを行うためには特に権限は必要ありません。
HBOOTを書き込む場合HTCデバイスは安全の為かHBOOTのファイルチェックを行った後一度強制的にブートローダーの再起動を行い、HBOOT更新の下準備を行います。
先ずHBOOT更新の下準備を行うために、現在本体に搭載されているHBOOTと同じバージョンのHBOOTを含んだRUU形式で梱包されたファームウェアを用意します。
そのファームウェアは2.15.970.1のOTAzipに「firmware.zip」として含まれており、今回はこれをHBOOT判定を誤認させる為に利用します。
この下準備を済ませてしまえばHBOOTのバージョン情報のチェックを行わない動作となっており、これはバグなのか何なのかは解りませんが旧ファームウェアでもHBOOTのバージョンエラーの表示はされずRUUフラッシュが行われRUUのチェック判定の2つ目をクリアします。
これによりダウングレードが完了します。
ダウングレード後のS-OFFについて
ダウングレード後についてのS-OFFは、今まで通りの方法で大丈夫です。
HTC J One HTL22のS-OFFが可能に、M7_WLJ専用「revone-wlj」が公開へ S-OFF手順
この記事は内部情報を調べたり改造を行うユーザー向けの記事(HTC速報Dev)となっています。 HTC速報Devに記載している事を行う場合は自己責任でお願いします。 |
---|