首页 > 解决方案 > 在 Android 12 上通过 ADB 读取 IMSI 信息

问题描述

我最近将我的 Pixel 5 设备更新为 Android 12 Beta,发现无法再使用以下命令通过 ADB 获取 IMSI 信息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,因此很明显这与硬件无关,而是对用户安全层的更新在安卓 12 上。

我没有用 root 测试过,因为在运行 Android 10-11 的任何设备上都不需要这样做。

据我所知,这是在较新设备上读取 IMSI 信息的唯一方法,因为READ_PHONE_STATE权限已更改并且读取 IMSI 信息的能力已移至READ_PRIVILEGED_PHONE_STATE权限;仅适用于系统和供应商应用程序。

这是一个失败的原因,还是有任何其他一致的方式可以在较新的 Android 设备上读取 IMSI 信息?

标签: androidadb

解决方案


如果您的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);
    }
}

推荐阅读