在 Android 12 通过 ADB 读取 IMSI 信息
Read IMSI information via ADB on Android 12
我最近将我的 Pixel 5 设备更新为 Android 12 Beta,发现无法再使用命令 service call iphonesubinfo 8 i32 1
通过 ADB 获取 IMSI 信息
现在通过ADB执行时显示如下信息:
redfin:/ $ service call iphonesubinfo 8 i32 1
Result: Parcel(
0x00000000: ffffffff 00000042 00650067 00530074 '....B...g.e.t.S.'
0x00000010: 00620075 00630073 00690072 00650062 'u.b.s.c.r.i.b.e.'
0x00000020: 00490072 00460064 0072006f 00750053 'r.I.d.F.o.r.S.u.'
0x00000030: 00730062 00720063 00620069 00720065 'b.s.c.r.i.b.e.r.'
0x00000040: 0020003a 00610050 006b0063 00670061 ':. .P.a.c.k.a.g.'
0x00000050: 00200065 0075006e 006c006c 00640020 'e. .n.u.l.l. .d.'
0x00000060: 0065006f 00200073 006f006e 00200074 'o.e.s. .n.o.t. .'
0x00000070: 00650062 006f006c 0067006e 00740020 'b.e.l.o.n.g. .t.'
0x00000080: 0020006f 00300032 00300030 00000000 'o. .2.0.0.0.....'
0x00000090: 00000000 '.... ')
运行 在同一台 Pixel 5 上执行上述命令,但安装了最新的 Android 11 版本,它将以与上述相同的格式向我显示 IMSI,因此很明显这与硬件无关,而是 Android 12.
上对用户安全层的更新
我没有用 root 测试过,因为这在任何设备上都没有必要 运行 Android 10-11。
据我所知,这是在较新设备上读取 IMSI 信息的唯一方法,因为 READ_PHONE_STATE
权限已更改并且读取 IMSI 信息的能力已移至 READ_PRIVILEGED_PHONE_STATE
权限;仅适用于系统和供应商应用程序。
这是一个失败的原因还是有任何其他一致的方式来读取较新的 Android 设备上的 IMSI 信息?
如果你的apk的targetsdk <30,你可以通过下面的方法获取IMSI,无需任何权限android 11.
Uri uri = Uri.parse("content://telephony/siminfo");
Cursor cursor = null;
ContentResolver contentResolver = getApplicationContext().getContentResolver();
cursor = contentResolver.query(uri,
new String[]{"_id", "sim_id", "imsi","icc_id","number","display_name"}, "0=0",
new String[]{}, null);
if (null != cursor) {
while (cursor.moveToNext()) {
String icc_id = cursor.getString(cursor.getColumnIndex("icc_id"));
String imsi_id = cursor.getString(cursor.getColumnIndex("imsi"));
String phone_num = cursor.getString(cursor.getColumnIndex("number"));
String display_name = cursor.getString(cursor.getColumnIndex("display_name"));
int sim_id = cursor.getInt(cursor.getColumnIndex("sim_id"));
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
Log.d("Q_M", "icc_id-->" + icc_id);
Log.d("Q_M", "imsi_id-->" + imsi_id);
Log.d("Q_M", "phone_num-->" + phone_num);
Log.d("Q_M", "sim_id-->" + sim_id);
Log.d("Q_M", "display_name-->" + display_name);
}
}
我最近将我的 Pixel 5 设备更新为 Android 12 Beta,发现无法再使用命令 service call iphonesubinfo 8 i32 1
现在通过ADB执行时显示如下信息:
redfin:/ $ service call iphonesubinfo 8 i32 1
Result: Parcel(
0x00000000: ffffffff 00000042 00650067 00530074 '....B...g.e.t.S.'
0x00000010: 00620075 00630073 00690072 00650062 'u.b.s.c.r.i.b.e.'
0x00000020: 00490072 00460064 0072006f 00750053 'r.I.d.F.o.r.S.u.'
0x00000030: 00730062 00720063 00620069 00720065 'b.s.c.r.i.b.e.r.'
0x00000040: 0020003a 00610050 006b0063 00670061 ':. .P.a.c.k.a.g.'
0x00000050: 00200065 0075006e 006c006c 00640020 'e. .n.u.l.l. .d.'
0x00000060: 0065006f 00200073 006f006e 00200074 'o.e.s. .n.o.t. .'
0x00000070: 00650062 006f006c 0067006e 00740020 'b.e.l.o.n.g. .t.'
0x00000080: 0020006f 00300032 00300030 00000000 'o. .2.0.0.0.....'
0x00000090: 00000000 '.... ')
运行 在同一台 Pixel 5 上执行上述命令,但安装了最新的 Android 11 版本,它将以与上述相同的格式向我显示 IMSI,因此很明显这与硬件无关,而是 Android 12.
上对用户安全层的更新我没有用 root 测试过,因为这在任何设备上都没有必要 运行 Android 10-11。
据我所知,这是在较新设备上读取 IMSI 信息的唯一方法,因为 READ_PHONE_STATE
权限已更改并且读取 IMSI 信息的能力已移至 READ_PRIVILEGED_PHONE_STATE
权限;仅适用于系统和供应商应用程序。
这是一个失败的原因还是有任何其他一致的方式来读取较新的 Android 设备上的 IMSI 信息?
如果你的apk的targetsdk <30,你可以通过下面的方法获取IMSI,无需任何权限android 11.
Uri uri = Uri.parse("content://telephony/siminfo");
Cursor cursor = null;
ContentResolver contentResolver = getApplicationContext().getContentResolver();
cursor = contentResolver.query(uri,
new String[]{"_id", "sim_id", "imsi","icc_id","number","display_name"}, "0=0",
new String[]{}, null);
if (null != cursor) {
while (cursor.moveToNext()) {
String icc_id = cursor.getString(cursor.getColumnIndex("icc_id"));
String imsi_id = cursor.getString(cursor.getColumnIndex("imsi"));
String phone_num = cursor.getString(cursor.getColumnIndex("number"));
String display_name = cursor.getString(cursor.getColumnIndex("display_name"));
int sim_id = cursor.getInt(cursor.getColumnIndex("sim_id"));
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
Log.d("Q_M", "icc_id-->" + icc_id);
Log.d("Q_M", "imsi_id-->" + imsi_id);
Log.d("Q_M", "phone_num-->" + phone_num);
Log.d("Q_M", "sim_id-->" + sim_id);
Log.d("Q_M", "display_name-->" + display_name);
}
}