主要探索如何用Frida修改Android设备唯一标识符。
Android逆向-设备标识符
现在很多的标识方式都已经过时了,不过这里先记载一下。
IMEI
IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的”电子串号”,它与每台移动电话机一一对应,而且该码是全世界唯一的。每一只移动电话机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录。
有些设备的IMEI有两个,可以在拨号键盘输入“*#06#”查看。普通APP获取需要申请权限():
以下是普通APP尝试获取IMEI码的代码。
但是在Android26及以上,为了隐私安全,已经没法获取IMEI了。
1 | //权限 <uses-permissionandroid:name="android.permission.READ_PHONE_STATE" /> |
1 | private String getIMEI() { |
IMSI
IMSI是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,同样使用0~9的数字,例如460010280100023。其中MCC是移动用户所属国家代号,占3位数字,中国的MCC规定为460;MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户,
IMSI与IMEI权限相同,获取代码:
也已经没法正常获取了。
1 | private String getIMSI() { |
ANDROID_ID
ANDROID_ID 是一串64位的数字,并以16进制字符串的形式保存下来,是设备首次启动时随机生成的设备的第一个引导,其记录着一个固定值,通过它可以知道设备的寿命。ANDROID_ID也可视为作为唯一设备标识号的一个好选择,当设备没有手机号时,例如平板设备等,可以采用ANDROID_ID作为标识。
需要注意:
- android_id在设备恢复出厂设置后,该值会改变
- 部分定制手机获取到的android_id为null
- 由于定制问题,不同的设备可能会产生相同的ANDROID_ID
- Android 8.0后不同应用获得的值不同
应用签署密钥、用户和设备的每个组合都具有唯一的 ANDROID_ID 值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)参考https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=zh-cn
android_id获取方式:
1 | String strAndroidId = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); |
这个还可以用。
设备序列号(Serial Number)
SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证“产品的合法身份”而引入的一个概念,它是用来保障用户的正版权益,享受合法服务的;一套正版的产品只对应一组产品序列号。别称:机器码、认证码、注册申请码等。
获取方式:
- adb shell(可以使用)
1 | adb shell getprop ro.serialno |
- android.os.Build(不可使用)
1 | String SerialNumber = android.os.Build.SERIAL; |
- android.os.SystemProperties.get
此API为hidden API,需要反射获取
1 | ClassLoader cl = context.getClassLoader(); |
除了SN号,还有制造商、品牌、型号、设备名等其他信息和SN的获取方式相同
1 | android.os.Build.BRAND:获取设备品牌 |
MAC地址
1 | android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) this.getSystemService(Context.WIFI_SERVICE); |
- 没有 WiFi 硬件或者 WiFi 不可用的设备可能返回 null 或空
- Android 6.0开始,谷歌为保护用户数据,用此方法获取到的 Wi-Fi mac 地址都为02:00:00:00:00:00
- 需要 ACCESS_WIFI_STATE 权限
总结
暂且来说,比较常见的IMEI都不能获取了,只能用ANDROID_ID作为标识。
不过这没有考虑Root后的操作。
参考
利用Frida修改Android设备的唯一标识符 | m4bln (mabin004.github.io)
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/03/Android逆向-设备标识符/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!