root化した端末で、Settings.secure.*の設定値を勝手に書き換える。


電池もちの悪いスマホをどうにかしようと、LTEにアタッチさせない方法をいろいろ探っているときに、たまたま見つけたHackテクニックを紹介。

すでに、某所にて回答として書いたネタだったりするのですが、結構いろいろできておもしろいので、こちらでも紹介。

そもそもSettings.secureがいじれると何が嬉しい?
私自身、何が嬉しいかはよく知りません(爆)
本来、getすることができてもsetすることはできない設定値をいじれることが嬉しい、ってだけの完全にダメなハッカーです。はい。

一応リファレンス見てみると…
http://developer.android.com/reference/android/provider/Settings.Secure.html

う〜ん、なんかピンと来るもんはないですね。パーミッションさえあればAndroid標準で提供されているAPIを経由して設定できるものが多いです。
WIFI系の設定値で、AP_COUNTとかWATCH_DOGなんとか、みたいなのがある程度でしょうか。

あ、Settings.systemのほうもいじれますよ。念のため。ただ、system設定をいじったところで、そんなにおもしろいことはできないような。。偏見ですが。


どうやっていじるか

Settings.systemとかSettings.secureって、実体は何かって知ってます?
Androidのソースを読むと分かるんですが、結局のところ
/data/data/com.android.providers.settings/databases/settings.dbを、
コンテントプロバイダ経由で読み書きしてるだけなんですね。

root@android:/ #sqlite3 /data/data/com.android.providers.settings/databases/settings.db

SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table

android_metadata   bookmarks          system          bluetooth_devices  secure  

こんな具合に、root権があると、sqlite使って覗けちゃうんですよね。

ということは! ですよ。

su -c "echo | sqlite3 <上記settings.dbのパス>"

って、アプリからrootシェルたちあげて実行すれば、putInt(Settings.secureなんちゃら)みたいの書いたりせずとも、ましてや、AndroidManifestでパーミッションを設定していなくても、設定値を読み書きできちゃうんですね。

アイディアとしてはそんな感じです。
実装はここをみてください。SuperUser+su環境でrootシェルを動かすための補助クラスを使って8行程度と、非常に簡単にできてしまうのです。。
あんまりおおっぴらに言ってしまうと、よろしくない内容なので、多くは語りません(^^;;