Android Marketのプロトコルについて、第2回:Vendingアプリを使わずにAndroid Marketのフリーのアプリをダウンロードする方法(未検証)で書きましたが、ANDROID_IDの取得方法が解明されました。
Androidで使用できる固有識別情報は大別すると2種類あり、ANDROID_IDはその1つとなります。
(1)ANDROID_ID
Uniquely Identifying Android Devices without special permissions. http://strazzere.com/blog/?p=113
ANDROID_IDは、Android Marketのプロトコルでも使われている重要なパラメータの1つです。
Googleのドキュメントにも説明があります。
http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID
The Android ID (a unique 64-bit value) as a hex string. Identical to that obtained by calling GoogleLoginService.getAndroidId(); it is also placed here so you can get it without binding to a service.
Constant Value: “android_id”
ANDROID_IDは、ユニークな64bitの値で16進文字列。Android端末を(たぶん)一意に識別できる値。
(GoogleLoginService.getAndroidId();をコールして得られたものと同じ)
WindowsでいうところのGUIDみたいなものでしょうか?WindowsのGUIDのビット数は128bitだった気がしますが。
ANDROID_IDの取得方法は、API Level 1より提供されている
android.provider.Settings.System.ANDROID_ID
は推奨されなくなったようです。
API Level 3(Android 1.5)以降では、android.provider.Settings.Secure.ANDROID_ID
から取得するようになりました。Permissionが付与されていないと読めなくなったので、セキュリティ的な理由で変更されたんですかね。
訂正:2011/10/03 18:47
android.provider.Settings.Secure.ANDROID_IDの値を取得するのに特別なpermissionは必要なく、値を書き換える時にandroid.permission.WRITE_SECURE_SETTINGSというpermissionが必要なことがわかりました。
謹んでお詫びいたします。
で、このANDROID_IDの値ですが、工場出荷時状態からの初回起動時か、Googleのサーバとのアクティベーション時に生成されて、Googleのサーバに登録されるんですかね。Windowsのアクティベーションはこんな感じだったような気がするんですが。
それと、ANDROID_IDは、root権限が取得できると書き換えることができます。やり方は、sqliteのデータベースのANDROID_IDの値を書き換えるだけ。
More spoofing of the android id…
http://strazzere.com/blog/?p=235
設定値が保存されているsqliteのデータベースです。
/data/data/com.google.android.googleapps/databases/accounts.db
Spoofing your Android_ID
http://strazzere.com/blog/?p=217
こちらにもANDROID_IDの設定値が保存されています。
/data/data/com.android.providers.settings/databases/settings.db
どちらがマスターなんでしょう。。。
ってことは、Android端末をリセットすると/dataは初期化されるはずなので、ANDROID_IDが変わってしまうってこと???
(2)携帯電話特有の固有識別情報
Uniquely Identifying Android Devices with special permissions
http://strazzere.com/blog/?p=116
サンプルコードが載っていたのでメモ。
import android.telephony.*;
…
TelephonyManager mTelephonyMgr =
(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String imei = mTelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE
String phoneNumber=mTelephonyMgr.getLine1Number(); // Requires READ_PHONE_STATE
String softwareVer = mTelephonyMgr.getDeviceSoftwareVersion(); // Requires READ_PHONE_STATE
String simSerial = mTelephonyMgr.getSimSerialNumber(); // Requires READ_PHONE_STATE
String subscriberId = mTelephonyMgr.getSubscriberId(); // Requires READ_PHONE_STATE
取得例
DeviceId(IMEI) = 000000000000000
DeviceSoftwareVersion = null
Line1Number = 15555218135
SimSerialNumber = 89014103211118510720
SubscriberId(IMSI) = 310995000000000
IMEI、端末ソフトウェアのバージョン、MSISDN、SIMのシリアル番号、IMSIを取得することができます。
取得するには、android.permission.READ_PHONE_STATEのPermissionが必要です。
これらの情報を収集すれば、そのうちAndroidでも↓こんなニュースが流れるようになってくるかもしれません。
未発表 iPhoneモデル「iPhone3,1」、アプリの利用統計で観測される
あと、Android端末のファームウェアが不正に書き換えられているとサービス拒否とか。。。
勝手に収集されて悪用されると怖いかも。
最近のコメント