au HTL22 HTC J One 2.15.970.1から1.05.970.2へのダウングレードについて (HTC速報Dev)

au_htl22_red_00 
 

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アプリは以下から

OTAファイル

公式RUUファイル(手順ではrom.zipとリネームし操作を行っています。)

HTL22 2.15.970.1対応版 run_root_shell

JDKのインストールについてはこちらを参考にしました。

Java(JDK)ダウンロードとインストール – JavaDrive

http://www.javadrive.jp/install/

ダウングレードの手順

本体の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」として保存します。

m7wljdowngrade1

m7wljdowngrade2

 改変した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)

http://htcsoku.info/htcsokudev/rudimentary-knowledge/ruu/

RUUの署名がどうにかなれば、全く問題なく改変RUUを焼いてしまえばダウングレード終了!となるのですが、やはりその署名がどうにもならない為、本体を調整した上でRUUがチェックする判定を騙しダウングレードを行うという方針を取ります。

m7wljdowngrade2

バイナリエディタにて行った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手順

http://htcsoku.info/htcsokudev-news/au-m7-revone-soff/

この記事は内部情報を調べたり改造を行うユーザー向けの記事(HTC速報Dev)となっています。
HTC速報Devに記載している事を行う場合は自己責任でお願いします。