SHARP SH-01G を MVNO でテザリングする方法
公開日:2020/10/16
本ページは、プログラミング教養から若干それるのですが、非常に苦労した内容なので自分の備忘録として残し、
また同じ内容で、困っている方の参考になればと思い記事としました。
正直、2020年現在、こんな古い端末を今更使う人はいないと思いますが、2015年5月以前にドコモのキャリアから販売された
端末では、spモードを契約していない場合テザリングが出来きないという仕様があります。
非常に納得いかないこの仕様の仕組みは、テザリング起動時に、APNを切り換えるプログラムが入っており、
格安SIM(MVNO)キャリアのAPN設定から勝手に dcmtrg.ne.jp 切り替わり、通信が遮断されます。
この時の起動のトリガーが、現在のsimが、docomo(44010)の場合に発生するので、docomo系以外の sim にすることで、
テザリング出来るようになります。
そうです、結論から言いますと、この時期のSHARP端末に掛けられているテザリング規制は、SIMロックを解除して、
docomo以外のSIMを使う事でデザリングが出来るようになります。
(SH-01Gは、購入元の身元が分からなくても、docomoショップで¥3000の手数料を払えば、無条件でSIMロック解除に対応してくれます)
でも、これでは記事にならないので、どうしてもdocomo系のSIMで、テザリングがしたい人の為に、
筆者が行った手法を説明しようと思います。
ただし、実施する条件として、端末(SH-01G)の脆弱性を利用して、一時的に root化 状態にする必要があるので
ある程度、パソコンが触れる知識と、プログラムに関する知識がないと、端末の破壊(いわゆる文鎮化)につながる
リスクがある事を、十分に理解したうえで自己責任にて実施して下さい。 端末が壊れても当サイトでは一切の責任は負いません。(負えません)
(正直、もう既にメーカーのサポート期間切れているのでもはや補償もクソもありませんが、覚悟と好奇心のある方のみ挑戦してみて下さい。)
また、SH-01GのAndorid OS のVer.が4.4 (kitkat)でビルド番号が 01.00.07
(01.00.08 でもいけるかもしれませんが、未確認です)でないと、一時的に、root権限を奪うための、
エクスプロイトが刺ささらず、一時rootをとれません。 (既に Android5.0 にアップデートしている場合は残念ながらあきらめです)
はじめに
他のWebサイトで、docomo端末にかけられている、テザリングロック(テザリング規制)の解除方法として、
ADBコマンドから、『settings put global tether_dun_required 0』
を打つことで切り替えの解除が出来るという方法が紹介されておりますが、SH-01Gも含めSHARPの端末では
できません。これは、SONYなどのエクスペリア系とではAPNを切り替えている手法が違う為です。
ですので、詳しくは後述しますが、テザリング時のAPN強制切替を阻止する為には、一時的にroot権限を奪い、
システムアプリ内に組み込まれているプログラムを叩く必要があります。
また、SH-01Gも含め、SHARPの端末はセキュリティが非常に堅牢で、端末を恒久的にroot化するのは非常に難しいです。
その理由として、
1. Linuxセキュリティ(linux_miyabi_lsm)にて、あらゆるコマンドが禁止されている
2. システム領域データ(mmcblkパーテーション)に、ライトプロテクト(ソフト的な)が掛けられている。
3. root権限を取得する為の、suバイナリを配置する領域が、ハードウェアライトプロテクトが掛けられている。
為です。特に、3つ目のハードウェアライトプロテクトが非常に厄介で、1と2のプロテクトのメモリデータにパッチを当て突破しても、
reboot時(再起動など)に、全て元に戻されます。
※逆に言ってしまえばシステム領域は、何かウィルス等が混入しても、電源を消せばリセットがかかるので安全ではあるが...
この、ハードウェアライトプロテクトの解除する為には、Linuxでの開発環境の準備と、
SH-01G のカーネルOSのビルドの知識が必要になり、かつそのプロテクトの解除モジュールを準備して、
実機にあてこまなくてはなりません。 正直、非常に難しく(というか自分はそこまで出来なかった)困難を極めるため、
初めてやる人にはお勧めできません。
ですので、本ページでは、別の方法で代用をする方法を紹介します。
上記の通り、端末に再起動かけた場合、端末は元通りになる為、テザリング規制が再びかかる為、解除する為には後述するツールを
都度起動させる手間があるというのをご了承願います。
(※確約は出来ませんが、リセットされるシステムを変更しない為、文鎮化のリスクほぼ無いと言えるでしょう)
マイクロUSBも、Type-Cも、ライトニングケーブルもこれ一本
繰り返し行うスマホの充電でくたびれるコネクタと、貧弱な純正ケーブルとおさらば!
マグネット吸着で簡単接続!パソコンとのデータ通信もOK!
作業の流れ
初めに、SH-01Gの、root権限を奪う為のツールを準備する必要があります。
~必要なもの~
・SHARPのUSBドライバ
・Android ADB (※Ver.不問)
・AndroidNDKコンパイラ (android-ndk-r10e)
・msysgit のCUIインストール (Git-2.22.0-64-bit_※Ver不問)
・SH-01Gのカーネルソース(01.00.07)
上記の物をダウンロードして準備します。
・SHARPのUSBドライバと、カーネルソースは、SHARPのWebサイトからダウンロードしてください。
・Android_ADBは、AndroidStudioをインストールすれば、一緒にインストールされます
・AndroidNDK は後述する神ツールのビルドに必要ですが、Verが重要です。android-ndk-r10eでないどツールをビルドできないので、Googleのサイトから引っ張て来てください。
・msysgitは、後述する神ツールのソースコードをダウンロードするのに必要です。
ADBと、NDKと、msysgitは、作業を円滑に進めるために、環境変数のPATHを通して置いてください。
※環境変数のPATHの通し方は、AndroidStudio入門 ページを参考にして下さい。
データ通信 1ギガ未満なら無料!! は楽天モバイルだけ ! !<
作業開始
上記の準備が出来たら、root権限を奪う為のツールを用意します。
コマンドプロンプトを立ち上げて、
git clone --recursive https://github.com/fi01/backdoor_mmap_tools
と打つと、現在のディレクトリにソースコードがダウンロードされます。
(これは、fi01 さんという方が作られたツールとなります。fi01さんに感謝です)
ツールがダウンロード出来たら、さっそくビルドします。
ダウンロードして作られた、backdoor_mmap_toolsのフォルダに移動して、
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
とコマンドを打つと、ビルドを行います。
正常にビルドできれば、
..\backdoor_mmap_tools\libs\armeabi
のフォルダに、たくさんファイルが出来上がっていると思います。
この中で、SH-01Gのroot権限を奪うためには、
install_backdoor
run_root_shell
unlock_lsm_miyabi
と、
..\backdoor_mmap_tools\device_database
ディレクトリ内にある
device.db
が必要なので、SH-01G の端末に送り込みます。
Cドライブの直下に、tool というディレクトリを作成して上記4つのファイル入れ、ADBコマンド PUSHを使って、SH-01Gの /data/local/tmp/ というディレクトリに送り込みます。
c:\tool\> adb push ./ /data/local/tmp
送り込んだら、各ファイルのアクセス権限である、パーミッションを変更するために、
下記のコマンドを打ち込みます。
c:\tool\>adb shell
shell@SH-01G:/$ cd /data/local/tmp
shell@SH-01G:/data/local/tmp$ chmod 755 ./*
shell@SH-01G:/data/local/tmp$ chmod 644 device.db
正常にコマンドが終了したら、特に表示がされないので、 ls -l コマンドを打って
ファイルのパーミッションを確認します。
device.db が
-rw- r-- r--
となって、他ののファイルが、
-rwx r-w rw となっていればOKです。
ツールを使う
では、実際にツールを使って、root権限を奪ってみます。
/data/local/tmp/
のディレクトリのまま下記のコマンドを打って、ツールを起動させます。
shell@SH-01G:/data/local/tmp$ ./install_backdoor
※2020年現時点での、Githubがらクローン出来る backdoor_mmap_tools 自体はSH-01Gに対して、元々対応してはいないようです。その為、
ツールが走り出しても、初回の場合は、失敗のメッセージが流れて終了します。
ですが、このツールの凄い所は、未対応の機種でも端末が抱えている脆弱性のアドレスを探し出し、
脆弱性が残っている場合、攻撃をするアドレスデータを device.db ファイルに記憶させます。
※(上記の方法とは別に、get_essential_address というツールを使っても、上記で取得する
脆弱性のアドレスを取得してdevice.dbに書き込む事もできます。)
ですので、再度もう一度、install_backdoor 起動させます。
SH-01Gのビルド番号01.00.07 では、CVE-2025-3636 と呼ばれる、Linuxカーネルの
脆弱性を抱えている為、pingpong_exploit と呼ばれる、エクスプロイトが刺さります。
(※SHL25のビルド番号01.00.05でも同様の脆弱性を抱えているため、同じくroot権限が奪えます)
pingpong_exploit の詳しい原理は分かりませんが、ICPMソケットを大量に送りこんで発生する、
カーネルパニック時に起きるバッファオーバーラン(メモリ破壊)を利用してレジスタのリターンアドレスを書き換え任意のアドレスにジャンプする仕組みを利用しているようです。
詳しくは、『ローカルバッファオーバーフロー』、『ハッキング』 等で検索するとで詳しく解説しているサイトがあるので、
興味のある方は調べてみてください。
話が逸れましたが、 install_backdoor はたまに失敗するので、
install_mmap: success
と表示されるまで、繰り返します。無事 success の文字が表示されたら
./run_root_shell
を起動させて見ましょう $ のマークが # になるはずです。
データ通信 1ギガ未満なら無料!! は楽天モバイルだけ ! !
テザリングが出来るようにする為のシステムクローンを作る
先述の方法で 一時root を取得して、テザリング規制をしているシステムアプリを改鋳しても、
再起動をした時点で元に戻ってしまうため、ある程度簡単に復元できる様にする為の準備をします。
その方法は、書き込み禁止エリアであるシステム領域のクローンを作りだし、
読み書きできるエリアに配置して、再マウントさせるという方法です。
SH-01Gでは、Linux_miyabi_lsm のせいで、dd コマンドが使えない為、
./unlock_lsm_miyabi
を起動してこの規制突破させます。
※先述した通り、この時点では、このツール自体SH-01Gを想定しているものではないので、
install_backdoor実行時に取得した、miyabi_lsm 全てのアドレスに、ケーパビリティのアドレスで、
パッチを当てるため、恐ろしくシステムが不安定(クラッシュ状態)になります。
実行中のアプリが次々に死んで、まともに操作しなくなるでしょう。
ですが、今はクローンを作るのが目的なのでとりあえず無視して、
再度、run_root_shell にて仮root状態になって、下記のコマンドを実行します。
dd if=/dev/block/mmcblk0p19 of=/data/local/system.img
※mmcblk0p19 が SH-01G のシステムパーテーションになります。
正常に dd が出来れば、mmcblk0p19 のクローンとなる system.img が
shell@SH-01G:/data/local/
以下に、出来上がります。
マグネット式充電ケーブル
スマホの充電ケーブルは抜き差し不要! マグネット吸着で簡単接続! ケーブルの断線不良ともおさらば!
テザリングロック(APN強制切り替え)を行っているアプリの改鋳をする
system.img が出来たら、docomoのMVNOシムの場合にAPNを切り替える
ている忌まわしきアプリの、一部の箇所を塗り替えて改鋳します
まず初めに、system.img はそのままでは開けないので、mount コマンドを使って、
展開します。
/data/local/tmp/
以下に、 展開用の仮ディレクトリを作成します。
shell@SH-01G:/data/local/tmp# mkdir sys2
※sys2 は適当です。自分が分かれば何でもいいです。
ディレクトリが出来たら、system.img を sys2 展開する為に以下のコマンドを打ってマウントさせます
mount -o loop,rw -t ext4 /data/local/system.img sys2
※上記は現在のディレクトリパスが/data/local/tmpとしての例です
特に問題がなければ、
/data/local/tmp/sys2
以下に、systemディレクトリと同じものが出来上がっているはずです。
展開されたのこのフォルダの、
/data/local/tmp/sys2/framework/ 以下にある
framework2.odex
が、APN切替え行ってる諸悪の根源なので、framework2.odex の一部にいたずらを行います。
とにもかくにも、このままでは編集が出来ないので、一度shellから抜け出して、通常のコマンドプロンプトに戻って、
framework2.odex を pull します。
shell@SH-01G:/data/local/tmp# exit
shell@SH-01G:/data/local/tmp$ exit
c:\tool> adb pull /system/framework/framework2.odex
pull が出来たら、tool ディレクトリ内に、framework2.odex
が出来上がっているはずなので、このodex をバイナリエディタ、
(もしくはメモ帳)で開いて、『44010』 の文字列を検索します。
一か所だけヒットするはずです。
この44010の 1 の箇所を、1以外に数値に変更して保存します。
※私はauが嫌いなのでauのsimを買うことは絶対にないので、7 に変更しました。
データ通信 1ギガ未満なら無料!! は楽天モバイルだけ ! !
この時注意して欲しいのが、誤って空白を足したり、減らしたりして、framework2.odex
の絶対的なバイト数を変えない用にして下さい。
変更が出来たら、先ほどマウントした、sys2 以下にある、framework ディレクトリに戻して
上書きします。
c:\tool>adb push framework2.odex /data/local/tmp/sys2/framework
※ついでにカメラのシャッター音が気になる場合は、
/data/local/tmp/sys2/media/.sharp_audio/ui/
以下にある camera の名の付くファイル名を mvコマンド使って換えてしまいましょう。
odexの改鋳が完了したら、念の為書込み可でマウントしたsystem.img ファイルを、
読込のみに変更してリマウントして、アンマウントします。
例のごとく、shell のままでは mount コマンドが使えないので 仮root になります
※run_root_shell は端末を再起動しなければ、install_backdoor 無して直ぐに # なれます
c:\tool>adb shell
shell@SH-01G:$ cd /data/local/tmp
shell@SH-01G:/data/local/tmp$ ./run_root_shell
shell@SH-01G:/data/local/tmp# mount ro,remount /data/local/tmp/sys2
shell@SH-01G:/data/local/tmp# umount /data/local/tmp/sys2
shell@SH-01G:/data/local/tmp# reboot
マウントが正常に解除されれれば、sys2以下の、ディレクトリがなくなるはずです。
そして、めちゃめちゃに不安定なっている端末をリセットさせるために、一度端末を再起動させます。
最後にシステムを改鋳したクローンのsystem.img で、マウントしてアンドロイドが走れば完了なのですが、一つ問題があります。
先ほど、再起動をかけたので、仮rootになる為には、再度 install_backdoor をする必要あるのと、また改鋳したシステムの
クローンをマウントさせる為の mount コマンドを使うためには、lsm_miyabi の規制を突破しなければなりません。
ですが、mountコマンドを使う為に使用した、unlock_lsm_miyabi は、SH-01Gにおいては、lsmに関わるであろう全てのアドレスに、
解除用のパッチデータを被せる為に、何所かでデータが壊れて端末が操作できないレベルで不安定になるため
そのままではまともに使用することが出来ません。 ですので、mount コマンドを使う為に、端末に影響を与えない範囲で
LSMを解除する必要があります。
unlock_lsm_miyabi を少しだけ変更する
lsm_miyabi 全て排除する必要はないので、とりあえず mount コマンドだけがつかえるように
..\backdoor_mmap_tools\miyabi\unlock_lsm_miyabi.c
のソースコードをテキストエディタで開き、
330行付近と、unlock_lsm 関数との間に下記、定義と構造体を追加します。
#define security_ops_sh01g_01_00_07 0xc0b29da8
#define n_security_ops_sh01g_01_00_07 181
static lsm_fix_t lsm_fixes_sh01g_01_00_07[] = {
{ 0xc03318a0, 0xc032ccb8 }, // sb_mount
{ 0xc0331864, 0xc032ccc0 }, // sb_umount
{ 0xc03446a8, 0xc032cdd0 }, // path_chmod
};
※defien と構造体名は、任意なので必ずしも上記である必要はありません
次に mina 関数で走っている、switch 分岐のに、次の用に条件を追加します。
// --- SH01G を追加してみる-----
case 10000:
printf("Text_out TYPE_SH01G_DEVCode %d", rc );
security_ops = security_ops_sh01g_01_00_07;
n_security_ops = n_security_ops_sh01g_01_00_07;
lsm_fixes = lsm_fixes_sh01g_01_00_07;
n_lsm_fixes = ARRAY_SIZE(lsm_fixes_sh01g_01_00_07);
break;
なんでかは分からないのですが、この時期の端末は、detect_device(); で取得した値が、10000という値が戻ってきてしまうので、
とりあえず定数値で書いてみます。
追記出来たら、再びビルドしてみましょう。
SH-01Gのマウントがだけが出来るようにした、unlock_lsm_miyabi 出来上がったので、
名前を分かりやすいように変えて(とりあえずunlock_lsm_mountとします)、端末に push してパーミッションを変更します。
c:\tool>adb push unlock_lsm_mount /data/local/tmp/
c:\tool>adb shell
shell@SH-01G:$ cd /data/local/tmp
shell@SH-01G:/data/local/tmp$ chmod 755 unlock_lsm_mount
では、再び install_backdoor して 仮root 取って、lsm を解除してみましょう。
lsm が解除出来たら、Androidを一旦止めて、改鋳システムでマウントを行い、再度Androidを走らせます。
shell@SH-01G:/data/local/tmp# stop zygote
shell@SH-01G:/data/local/tmp# mount -o loop -t ext4 /data/local/system.img /system
shell@SH-01G:/data/local/tmp# start zygote
zygote で一度再起動のような画面になるのですが、adb自体は起動しているので、
2行目のマウントコマンドを実行し、start zygote を打ってandroid 起動させます。
※上記の3行は、実際には素早く行う必要があるので、sh ファイルなどで、バッチ化して
おいた方が便利でしょう
正常に起動できれば、これでMVNOシムでテザリングをONにしても圏外にならないはずです。
お疲れ様でした。