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対応の最新版を取得してきてください。

※動作することは確認していますが、くれぐれも自己責任で!
※また、バックアップは必ず取得して、戻せるようにしてください。

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が起動します。

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

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への変更は完了です。

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用に書き換えます。

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パッチを当てるカーネル・リカバリーの作成ですが、
やはりバックアップが大事だと思うので、リカバリーから作りたいと思います。

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