突然消失するかもしれないブログ

”とつきえブログ”

Android Marketのハック事情(6):Androidの固有識別情報-1/ANDROID_ID

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端末のファームウェアが不正に書き換えられているとサービス拒否とか。。。

勝手に収集されて悪用されると怖いかも。

広告

Android Marketのハック事情(6):Androidの固有識別情報-1/ANDROID_ID」への1件のフィードバック

  1. ピンバック:ANDROID_IDは使わないで下さい!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。