二,手机硬件参数介绍和校验算法

系列文章目录

第一章 安卓aosp源码编译环境搭建
第二章 手机硬件参数介绍和校验算法
第三章 修改安卓aosp代码更改硬件参数
第四章 编译定制rom并刷机实现硬改(一)
第五章 编译定制rom并刷机实现硬改(二)
第六章 不root不magisk不xposed lsposed frida原生修改定位
第七章 安卓手机环境检测软件分享
第八章 硬改之设备画像

第九章 修改Art虚拟机对指定app的指定函数进行拦截(一)

第十章 修改Art虚拟机对指定app的指定函数进行拦截(二)


文章目录


前言

傻瓜式操作, 人人都能编译操作系统, 每个感兴趣的人都可以基于谷歌安卓aosp源码定制自己的系统


一、IMEI

由14位16禁制字符和第15位校验位标识组成,而且该码是全世界唯一的,双卡手机有两个码,可通过拨号键盘输入*#06#查看,手机有,平板无,国内开头为86,第15位校验位的计算方法通过C-SHARP实现

复制代码
APP读取示例:
读取需要android.permission.READ_PHONE_STATE权限

TelephonyManager telephonyManager =(TelephonyManager) context. getSystemService (Context. TELEPHONY SERVICE);String imei = telephonyManager.getDeviceId0; // getImei()

IMEI定义以869818-02-253461-9为例:
TAC[6位] + FAC[2位] + SNR[6] + SP[1]

计算第15位校验位算法(c#)

javascript 复制代码
public bool VerifyImei(string imei) {
  int checkDigit = 0; int addValue = 0; 
  for (int i = 1; i < imei.Length; i++)
  {
    if (i % 2 == 1)
    {
       int result = Convert. ToInt32(imei[imei. Length - i - 1]. ToString()) * 2; 
        if (result > 9) 
        addValue t= (result --- 9);
        else
        addValue += result;
        }
        else 
          addValue += Convert. ToInt32(imeilimei. Lngth - i --- 1]. ToString());
        }
if (addValue % 10 == 0)
  checkDigit = 0;
 else
  checkDigit = 10 --- addValue % 10; 
return (checkDigit - Conver.ToInt32(imei[imei.Length - 1].ToString())) == 0;
}
1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
2).将奇数位数字相加,再加上上一步算得的值
3).假设得出的数个位是0则校验位为0,否则为10减去个位数

二、IMSI

用于区分不同用户在移动蜂窝网络中的识别码,大部分情形下手机和网络之间的通信,会使用随机产生的临时移动用户识别码

复制代码
  IMSI是区别移动用户的标志,储存在SIM卡中。同样使用0~9的数字,它由MCC+MNC+MSIN三部分组成:
  
例如:460-02-7980097098
    MCC:移动国家码,三个数字,如中国为460
    MNC:移动网号,两个数字,中国移动:00,02,04,07,08,13
    MSIN:移动客户识别号
    
MSIN组成:CC+MOM1M2M3+ABCD
    CC由不同运营商分配,其中的MOM1M23和MDN号码中的HOH1H2H3可存在对应关系,ABCD四位为自由分配。

MNC:中国移动使用00(号段135 136 137 138 139)、02(150 151 152 134 158 159)
            中国移动TD系统(147 187 188 157号段)使用07
            中国联通使用01(131 132 155 156),03(133 134 180 153 189)
            
IMSI与IMEI权限相同,获取代码:
        //权限<uses-permissionandroid:name="android.permission. READ_PHONE_STATE" />
TelephonyManager telephonyManager=(TelephonyManager)context. getSystemService(Context.TELEPHONY SERVICE);
string imsi=telephonyManager.getSubscriberId();

三、MEID

CDMA移动终端识别码,双卡手机通常是两个IMEI一个MEID

c 复制代码
格式举例:A0-00005E-78C3E7
        99-001788-698930
      MEID由14个十六进制字符标识,第15位为校验位
      
RR-XXXXXXZZZZZZ-C
  RR:范围A0-FF   TIA组织进行分配管理的
  XXXXXX:范围000000-FFFFFF000000-FFFFFF,厂商分配给每台终端的流水号   
  C/CD:0-F,校验码

这些字段被定义为10进制时,有以下格式:
   RR  -  有效范围 99,98,97,全国统一管理
   XXXXXX  -  有效范围 000000--999999
   ZZZZZZ  -  有效范围 000000--999999
   C  -  有效范围 0 -- 9

四、ANDROID_ID

它是一串16禁制字符串,当设备不是手机的时候,例如平板设备,这个值也存在,但是在设备恢复出厂设置后,这个值会改变,不同的设备可能会产生相同的值

c 复制代码
import android.provider.Settings;
String ANDROID_id = Settings.system.getString(getContentResolver(),Settings.System.ANDROID_ID);

五、设备序列号

Serial Number 或SN,又叫产品序列号、机器码,由手机厂家自定义通常为不超过16位的16进制字符串

c 复制代码
示例: c3a1d2fe

APP通过 android.os.BuildgetSerial0 获取该值,也需要申请READ PHONESTATE权限:

private String get Serial() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.0) {
    }else {
       return Build.SERIAL;
       }
 }

六、MAC地址 && 蓝牙地址

c 复制代码
MAC地址格式:AA:BB:CC + DD:EE:FF
AA:BB:CC由IEEE组织注册给网络设备的生产商,每个厂商都拥有一个或多个
DD:EE:FF则是由网络设备生产商分配给自己生产的每个拥有MAC地址的设备,互不重复

APP获取该值,需要申请ACCESS WIFI STATE 权限
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager)context.getSystemService Context.WIFI SERVICE);
String mac Address = wifi.getConnectionInfo().getMacAddress();
Android 6.0之后,用此方法获取到的Wi-Fi mac地址都为02:00:00:00:00:00 已无效

替代方案是通过读取系统文件/sys/class/net/wlan0/address来获取mac地址
private String getMacAddress(){
    return new BufferedReader(new FileReader(new File("/sys/class/net/wlan0/address"))).readLine();
}  绝大多数情况下该方法也无法获取到MAC地址

目前通行的方式是遍历网络接口:
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
    if (!nif.getName () .equalsIgnoreCase("wlan0")) {
     continue;
     }
     byte[] macBytes = nif. getHardwareAddress () ;
     if(macBytes == null) {
    return "";
    }

蓝牙地址:
/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java
publicString getAddress(){
   try{
          return mManagerService.getAddress();
          } catch (RemoteException e) Log.e(TAG,"",e);}
          return null;
}

补充

除了MAC地址 && 蓝牙地址,还要另外的标识符,可以无视:

UUID,ICCID,OAID,GAID

视频教程

相关推荐
CoovallyAIHub3 小时前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing5 小时前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网7 小时前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱9 小时前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱9 小时前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub1 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub1 天前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github