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

系列文章目录

第一章 安卓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

视频教程

相关推荐
科技大视界16 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴16 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe16 小时前
算法滑动窗口
数据结构·算法
怪兽学LLM16 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
可编程芯片开发16 小时前
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
算法
酿情师16 小时前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法
hansang_IR17 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法
退休倒计时17 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
不是az17 小时前
力控相关知识点
算法·机器学习·最小二乘法
战血石LoveYY18 小时前
Integer类型超限,导致数据异常
java·算法