12/26時点の最新ソースでビルド
https://www.dropbox.com/s/tti4e22615qq5n7/cm-12-20141226-UNOFFICIAL-geevl04e.zip?dl=0
LolliPopカスタムROMの変換ツール
https://www.dropbox.com/s/nrucopuxr0m4p9d/make_JP_CompleteROM_L-04E_linux_v2.zip?dl=0
BlissPop
https://www.dropbox.com/s/sto64y7qrdfas9f/BlissPop-v1.4-geevl04e-OFFICIAL-122414.zip?dl=0
Vanir
https://www.dropbox.com/s/91ifwi7bit0z5ja/vanir_geevl04e_5.0.0.122214.zip?dl=0
2014年12月27日土曜日
Optimus G Pro(L-04E) CM11.0 ㉑
12/26時点の最新ソースでビルド
電圧コントロール、GPUオーバークロックを追加。
いつからか分かりませんが、純正カメラで画像の保存が出来ません。
https://www.dropbox.com/s/dr6bzti3cixj4mc/cm-11-20141226-UNOFFICIAL-geevl04e.zip?dl=0
電圧コントロール、GPUオーバークロックを追加。
いつからか分かりませんが、純正カメラで画像の保存が出来ません。
https://www.dropbox.com/s/dr6bzti3cixj4mc/cm-11-20141226-UNOFFICIAL-geevl04e.zip?dl=0
2014年12月20日土曜日
Optimus G Pro(L-04E) CM11.0 ⑳
12/19時点の最新ソースでビルド
ようやく、ホームキーでのスリープ解除に対応しました。
https://www.dropbox.com/s/9xynf6rrd8mho46/cm-11-20141219-UNOFFICIAL-geevl04e.zip?dl=0
ようやく、ホームキーでのスリープ解除に対応しました。
https://www.dropbox.com/s/9xynf6rrd8mho46/cm-11-20141219-UNOFFICIAL-geevl04e.zip?dl=0
2014年12月15日月曜日
2014年12月9日火曜日
Optimus G Pro(L-04E) CM12.0 ①
12/8時点の最新ソースでビルド
どの機能が動作するのか、試していないので、分かりません。
https://www.dropbox.com/s/b2aim9mfkxijtgc/cm-12-20141208-UNOFFICIAL-geevl04e.zip?dl=0
どの機能が動作するのか、試していないので、分かりません。
https://www.dropbox.com/s/b2aim9mfkxijtgc/cm-12-20141208-UNOFFICIAL-geevl04e.zip?dl=0
2014年12月7日日曜日
Optimus G Pro(L-04E) CM11.0 ⑲
12/7時点の最新ソースでビルド
ようやく、バイブレーターを動くようにしました。
https://www.dropbox.com/s/pbgjujmngtx3izz/cm-11-20141207-UNOFFICIAL-geevl04e.zip?dl=0
ようやく、バイブレーターを動くようにしました。
https://www.dropbox.com/s/pbgjujmngtx3izz/cm-11-20141207-UNOFFICIAL-geevl04e.zip?dl=0
2014年12月5日金曜日
2014年11月22日土曜日
2014年11月4日火曜日
2014年11月1日土曜日
2014年10月19日日曜日
2014年10月13日月曜日
2014年10月5日日曜日
2014年9月27日土曜日
2014年9月24日水曜日
2014年9月21日日曜日
2014年9月15日月曜日
2014年9月8日月曜日
2014年8月31日日曜日
2014年8月30日土曜日
Optimus G Pro(L-04E) 各種ROM①
いずれも起動のみ確認
PAC-man 4.4.4.RC1 20140829
https://www.dropbox.com/s/zjt3cf23110d39t/JP_L04E_KK_pac.zip?dl=0
AOKP 4.4 20140731
https://www.dropbox.com/s/hb73r6ms7syl975/JP_L04E_KK_aokp.zip?dl=0
Team-Gummy 20140829
https://www.dropbox.com/s/7sjo2pik4bysz8r/JP_L04E_KK_Gummy.zip?dl=0
e980用ROMをL-04E向けに変換するツール(Mac/Linux)
https://www.dropbox.com/s/q6ay9e9oio7tuv2/make_JP_CompleteROM_L-04E_linux.zip?dl=0
PAC-man 4.4.4.RC1 20140829
https://www.dropbox.com/s/zjt3cf23110d39t/JP_L04E_KK_pac.zip?dl=0
AOKP 4.4 20140731
https://www.dropbox.com/s/hb73r6ms7syl975/JP_L04E_KK_aokp.zip?dl=0
Team-Gummy 20140829
https://www.dropbox.com/s/7sjo2pik4bysz8r/JP_L04E_KK_Gummy.zip?dl=0
e980用ROMをL-04E向けに変換するツール(Mac/Linux)
https://www.dropbox.com/s/q6ay9e9oio7tuv2/make_JP_CompleteROM_L-04E_linux.zip?dl=0
2014年8月24日日曜日
Optimus G Pro(L-04E) CM11.0 ⑤
8/23時点の最新ソースでビルド
https://www.dropbox.com/s/nzag5xfnday1cnv/cm-11-20140823-UNOFFICIAL-geevl04e.zip?dl=0
どうにも、ドコモ絵文字が上手く表示されない。
対応してるつもりなんだが。。。
https://www.dropbox.com/s/nzag5xfnday1cnv/cm-11-20140823-UNOFFICIAL-geevl04e.zip?dl=0
どうにも、ドコモ絵文字が上手く表示されない。
対応してるつもりなんだが。。。
2014年6月28日土曜日
2014年6月15日日曜日
2014年6月8日日曜日
Optimus G Pro(L-04E) CM11.0 ②
6/6時点の最新ソースでビルド。
https://www.dropbox.com/s/jlz96sd8vzzzmqb/cm-11-20140606-UNOFFICIAL-geevl04e.zip
・Android4.4.3
・絵文字
・ドコモメール
絵文字とドコモメールは対応したつもりです。
https://www.dropbox.com/s/jlz96sd8vzzzmqb/cm-11-20140606-UNOFFICIAL-geevl04e.zip
・Android4.4.3
・絵文字
・ドコモメール
絵文字とドコモメールは対応したつもりです。
2014年4月13日日曜日
2014年3月21日金曜日
Optimus G Pro(L-04E) CMビルド⑦
CyanogenModをビルドするには、カスタムリカバリー作成時にソースを取得しているので、
CyanogenModフォルダで、
source build/envsetup.sh
lunch cm_geevl04e-userdebug
brunch cm_geevl04e-userdebug
これで、out/target/product/geevl04eフォルダにzipファイルが出来ているので、
cwmでinstallしてください。
ここまでに作成したファイルをまとめてあります。
cwmとtwrpの両方をいれてあるので、好きな方をloki_flashしてください。
https://www.dropbox.com/s/u1v68blxdxwa0lg/L04Eroot.zip
gappsはKK対応の最新版を取得してきてください。
※動作することは確認していますが、くれぐれも自己責任で!
※また、バックアップは必ず取得して、戻せるようにしてください。
CyanogenModフォルダで、
source build/envsetup.sh
lunch cm_geevl04e-userdebug
brunch cm_geevl04e-userdebug
これで、out/target/product/geevl04eフォルダにzipファイルが出来ているので、
cwmでinstallしてください。
ここまでに作成したファイルをまとめてあります。
cwmとtwrpの両方をいれてあるので、好きな方をloki_flashしてください。
https://www.dropbox.com/s/u1v68blxdxwa0lg/L04Eroot.zip
gappsはKK対応の最新版を取得してきてください。
※動作することは確認していますが、くれぐれも自己責任で!
※また、バックアップは必ず取得して、戻せるようにしてください。
Optimus G Pro(L-04E) CMビルド⑥
outフォルダに出来たrecovery.imgをloki_patchと同じフォルダにコピーします。
また、パーティションバックアップで取得したmmcblk0p5_abootも同様にaboot.imgとしてコピーします。
loki_patchのフォルダに移動して、
./loki_patch recovery aboot.img recovery.img recovery.lok
でパッチ済みのrecoveryイメージが作成されます。
これとbin/loki_flashを端末(/data/local/tmp)に転送して、実行します。
adb push loki_flash /data/local/tmp
adb push recovery.lok /data/local/tmp
adb shell
su
cd /data/local/tmp
chmod 755 loki_flash
./loki_flash recovery recovery.lok
loki_flashが完了したら、recoveryモードで再起動すれば、CWMが起動します。
また、パーティションバックアップで取得したmmcblk0p5_abootも同様にaboot.imgとしてコピーします。
loki_patchのフォルダに移動して、
./loki_patch recovery aboot.img recovery.img recovery.lok
でパッチ済みのrecoveryイメージが作成されます。
これとbin/loki_flashを端末(/data/local/tmp)に転送して、実行します。
adb push loki_flash /data/local/tmp
adb push recovery.lok /data/local/tmp
adb shell
su
cd /data/local/tmp
chmod 755 loki_flash
./loki_flash recovery recovery.lok
loki_flashが完了したら、recoveryモードで再起動すれば、CWMが起動します。
Optimus G Pro(L-04E) CMビルド⑤
カスタムリカバリーを作成します。
まず、ビルドに必要な残りのファイルを取得します。
CyanogenModのルートフォルダで、
cd vender/cm/
./get-prebuilts
CyanogenModのルートフォルダに戻って、
source build/envsetup.sh
lunch cm_geevl04e-userdebug
make -j4 recoveryimage
で、out/target/product/geevl04e/フォルダにrecovery.imgが作られます。
これを端末に焼くのですが、ブートローダーロックがかかっているので、
lokiでrecovery.imgにパッチを当てます。
備考:
ビルドには非常に時間がかかります。マシンの性能によって全然変わってきます。
2回目以降のビルドを早くするのにccacheを使います。
export USE_CCACHE=1
./prebuilts/misc/linux-x86/ccache/ccache -M 15G
まず、ビルドに必要な残りのファイルを取得します。
CyanogenModのルートフォルダで、
cd vender/cm/
./get-prebuilts
CyanogenModのルートフォルダに戻って、
source build/envsetup.sh
lunch cm_geevl04e-userdebug
make -j4 recoveryimage
で、out/target/product/geevl04e/フォルダにrecovery.imgが作られます。
これを端末に焼くのですが、ブートローダーロックがかかっているので、
lokiでrecovery.imgにパッチを当てます。
備考:
ビルドには非常に時間がかかります。マシンの性能によって全然変わってきます。
2回目以降のビルドを早くするのにccacheを使います。
export USE_CCACHE=1
./prebuilts/misc/linux-x86/ccache/ccache -M 15G
Optimus G Pro(L-04E) CMビルド④
国際版からL-04E用へ書き換える場所についてです。
まずは、APQ8064搭載LG端末の共通ファイルを編集します。
Android.mkファイルにgeevl04eを追加します。
次に、lokiフォルダに入ってるloki_patch.cを上の投稿でL-04Eを追加した
loki_patch.cで上書きします。
https://github.com/tkawajir/android_device_lge_gproj-common/commit/806dfc0b242be8487db6c3d4a2860bff243d95d4
国際版e980の設定ファイルをe980用からgeevl04e用に書き換えます。
makeファイルの中に記載されているe980をgeevl04eに変更し、
ファイル名でもe980.mkをgeevl04e.mkに変更します。
https://github.com/tkawajir/android_device_lge_geevl04e/commit/9a3fd6a5c2aa593d8fac096c9c589df905cb3539
プロプライエタリファイルはe980のサブフォルダごとコピーしてフォルダ名を
geevl04eに変更します。
https://github.com/tkawajir/proprietary_vendor_lge/commit/883ac47297d1869f46c0495d6242791bbd70be43
git cloneで取得したカーネルソースには、国際版の変更しか反映されていないので、
L-04Eのソースに同じ変更を加えていきます。
https://github.com/tkawajir/lge-kernel-gproj/commits/cm-11.0
gv:とついているのがそうです。
次に、ストックカーネルのconfigをCyanogenMod用に合わせます。
https://github.com/tkawajir/lge-kernel-gproj/commit/817c6b0c792bd65b4919d5870dc0231e499e56ed
これで、L-04Eへの変更は完了です。
まずは、APQ8064搭載LG端末の共通ファイルを編集します。
Android.mkファイルにgeevl04eを追加します。
次に、lokiフォルダに入ってるloki_patch.cを上の投稿でL-04Eを追加した
loki_patch.cで上書きします。
https://github.com/tkawajir/android_device_lge_gproj-common/commit/806dfc0b242be8487db6c3d4a2860bff243d95d4
国際版e980の設定ファイルをe980用からgeevl04e用に書き換えます。
makeファイルの中に記載されているe980をgeevl04eに変更し、
ファイル名でもe980.mkをgeevl04e.mkに変更します。
https://github.com/tkawajir/android_device_lge_geevl04e/commit/9a3fd6a5c2aa593d8fac096c9c589df905cb3539
プロプライエタリファイルはe980のサブフォルダごとコピーしてフォルダ名を
geevl04eに変更します。
https://github.com/tkawajir/proprietary_vendor_lge/commit/883ac47297d1869f46c0495d6242791bbd70be43
git cloneで取得したカーネルソースには、国際版の変更しか反映されていないので、
L-04Eのソースに同じ変更を加えていきます。
https://github.com/tkawajir/lge-kernel-gproj/commits/cm-11.0
gv:とついているのがそうです。
次に、ストックカーネルのconfigをCyanogenMod用に合わせます。
https://github.com/tkawajir/lge-kernel-gproj/commit/817c6b0c792bd65b4919d5870dc0231e499e56ed
これで、L-04Eへの変更は完了です。
Optimus G Pro(L-04E) CMビルド③
カスタムリカバリーを作るには、CyanogenModのビルドが必要です。
そこで、まずはCyanogenModのビルド環境を構築します。
この辺は、いたるところに解説があるので、ここでは省略します。
http://source.android.com/source/initializing.html
http://forum.xda-developers.com/nexus-4/general/guide-cm11-how-to-build-cyanogenmod-11-t2515305
とかが参考になると思います。
最新のソースを取得するので、cm-11.0のブランチを取得します。
repo syncまで準備したら、CyanogenMod共通のソースは取得できます。
※かなり時間がかかりますので、気長に。
次に、端末ごとのファイルを取得します。
ここで、国際版のOptimus G Pro(e980)を参考にL-04Eに作り変えます。
まずは、端末ごとの設定ファイルです。
CyanogenModフォルダの直下にdeviceフォルダがあるので、その下にlgeフォルダを作成します。
lgeフォルダに移動してから、
git clone https://github.com/CyanogenMod/android_device_lge_gproj-common.git -b cm-11.0 gproj-common
でlg端末共通の設定ファイルを取得し、
git clone https://github.com/CyanogenMod/android_device_lge_e980.git -b cm-11.0 geevl04e
でOptimus G Proの設定ファイルを取得し、geevl04eというフォルダに保存します。
L-04Eはbuild.propによるとプロジェクト名がgeevl04eらしいので、これにしてます。
次に、端末が動作するのに必要なバイナリ(プロプライエタリ)ファイルを取得します。
CyanogenModフォルダの直下にvenderフォルダがあるので、そこに移動してから、
git clone https://github.com/TheMuppets/proprietary_vendor_lge.git -b cm-11.0
次に、カーネルを取得します。
CyanogenModフォルダの直下にkernelフォルダを作成して、その下にlgeフォルダを作成します。
git clone https://github.com/CyanogenMod/lge-kernel-gproj.git -b cm-11.0 gproj
ここまでで国際版の環境取得は完了したので、これをL-04E用に書き換えます。
そこで、まずはCyanogenModのビルド環境を構築します。
この辺は、いたるところに解説があるので、ここでは省略します。
http://source.android.com/source/initializing.html
http://forum.xda-developers.com/nexus-4/general/guide-cm11-how-to-build-cyanogenmod-11-t2515305
とかが参考になると思います。
最新のソースを取得するので、cm-11.0のブランチを取得します。
repo syncまで準備したら、CyanogenMod共通のソースは取得できます。
※かなり時間がかかりますので、気長に。
次に、端末ごとのファイルを取得します。
ここで、国際版のOptimus G Pro(e980)を参考にL-04Eに作り変えます。
まずは、端末ごとの設定ファイルです。
CyanogenModフォルダの直下にdeviceフォルダがあるので、その下にlgeフォルダを作成します。
lgeフォルダに移動してから、
git clone https://github.com/CyanogenMod/android_device_lge_gproj-common.git -b cm-11.0 gproj-common
でlg端末共通の設定ファイルを取得し、
git clone https://github.com/CyanogenMod/android_device_lge_e980.git -b cm-11.0 geevl04e
でOptimus G Proの設定ファイルを取得し、geevl04eというフォルダに保存します。
L-04Eはbuild.propによるとプロジェクト名がgeevl04eらしいので、これにしてます。
次に、端末が動作するのに必要なバイナリ(プロプライエタリ)ファイルを取得します。
CyanogenModフォルダの直下にvenderフォルダがあるので、そこに移動してから、
git clone https://github.com/TheMuppets/proprietary_vendor_lge.git -b cm-11.0
次に、カーネルを取得します。
CyanogenModフォルダの直下にkernelフォルダを作成して、その下にlgeフォルダを作成します。
git clone https://github.com/CyanogenMod/lge-kernel-gproj.git -b cm-11.0 gproj
ここまでで国際版の環境取得は完了したので、これをL-04E用に書き換えます。
Optimus G Pro(L-04E) CMビルド②
先ほどの投稿で分かったアドレスをlokiのソースに追加します。
まずは、元ネタを
git clone https://github.com/djrbliss/loki.git
※プルリク出してるので、その内反映されてると思います。
loki_patch.cに必要な情報を追加します。
こちらを、参照してください。
https://github.com/kbc-developers/loki/commit/aa84dbf0ed34724f4f40e9a61d22245aaf90b83f
そのままmakeすると、android端末上で動作するバイナリができるので、
PC上でloki_patchをするのであれば、
gcc -g -Wall -o loki_patch loki_patch.c
android端末上で動作させるloki_flashはbinフォルダ内に既にあるものを使用します。
次は、lokiパッチを当てるカーネル・リカバリーの作成ですが、
やはりバックアップが大事だと思うので、リカバリーから作りたいと思います。
まずは、元ネタを
git clone https://github.com/djrbliss/loki.git
※プルリク出してるので、その内反映されてると思います。
loki_patch.cに必要な情報を追加します。
こちらを、参照してください。
https://github.com/kbc-developers/loki/commit/aa84dbf0ed34724f4f40e9a61d22245aaf90b83f
そのままmakeすると、android端末上で動作するバイナリができるので、
PC上でloki_patchをするのであれば、
gcc -g -Wall -o loki_patch loki_patch.c
android端末上で動作させるloki_flashはbinフォルダ内に既にあるものを使用します。
次は、lokiパッチを当てるカーネル・リカバリーの作成ですが、
やはりバックアップが大事だと思うので、リカバリーから作りたいと思います。
Optimus G Pro(L-04E) CMビルド①
root化の次は、カスタムカーネル・リカバリーを焼きます。
これには、ブートローダー(aboot)の脆弱性を利用します。
lokiと呼ばれているものです。
脆弱性の詳細は、英語ですが、ここのブログにあります。
http://blog.azimuthsecurity.com/2013/05/exploiting-samsung-galaxy-s4-secure-boot.html
要は、abootで署名チェックをしている箇所をboot/recovery.imgに仕込んだ
シェルコードで書き換えて、スルーしてしまおうというものです。
ただし、この脆弱性も修正されてきているので、この機種でも
KKへのアップデートがあれば、使えなくなると思います。
lokiを使うためには、aboot.imgを解析して必要なアドレスを調べます。
root化でバックアップを取得しているので、mmcblk0p5_abootを使用します。
まずは、abootをバイナリエディタで開きます。
一行目(アドレス:0x00〜0x0f)に、
05 00 00 00 03 00 00 00 00 00 00 00 00 00 F0 88
と表示されています。
この、0x0c〜0x0fを逆順に読んだものが、abootのメモリへの
展開先アドレスになります。
※逆順に読むのは、リトルエンディアンなので。
abootはヘッダーが40byteあるので、実際にコードが展開される0x88f00000から
40(0x28)を引いたものが、abootの先頭アドレスになります。
0x88f00000 - 0x28 = 0x88efffd8
これが、ABOOT_BASE_LGになります。
次に、バイナリエディタでテキスト検索で「ANDROID-BOOT!」を検索します。
2個見つかりますが、後に見つかった「ANDROID-BOOT!」のアドレスを控えておきます。
ANDROID-BOOT!_OFFSET:0x00047420
実際のプログラムで使用する際は、ABOOT_BASE_LGに上記のアドレスを足したものになります。
ABOOT_BASE_LG + ANDROID-BOOT!_OFFSET:0x88f473f8
リトルエンディアンなので、aboot内では、逆順の値が使用されています。
そこで、f8 73 f4 88をバイナリエディタでHEX検索します。
何箇所か見つかるので、前後の4byteと合わせてすべて洗い出してみます。
18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
90 16 F3 88 F8 73 F4 88 4C 16 F3 88
18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
39 BF 00 BF F8 73 F4 88 28 33 F3 88
98 41 F5 88 F8 73 F4 88 00 1F F3 88
そうすると、2箇所同じ16進数が並んでいる箇所があります。
これを逆順に読んだものがhdrのアドレスになります。
hdr:0x88f54418
次に、HEX検索で2d e9 f0 4f ad f5 c6 6dを検索します。
※loki.hのPATTERN4
0x11054のアドレスから始まっているのが見つかります。
これにABOOT_BASE_LGを足したものがcheck_sigのアドレスになります。
ABOOT_BASE_LG+PATTERN4_OFFSET=>check_sigs:0x88f1102c
これには、ブートローダー(aboot)の脆弱性を利用します。
lokiと呼ばれているものです。
脆弱性の詳細は、英語ですが、ここのブログにあります。
http://blog.azimuthsecurity.com/2013/05/exploiting-samsung-galaxy-s4-secure-boot.html
要は、abootで署名チェックをしている箇所をboot/recovery.imgに仕込んだ
シェルコードで書き換えて、スルーしてしまおうというものです。
ただし、この脆弱性も修正されてきているので、この機種でも
KKへのアップデートがあれば、使えなくなると思います。
lokiを使うためには、aboot.imgを解析して必要なアドレスを調べます。
root化でバックアップを取得しているので、mmcblk0p5_abootを使用します。
まずは、abootをバイナリエディタで開きます。
一行目(アドレス:0x00〜0x0f)に、
05 00 00 00 03 00 00 00 00 00 00 00 00 00 F0 88
と表示されています。
この、0x0c〜0x0fを逆順に読んだものが、abootのメモリへの
展開先アドレスになります。
※逆順に読むのは、リトルエンディアンなので。
abootはヘッダーが40byteあるので、実際にコードが展開される0x88f00000から
40(0x28)を引いたものが、abootの先頭アドレスになります。
0x88f00000 - 0x28 = 0x88efffd8
これが、ABOOT_BASE_LGになります。
次に、バイナリエディタでテキスト検索で「ANDROID-BOOT!」を検索します。
2個見つかりますが、後に見つかった「ANDROID-BOOT!」のアドレスを控えておきます。
ANDROID-BOOT!_OFFSET:0x00047420
実際のプログラムで使用する際は、ABOOT_BASE_LGに上記のアドレスを足したものになります。
ABOOT_BASE_LG + ANDROID-BOOT!_OFFSET:0x88f473f8
リトルエンディアンなので、aboot内では、逆順の値が使用されています。
そこで、f8 73 f4 88をバイナリエディタでHEX検索します。
何箇所か見つかるので、前後の4byteと合わせてすべて洗い出してみます。
18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
90 16 F3 88 F8 73 F4 88 4C 16 F3 88
18 44 F5 88 F8 73 F4 88 9C 41 F5 88
^^ ^^ ^^ ^^
39 BF 00 BF F8 73 F4 88 28 33 F3 88
98 41 F5 88 F8 73 F4 88 00 1F F3 88
そうすると、2箇所同じ16進数が並んでいる箇所があります。
これを逆順に読んだものがhdrのアドレスになります。
hdr:0x88f54418
次に、HEX検索で2d e9 f0 4f ad f5 c6 6dを検索します。
※loki.hのPATTERN4
0x11054のアドレスから始まっているのが見つかります。
これにABOOT_BASE_LGを足したものがcheck_sigのアドレスになります。
ABOOT_BASE_LG+PATTERN4_OFFSET=>check_sigs:0x88f1102c
2014年2月24日月曜日
Lokiの脆弱性について
Samsung Galaxy S4やLG端末で有効な署名なしカーネルを焼くのに必要な
Lokiの脆弱性について元の記事を翻訳してみました。
要約すると、boot.imgからカーネルイメージとramdiskイメージをそれぞれ指定の
アドレスに読み出し、署名チェックを行ってから、有効であれば起動するという
流れになっているので、カーネルイメージ領域にカーネルとramdiskイメージを
くっつけて書き出し、ramdiskイメージにabootを書き換えるシェルコードを
置くというものになってます。
元の記事はこちら
http://blog.azimuthsecurity.com/2013/05/exploiting-samsung-galaxy-s4-secure-boot.html
翻訳はこちら
2013年4月に発売された、サムスン製Glaxy S4は発売後1ヶ月で1000万台を販売し、
今年最も売れたスマートフォンの一つに数えられることだろう。
大半のモデルがユーザー自らが自作カーネルの動作やシステムの改変を可能にしているのに対し、
AT&TとVerizonはそのような改変ができないモデルを販売している。
そこで、このブートローダーロックの仕組みと署名チェックをバイパスし、
署名なしカーネルやリカバリーが動作可能となる脆弱性について説明しよう。
AT&TとVerizonのモデルはQualcomm製のAPQ8064Tチップセットを使用している。
前回のブログで解説したMotorola製のブートローダーと同様にQualcommはQfuseという
信頼性の高い起動手順を導入している。
つまり、起動手順の各段階でQfuseを利用して暗号化チェックを行っている。
ハードウェアに関する起動手順の初期段階が完了してから、サムスン製のAPPSBLが動作する。
Glaxy S4のブートローダーロックとアンロックにはブート領域とリカバリー領域の
強制署名チェック有無の違いがある。
aboot(ブートローダー領域の名前から)はオープンソースの"lk"プロジェクトを参考に作られており、
手間のかかるリバースエンジニアリングの時間を節約することができた。
"lk"とabootを見比べることにより、署名チェックとLinuxカーネル起動のコードを見分けられた。
ブート領域とリカバリー領域に含まれているLinuxカーネルとramdiskを読み出し、検証し、
起動させるロジックはboot_linux_from_mmc()に記載されている。
まず、AndroidOSのLinuxカーネルとramdiskが含まれているブート領域かAndroidリカバリーシステムの
カーネルとramdiskが含まれているリカバリー領域を起動するかを決定する。
次に、適当な領域の最初のページをeMMCから物理メモリに読み出す。
if (!boot_into_recovery) {
index = partition_get_index("boot");
ptn = partition_get_offset(index);
if (ptn == 0) {
dprintf(CRITICAL, "ERROR: No boot partition found\n");
return -1;
}
}
else {
index = partition_get_index("recovery");
ptn = partition_get_offset(index);
if (ptn == 0) {
dprintf(CRITICAL, "ERROR: No recovery partition found\n");
return -1;
}
}
if (mmc_read(ptn + offset, (unsigned int *) buf, page_size)) {
dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
return -1;
}
上記のコードは、"lk"のロジックをそのまま流用している。
次に、ヘッダーを含むブート領域の健全性チェックを行った後、ブート領域のヘッダーに
記載されているアドレスにカーネルとramdiskを読み込む。
hdr = (struct boot_img_hdr *)buf;
image_addr = target_get_scratch_address();
kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask) + 0x200;
imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
memcpy(image_addr, hdr, page_size);
offset = page_size;
/* Load kernel */
if (mmc_read(ptn + offset, (void *)hdr->kernel_addr, kernel_actual)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
memcpy(image_addr + offset, hdr->kernel_addr, kernel_actual);
offset += kernel_actual;
/* Load ramdisk */
if (mmc_read(ptn + offset, (void *)hdr->ramdisk_addr, ramdisk_actual)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
memcpy(image_addr + offset, hdr->ramdisk_addr, ramdisk_actual);
offset += ramdisk_actual;
これは、本質的には"lk"のコードと同一であり、ブートイメージを単位毎にimage_addrで
指し示す位置にコピーしている。
最終的に、イメージ全体の署名チェックを行う。
署名チェックが正しければ、カーネルは起動し、誤っていれば、改竄されているという
ワーニングを表示し、起動に失敗する。
if (check_sig(boot_into_recovery))
{
if (!is_engineering_device())
{
dprintf("kernel secure check fail.\n");
print_console("SECURE FAIL: KERNEL");
while (1)
{
/* Display tampered screen and halt */
...
}
}
}
/* Boot the Linux kernel */
...
is_engineering_device()関数は単にテスト機か製品機かを示すチップセットID(ハード的に変更不可な値)から
起動手順の初期に設定されるグローバル変数の値を返却する。
check_sig()関数はabootが署名チェックの為にオープンソースのRSA実装を使用していることが分かる。
ブートローダーはaboot内のRSA-2048の公開鍵を使用してブートイメージの署名を解読し、
ブートイメージのSHA1ハッシュコードと比較する。
ブートイメージを改造すると異なるSHA1ハッシュコードが得られるので、RSA-2048をハックするか、
特別なSHA1ハッシュコードを生成するか、サムスンの秘密鍵を利用しない限りは署名済みブートイメージは作成できない。
聡明な読者は上記のプログラムコードを見てお気づきだろう。
上記で示された手順は、まずブートイメージのヘッダーで示されたアドレスにカーネルとramdiskを読み出し、
読み出しが完了してから署名チェックが行われている。
その為、信頼できないデータが含まれていても、署名チェックよりもeMMCからの読み出しを優先して行う。
結果、aboot自身を含めたカーネル又はramdiskを物理メモリに読み込むようなヘッダーの値を含む悪意のある
ブートイメージを書き込むことができる。
この流れは、まったく単純である。
abootのcheck_sig()関数の物理アドレスと等しいアドレスにramdiskをロードするブートイメージを用意した。
改変されたブートイメージでは、ramdiskが配置される位置にシェルコードを埋め込んだ。
root権限でブート領域を作成したブートイメージで置き換えた。
abootがeMMCデバイスからramdiskを読み込み、check_sig()関数をシェルコードで置き換えた。
シェルコードは単純に、ブートイメージのヘッダーに正しい値を書き込み、正しいメモリ位置に
カーネルとramdiskをコピーし、署名チェックの正常終了を意味する「0」を返却する。
結果、abootは起動処理を継続し、署名なしのカーネルとramdiskで起動する。
意見や思いつきを交換し、手助けしてくれたralekdevに感謝する。
Lokiの脆弱性について元の記事を翻訳してみました。
要約すると、boot.imgからカーネルイメージとramdiskイメージをそれぞれ指定の
アドレスに読み出し、署名チェックを行ってから、有効であれば起動するという
流れになっているので、カーネルイメージ領域にカーネルとramdiskイメージを
くっつけて書き出し、ramdiskイメージにabootを書き換えるシェルコードを
置くというものになってます。
元の記事はこちら
http://blog.azimuthsecurity.com/2013/05/exploiting-samsung-galaxy-s4-secure-boot.html
翻訳はこちら
2013年4月に発売された、サムスン製Glaxy S4は発売後1ヶ月で1000万台を販売し、
今年最も売れたスマートフォンの一つに数えられることだろう。
大半のモデルがユーザー自らが自作カーネルの動作やシステムの改変を可能にしているのに対し、
AT&TとVerizonはそのような改変ができないモデルを販売している。
そこで、このブートローダーロックの仕組みと署名チェックをバイパスし、
署名なしカーネルやリカバリーが動作可能となる脆弱性について説明しよう。
AT&TとVerizonのモデルはQualcomm製のAPQ8064Tチップセットを使用している。
前回のブログで解説したMotorola製のブートローダーと同様にQualcommはQfuseという
信頼性の高い起動手順を導入している。
つまり、起動手順の各段階でQfuseを利用して暗号化チェックを行っている。
ハードウェアに関する起動手順の初期段階が完了してから、サムスン製のAPPSBLが動作する。
Glaxy S4のブートローダーロックとアンロックにはブート領域とリカバリー領域の
強制署名チェック有無の違いがある。
aboot(ブートローダー領域の名前から)はオープンソースの"lk"プロジェクトを参考に作られており、
手間のかかるリバースエンジニアリングの時間を節約することができた。
"lk"とabootを見比べることにより、署名チェックとLinuxカーネル起動のコードを見分けられた。
ブート領域とリカバリー領域に含まれているLinuxカーネルとramdiskを読み出し、検証し、
起動させるロジックはboot_linux_from_mmc()に記載されている。
まず、AndroidOSのLinuxカーネルとramdiskが含まれているブート領域かAndroidリカバリーシステムの
カーネルとramdiskが含まれているリカバリー領域を起動するかを決定する。
次に、適当な領域の最初のページをeMMCから物理メモリに読み出す。
if (!boot_into_recovery) {
index = partition_get_index("boot");
ptn = partition_get_offset(index);
if (ptn == 0) {
dprintf(CRITICAL, "ERROR: No boot partition found\n");
return -1;
}
}
else {
index = partition_get_index("recovery");
ptn = partition_get_offset(index);
if (ptn == 0) {
dprintf(CRITICAL, "ERROR: No recovery partition found\n");
return -1;
}
}
if (mmc_read(ptn + offset, (unsigned int *) buf, page_size)) {
dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
return -1;
}
上記のコードは、"lk"のロジックをそのまま流用している。
次に、ヘッダーを含むブート領域の健全性チェックを行った後、ブート領域のヘッダーに
記載されているアドレスにカーネルとramdiskを読み込む。
hdr = (struct boot_img_hdr *)buf;
image_addr = target_get_scratch_address();
kernel_actual = ROUND_TO_PAGE(hdr->kernel_size, page_mask);
ramdisk_actual = ROUND_TO_PAGE(hdr->ramdisk_size, page_mask) + 0x200;
imagesize_actual = (page_size + kernel_actual + ramdisk_actual);
memcpy(image_addr, hdr, page_size);
offset = page_size;
/* Load kernel */
if (mmc_read(ptn + offset, (void *)hdr->kernel_addr, kernel_actual)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
memcpy(image_addr + offset, hdr->kernel_addr, kernel_actual);
offset += kernel_actual;
/* Load ramdisk */
if (mmc_read(ptn + offset, (void *)hdr->ramdisk_addr, ramdisk_actual)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
memcpy(image_addr + offset, hdr->ramdisk_addr, ramdisk_actual);
offset += ramdisk_actual;
これは、本質的には"lk"のコードと同一であり、ブートイメージを単位毎にimage_addrで
指し示す位置にコピーしている。
最終的に、イメージ全体の署名チェックを行う。
署名チェックが正しければ、カーネルは起動し、誤っていれば、改竄されているという
ワーニングを表示し、起動に失敗する。
if (check_sig(boot_into_recovery))
{
if (!is_engineering_device())
{
dprintf("kernel secure check fail.\n");
print_console("SECURE FAIL: KERNEL");
while (1)
{
/* Display tampered screen and halt */
...
}
}
}
/* Boot the Linux kernel */
...
is_engineering_device()関数は単にテスト機か製品機かを示すチップセットID(ハード的に変更不可な値)から
起動手順の初期に設定されるグローバル変数の値を返却する。
check_sig()関数はabootが署名チェックの為にオープンソースのRSA実装を使用していることが分かる。
ブートローダーはaboot内のRSA-2048の公開鍵を使用してブートイメージの署名を解読し、
ブートイメージのSHA1ハッシュコードと比較する。
ブートイメージを改造すると異なるSHA1ハッシュコードが得られるので、RSA-2048をハックするか、
特別なSHA1ハッシュコードを生成するか、サムスンの秘密鍵を利用しない限りは署名済みブートイメージは作成できない。
聡明な読者は上記のプログラムコードを見てお気づきだろう。
上記で示された手順は、まずブートイメージのヘッダーで示されたアドレスにカーネルとramdiskを読み出し、
読み出しが完了してから署名チェックが行われている。
その為、信頼できないデータが含まれていても、署名チェックよりもeMMCからの読み出しを優先して行う。
結果、aboot自身を含めたカーネル又はramdiskを物理メモリに読み込むようなヘッダーの値を含む悪意のある
ブートイメージを書き込むことができる。
この流れは、まったく単純である。
abootのcheck_sig()関数の物理アドレスと等しいアドレスにramdiskをロードするブートイメージを用意した。
改変されたブートイメージでは、ramdiskが配置される位置にシェルコードを埋め込んだ。
root権限でブート領域を作成したブートイメージで置き換えた。
abootがeMMCデバイスからramdiskを読み込み、check_sig()関数をシェルコードで置き換えた。
シェルコードは単純に、ブートイメージのヘッダーに正しい値を書き込み、正しいメモリ位置に
カーネルとramdiskをコピーし、署名チェックの正常終了を意味する「0」を返却する。
結果、abootは起動処理を継続し、署名なしのカーネルとramdiskで起動する。
意見や思いつきを交換し、手助けしてくれたralekdevに感謝する。
2014年2月23日日曜日
Optimus G Pro(L-04E) root化③
後は、busyboxとsuバイナリも同じように端末に転送し、
755の実行権限を付けておきます。
これで、root化に必要なファイルはすべて揃いました。
端末上での操作に移ります。
adb shell
cd /data/local/tmp
./install_backdoor
./disable_ccsecurity
./run_root_shell
プロンプトが$→#に変われば、一時root化成功です。
次に、初期パーティションのバックアップを取得します。
/data/local/tmp/busybox mkdir -p /sdcard/backup_V10f/
/data/local/tmp/busybox echo "Backup Start"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p1 of=/sdcard/backup_V10f/mmcblk0p1_modem bs=4096
/data/local/tmp/busybox echo "modem Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p2 of=/sdcard/backup_V10f/mmcblk0p2_sbl1 bs=4096
/data/local/tmp/busybox echo "sbl1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p3 of=/sdcard/backup_V10f/mmcblk0p3_sbl2 bs=4096
/data/local/tmp/busybox echo "sbl2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p4 of=/sdcard/backup_V10f/mmcblk0p4_sbl3 bs=4096
/data/local/tmp/busybox echo "sbl3 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p5 of=/sdcard/backup_V10f/mmcblk0p5_aboot bs=4096
/data/local/tmp/busybox echo "aboot Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p6 of=/sdcard/backup_V10f/mmcblk0p6_rpm bs=4096
/data/local/tmp/busybox echo "rpm Done"
/data/local/tmp/busybox mknod /dev/block/boot b 179 7
/data/local/tmp/busybox dd if=/dev/block/boot of=/sdcard/backup_V10f/mmcblk0p7_boot bs=4096
/data/local/tmp/busybox echo "boot Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p8 of=/sdcard/backup_V10f/mmcblk0p8_tz bs=4096
/data/local/tmp/busybox echo "tz Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p9 of=/sdcard/backup_V10f/mmcblk0p9_pad bs=4096
/data/local/tmp/busybox echo "pad Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p10 of=/sdcard/backup_V10f/mmcblk0p10_modemst1 bs=4096
/data/local/tmp/busybox echo "modemst1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p11 of=/sdcard/backup_V10f/mmcblk0p11_modemst2 bs=4096
/data/local/tmp/busybox echo "modemst2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p12 of=/sdcard/backup_V10f/mmcblk0p12_m9kefs1 bs=4096
/data/local/tmp/busybox echo "m9kefs1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p13 of=/sdcard/backup_V10f/mmcblk0p13_m9kefs2 bs=4096
/data/local/tmp/busybox echo "m9kefs2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p14 of=/sdcard/backup_V10f/mmcblk0p14_m9kefs3 bs=4096
/data/local/tmp/busybox echo "m9kefs3 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p15 of=/sdcard/backup_V10f/mmcblk0p15_drm bs=4096
/data/local/tmp/busybox echo "drm Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p16 of=/sdcard/backup_V10f/mmcblk0p16_sns bs=4096
/data/local/tmp/busybox echo "sns Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p17 of=/sdcard/backup_V10f/mmcblk0p17_ssd bs=4096
/data/local/tmp/busybox echo "ssd Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p18 of=/sdcard/backup_V10f/mmcblk0p18_misc bs=4096
/data/local/tmp/busybox echo "misc Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p19 of=/sdcard/backup_V10f/mmcblk0p19_factory bs=4096
/data/local/tmp/busybox echo "factory Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p20 of=/sdcard/backup_V10f/mmcblk0p20_bnr bs=4096
/data/local/tmp/busybox echo "bnr Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p21 of=/sdcard/backup_V10f/mmcblk0p21_encrypt bs=4096
/data/local/tmp/busybox echo "encrypt Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p22 of=/sdcard/backup_V10f/mmcblk0p22_eksst bs=4096
/data/local/tmp/busybox echo "eksst Done"
/data/local/tmp/busybox mknod /dev/block/system b 179 23
/data/local/tmp/busybox dd if=/dev/block/system of=/sdcard/backup_V10f/mmcblk0p23_system bs=4096
/data/local/tmp/busybox echo "system Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p26 of=/sdcard/backup_V10f/mmcblk0p26_persist bs=4096
/data/local/tmp/busybox echo "persist Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p27 of=/sdcard/backup_V10f/mmcblk0p27_tombstones bs=4096
/data/local/tmp/busybox echo "tombstones Done"
/data/local/tmp/busybox mknod /dev/block/recovery b 179 28
/data/local/tmp/busybox dd if=/dev/block/recovery of=/sdcard/backup_V10f/mmcblk0p28_recovery bs=4096
/data/local/tmp/busybox echo "recovery Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p29 of=/sdcard/backup_V10f/mmcblk0p29_fsg bs=4096
/data/local/tmp/busybox echo "fsg Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p30 of=/sdcard/backup_V10f/mmcblk0p30_DDR bs=4096
/data/local/tmp/busybox echo "DDR Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p31 of=/sdcard/backup_V10f/mmcblk0p31_fota bs=4096
/data/local/tmp/busybox echo "fota Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p32 of=/sdcard/backup_V10f/mmcblk0p32_mpt bs=4096
/data/local/tmp/busybox echo "mpt Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p33 of=/sdcard/backup_V10f/mmcblk0p33_tzbak bs=4096
/data/local/tmp/busybox echo "tzbak Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p34 of=/sdcard/backup_V10f/mmcblk0p34_rpmbak bs=4096
/data/local/tmp/busybox echo "rpmbak Done"
/data/local/tmp/busybox mknod /dev/block/felica b 259 3
/data/local/tmp/busybox dd if=/dev/block/felica of=/sdcard/backup_V10f/mmcblk0p35_felica bs=4096
/data/local/tmp/busybox echo "felica Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p36 of=/sdcard/backup_V10f/mmcblk0p36_seclog bs=4096
/data/local/tmp/busybox echo "seclog Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p37 of=/sdcard/backup_V10f/mmcblk0p37_mmbi bs=4096
/data/local/tmp/busybox echo "mmbi Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p38 of=/sdcard/backup_V10f/mmcblk0p38_oneseg bs=4096
/data/local/tmp/busybox echo "OneSeg Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p39 of=/sdcard/backup_V10f/mmcblk0p39_rct bs=4096
/data/local/tmp/busybox echo "rct Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p40 of=/sdcard/backup_V10f/mmcblk0p40_reserved bs=4096
/data/local/tmp/busybox echo "reserved Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p41 of=/sdcard/backup_V10f/mmcblk0p41_grow bs=4096
/data/local/tmp/busybox echo "grow Done"
/data/local/tmp/busybox echo "Backup Done"
というシェルスクリプトを作成して、端末に転送、実行権限755を付けて実行します。
SDカードにバックアップが取得されるので、大切に保存しておきましょう。
後は、busyboxとsuバイナリを/system配下に送り込みます。
/data/local/tmp/busybox mount -o rw,remount /system
/data/local/tmp/busybox cp /data/local/tmp/busybox /system/xbin/
/data/local/tmp/busybox chmod +x /system/xbin/busybox
busybox cp /data/local/tmp/su /system/xbin/
busybox chown 0:0 /system/xbin/su
busybox chmod 6755 /system/xbin/su
mount -o ro,remount /system
端末を再起動してしまうと、root権限が失われてしまうので、
再度、disable_ccsecurityを実行する必要があります。
起動時に実行されるシェルスクリプトを作成しても良いのですが、
lokiの脆弱性が使えるので、カスタムカーネルを作成して、
ccsecurityを解除したいと思います。
ここまでに必要なファイル一式です。
https://www.dropbox.com/s/an7cl4v3t68gx7t/L-04E_root.zip
755の実行権限を付けておきます。
これで、root化に必要なファイルはすべて揃いました。
端末上での操作に移ります。
adb shell
cd /data/local/tmp
./install_backdoor
./disable_ccsecurity
./run_root_shell
プロンプトが$→#に変われば、一時root化成功です。
次に、初期パーティションのバックアップを取得します。
/data/local/tmp/busybox mkdir -p /sdcard/backup_V10f/
/data/local/tmp/busybox echo "Backup Start"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p1 of=/sdcard/backup_V10f/mmcblk0p1_modem bs=4096
/data/local/tmp/busybox echo "modem Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p2 of=/sdcard/backup_V10f/mmcblk0p2_sbl1 bs=4096
/data/local/tmp/busybox echo "sbl1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p3 of=/sdcard/backup_V10f/mmcblk0p3_sbl2 bs=4096
/data/local/tmp/busybox echo "sbl2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p4 of=/sdcard/backup_V10f/mmcblk0p4_sbl3 bs=4096
/data/local/tmp/busybox echo "sbl3 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p5 of=/sdcard/backup_V10f/mmcblk0p5_aboot bs=4096
/data/local/tmp/busybox echo "aboot Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p6 of=/sdcard/backup_V10f/mmcblk0p6_rpm bs=4096
/data/local/tmp/busybox echo "rpm Done"
/data/local/tmp/busybox mknod /dev/block/boot b 179 7
/data/local/tmp/busybox dd if=/dev/block/boot of=/sdcard/backup_V10f/mmcblk0p7_boot bs=4096
/data/local/tmp/busybox echo "boot Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p8 of=/sdcard/backup_V10f/mmcblk0p8_tz bs=4096
/data/local/tmp/busybox echo "tz Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p9 of=/sdcard/backup_V10f/mmcblk0p9_pad bs=4096
/data/local/tmp/busybox echo "pad Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p10 of=/sdcard/backup_V10f/mmcblk0p10_modemst1 bs=4096
/data/local/tmp/busybox echo "modemst1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p11 of=/sdcard/backup_V10f/mmcblk0p11_modemst2 bs=4096
/data/local/tmp/busybox echo "modemst2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p12 of=/sdcard/backup_V10f/mmcblk0p12_m9kefs1 bs=4096
/data/local/tmp/busybox echo "m9kefs1 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p13 of=/sdcard/backup_V10f/mmcblk0p13_m9kefs2 bs=4096
/data/local/tmp/busybox echo "m9kefs2 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p14 of=/sdcard/backup_V10f/mmcblk0p14_m9kefs3 bs=4096
/data/local/tmp/busybox echo "m9kefs3 Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p15 of=/sdcard/backup_V10f/mmcblk0p15_drm bs=4096
/data/local/tmp/busybox echo "drm Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p16 of=/sdcard/backup_V10f/mmcblk0p16_sns bs=4096
/data/local/tmp/busybox echo "sns Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p17 of=/sdcard/backup_V10f/mmcblk0p17_ssd bs=4096
/data/local/tmp/busybox echo "ssd Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p18 of=/sdcard/backup_V10f/mmcblk0p18_misc bs=4096
/data/local/tmp/busybox echo "misc Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p19 of=/sdcard/backup_V10f/mmcblk0p19_factory bs=4096
/data/local/tmp/busybox echo "factory Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p20 of=/sdcard/backup_V10f/mmcblk0p20_bnr bs=4096
/data/local/tmp/busybox echo "bnr Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p21 of=/sdcard/backup_V10f/mmcblk0p21_encrypt bs=4096
/data/local/tmp/busybox echo "encrypt Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p22 of=/sdcard/backup_V10f/mmcblk0p22_eksst bs=4096
/data/local/tmp/busybox echo "eksst Done"
/data/local/tmp/busybox mknod /dev/block/system b 179 23
/data/local/tmp/busybox dd if=/dev/block/system of=/sdcard/backup_V10f/mmcblk0p23_system bs=4096
/data/local/tmp/busybox echo "system Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p26 of=/sdcard/backup_V10f/mmcblk0p26_persist bs=4096
/data/local/tmp/busybox echo "persist Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p27 of=/sdcard/backup_V10f/mmcblk0p27_tombstones bs=4096
/data/local/tmp/busybox echo "tombstones Done"
/data/local/tmp/busybox mknod /dev/block/recovery b 179 28
/data/local/tmp/busybox dd if=/dev/block/recovery of=/sdcard/backup_V10f/mmcblk0p28_recovery bs=4096
/data/local/tmp/busybox echo "recovery Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p29 of=/sdcard/backup_V10f/mmcblk0p29_fsg bs=4096
/data/local/tmp/busybox echo "fsg Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p30 of=/sdcard/backup_V10f/mmcblk0p30_DDR bs=4096
/data/local/tmp/busybox echo "DDR Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p31 of=/sdcard/backup_V10f/mmcblk0p31_fota bs=4096
/data/local/tmp/busybox echo "fota Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p32 of=/sdcard/backup_V10f/mmcblk0p32_mpt bs=4096
/data/local/tmp/busybox echo "mpt Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p33 of=/sdcard/backup_V10f/mmcblk0p33_tzbak bs=4096
/data/local/tmp/busybox echo "tzbak Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p34 of=/sdcard/backup_V10f/mmcblk0p34_rpmbak bs=4096
/data/local/tmp/busybox echo "rpmbak Done"
/data/local/tmp/busybox mknod /dev/block/felica b 259 3
/data/local/tmp/busybox dd if=/dev/block/felica of=/sdcard/backup_V10f/mmcblk0p35_felica bs=4096
/data/local/tmp/busybox echo "felica Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p36 of=/sdcard/backup_V10f/mmcblk0p36_seclog bs=4096
/data/local/tmp/busybox echo "seclog Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p37 of=/sdcard/backup_V10f/mmcblk0p37_mmbi bs=4096
/data/local/tmp/busybox echo "mmbi Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p38 of=/sdcard/backup_V10f/mmcblk0p38_oneseg bs=4096
/data/local/tmp/busybox echo "OneSeg Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p39 of=/sdcard/backup_V10f/mmcblk0p39_rct bs=4096
/data/local/tmp/busybox echo "rct Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p40 of=/sdcard/backup_V10f/mmcblk0p40_reserved bs=4096
/data/local/tmp/busybox echo "reserved Done"
/data/local/tmp/busybox dd if=/dev/block/mmcblk0p41 of=/sdcard/backup_V10f/mmcblk0p41_grow bs=4096
/data/local/tmp/busybox echo "grow Done"
/data/local/tmp/busybox echo "Backup Done"
というシェルスクリプトを作成して、端末に転送、実行権限755を付けて実行します。
SDカードにバックアップが取得されるので、大切に保存しておきましょう。
後は、busyboxとsuバイナリを/system配下に送り込みます。
/data/local/tmp/busybox mount -o rw,remount /system
/data/local/tmp/busybox cp /data/local/tmp/busybox /system/xbin/
/data/local/tmp/busybox chmod +x /system/xbin/busybox
busybox cp /data/local/tmp/su /system/xbin/
busybox chown 0:0 /system/xbin/su
busybox chmod 6755 /system/xbin/su
mount -o ro,remount /system
端末を再起動してしまうと、root権限が失われてしまうので、
再度、disable_ccsecurityを実行する必要があります。
起動時に実行されるシェルスクリプトを作成しても良いのですが、
lokiの脆弱性が使えるので、カスタムカーネルを作成して、
ccsecurityを解除したいと思います。
ここまでに必要なファイル一式です。
https://www.dropbox.com/s/an7cl4v3t68gx7t/L-04E_root.zip
Optimus G Pro(L-04E) root化②
上記のファイルを端末に転送します。
adbが必要になるので、androidSDKをPCに導入しておきます。
http://developer.android.com/sdk/index.html
ここから、自分のPCに合ったSDK Tools Onlyをダウンロードして、
インストールしておきます。
adb devices
で端末との通信を確立します。
それぞれを、
adb push XXX /data/local/tmp
で端末に転送します。
adb shell
で端末上の操作に移ります。
cd /data/local/tmp
でファイルを転送したフォルダに移動します。
chmod 755 XXX
で、disable_ccsecurity,get_essential_address,install_backdoor,run_root_shellに実行権限を付けます。
chmod 644 device.db
device.dbは実行権限必要ないので、読み書き可能にしておきます。
まずは、
./get_essential_address
を実行して、関数のアドレスを調べます。
しばらく時間がかかりますが、
コンソールに必要な情報が出てきます。
L04E10fで実行した結果はこちらです。
Essential address are:
prepare_kernel_cred = 0xc009e3dc
commit_creds = 0xc009dfb8
remap_pfn_range = 0xc0113d08
vmalloc_exec = 0xc012099c
ptmx_fops = 0xc0fbc570
アドレスを登録しておくと、アドレスサーチの時間が短縮できる?ので、
device_databaseに登録しておきます。
device_databaseフォルダ内にある以下のソースで、
device_address.c
device_database.h
に先ほどの関数のアドレスと端末の情報を入力していきます。
記載方法は、
https://github.com/tkawajir/android_device_database/commit/594b4e45b91e73a4ef42bc9b9508ea1e210620c8
を参照してください。
sqlite3が必要になるので、
sudo apt-get install sqlite3
でインストールしておきます。
device_databaseフォルダで
make
を実行すると、新しいdevice.dbが作成されるので、
これを端末に再度転送します。
device.dbは情報を登録しなくても大丈夫です。
adbが必要になるので、androidSDKをPCに導入しておきます。
http://developer.android.com/sdk/index.html
ここから、自分のPCに合ったSDK Tools Onlyをダウンロードして、
インストールしておきます。
adb devices
で端末との通信を確立します。
それぞれを、
adb push XXX /data/local/tmp
で端末に転送します。
adb shell
で端末上の操作に移ります。
cd /data/local/tmp
でファイルを転送したフォルダに移動します。
chmod 755 XXX
で、disable_ccsecurity,get_essential_address,install_backdoor,run_root_shellに実行権限を付けます。
chmod 644 device.db
device.dbは実行権限必要ないので、読み書き可能にしておきます。
まずは、
./get_essential_address
を実行して、関数のアドレスを調べます。
しばらく時間がかかりますが、
コンソールに必要な情報が出てきます。
L04E10fで実行した結果はこちらです。
Essential address are:
prepare_kernel_cred = 0xc009e3dc
commit_creds = 0xc009dfb8
remap_pfn_range = 0xc0113d08
vmalloc_exec = 0xc012099c
ptmx_fops = 0xc0fbc570
アドレスを登録しておくと、アドレスサーチの時間が短縮できる?ので、
device_databaseに登録しておきます。
device_databaseフォルダ内にある以下のソースで、
device_address.c
device_database.h
に先ほどの関数のアドレスと端末の情報を入力していきます。
記載方法は、
https://github.com/tkawajir/android_device_database/commit/594b4e45b91e73a4ef42bc9b9508ea1e210620c8
を参照してください。
sqlite3が必要になるので、
sudo apt-get install sqlite3
でインストールしておきます。
device_databaseフォルダで
make
を実行すると、新しいdevice.dbが作成されるので、
これを端末に再度転送します。
device.dbは情報を登録しなくても大丈夫です。
Optimus G Pro(L-04E) root化①
手順は色んな機種で使われている方法で、
他の端末でも応用が効くので、ツールキットとかは使わずに自分で出来るように
なるといいと思います。
CyanogenModをビルドするためには、Ubuntu環境が必要になるので、
root化ツールのビルドもUbuntu環境を前提に書きます。
後は、端末でバイナリを実行するので、AndroidNDKもUbuntu環境に
構築しておきます。
Ubuntu環境の構築については、VirtualBOXやVMware Playerを使用します。
この辺は、色んな記事があるので、そちらを参照してください。
また、AndroidNDKも
https://developer.android.com/tools/sdk/ndk/index.html
ここから、Linux64bit版を入れて、パスを通しておきましょう。
次に、root化ツールに必要なオブジェクトをビルドします。
このような素晴らしいツールを公開してくださっている、
android-rooting-toolsのメンバーの皆さんに感謝します。
まずは、gitを使ってソースをダウンロードします。
root化に必要なアドレスを検索するツールとセキュリティモジュールを
解除するツールです。
git clone --recursive https://github.com/android-rooting-tools/android_get_essential_address.git
git clone --recursive https://github.com/fi01/backdoor_mmap_tools.git
それぞれをandroid-ndkを使ってビルドします。
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
libs/armeabiフォルダに、
get_essential_address
disable_ccsecurity
install_backdoor
run_root_shell
が出来ます。
また、device_databaseフォルダにあるdevice.dbも必要になります。
他の端末でも応用が効くので、ツールキットとかは使わずに自分で出来るように
なるといいと思います。
CyanogenModをビルドするためには、Ubuntu環境が必要になるので、
root化ツールのビルドもUbuntu環境を前提に書きます。
後は、端末でバイナリを実行するので、AndroidNDKもUbuntu環境に
構築しておきます。
Ubuntu環境の構築については、VirtualBOXやVMware Playerを使用します。
この辺は、色んな記事があるので、そちらを参照してください。
また、AndroidNDKも
https://developer.android.com/tools/sdk/ndk/index.html
ここから、Linux64bit版を入れて、パスを通しておきましょう。
次に、root化ツールに必要なオブジェクトをビルドします。
このような素晴らしいツールを公開してくださっている、
android-rooting-toolsのメンバーの皆さんに感謝します。
まずは、gitを使ってソースをダウンロードします。
root化に必要なアドレスを検索するツールとセキュリティモジュールを
解除するツールです。
git clone --recursive https://github.com/android-rooting-tools/android_get_essential_address.git
git clone --recursive https://github.com/fi01/backdoor_mmap_tools.git
それぞれをandroid-ndkを使ってビルドします。
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
libs/armeabiフォルダに、
get_essential_address
disable_ccsecurity
install_backdoor
run_root_shell
が出来ます。
また、device_databaseフォルダにあるdevice.dbも必要になります。
登録:
投稿 (Atom)