百趣云 百趣云的博客

一键新机原理:Android ID、IMEI、MAC 的随机化与一致性

设备指纹:App 怎么认出"这台手机"

风控系统识别设备靠的不是单一标识,而是一组设备指纹的联合判定:

  • Android ID:系统级 ID,恢复出厂或 root 后可改
  • IMEI/MEID:基带芯片标识,Android 10+ 普通 App 已拿不到(返回 null 或抛异常)
  • MAC 地址:网卡标识,Android 6+ 官方接口返回 02:00:00:00:00:00
  • 硬件序列号:Android 10+ 同样需要特权权限
  • GAID(广告 ID):Google Play 服务的广告标识,用户可重置

"一键新机"的本质:把这一组标识全部随机化,让 App 以为这是一台新设备

各个标识的修改姿势

Android ID(最简单):

# root 后直接改系统数据库
settings put secure android_id $(openssl rand -hex 8)
# 或删了让它重新生成

App 读取走 Settings.Secure.getString(cr, "android_id"),Xposed hook 这个点也行。

IMEI(Android 10+ 的猫鼠游戏):

普通 App 调 getImei() 在 Android 10+ 直接抛 SecurityException。但风控 SDK 会尝试读,读不到本身也是特征。Xposed hook 返回伪造值:

XposedHelpers.findAndHookMethod("android.telephony.TelephonyManager", lpparam.classLoader,
    "getImei", int.class, new XC_MethodHook() {
        @Override protected void beforeHookedMethod(MethodHookParam param) {
            param.setResult(generateFakeImei((int) param.args[0]));
        }
    });

IMEI 有格式规范(15 位,末位是 Luhn 校验位),随机生成后要过 Luhn 校验,否则"格式非法的 IMEI"本身就是虚拟设备特征:

def luhn_check_digit(imei14):
    digits = [int(d) for d in imei14]
    total = 0
    for i, d in enumerate(digits):
        if i % 2 == 1:
            d *= 2
            if d > 9: d -= 9
        total += d
    return str((10 - total % 10) % 10)

MAC 地址:Android 6+ 官方接口已废,但风控会读 /sys/class/net/wlan0/addressNetworkInterface.getHardwareAddress()。root 后改文件内容或 hook 这两个读取点。

精髓一:一致性比随机性重要十倍

一键新机最容易翻车的地方:标识之间的一致性校验

  • IMEI 前 8 位是 TAC(型号核准码),35 开头是苹果、86 开头是国产机——你的 IMEI 的 TAC 必须和 build.prop 里的机型匹配
  • MAC 地址前 3 字节是 OUI(厂商标识),三星手机的 MAC 就该是三星的 OUI 段
  • Android ID 是随机 hex 没问题,但同一"设备"的多次启动它必须稳定——每次启动都变的 Android ID 是虚拟设备的强特征

所以新机生成的正确姿势是以真实机型档案为模板:选一款真实机型(如小米 13),把它的 TAC 段、OUI 段、build 指纹整套拿来做模板,只随机化序列号部分。

精髓二:持久化与"设备档案"管理

一键新机生成的标识必须持久化——App 会把设备标识上报绑定账号,下次启动标识变了,风控立刻判定"设备环境异常"。工程做法:

{
  "device_id": "dev_0001",
  "android_id": "a1b2c3d4e5f60708",
  "imei": "861234567890123",
  "mac": "8c:f5:a3:xx:xx:xx",
  "model": "Mi 13",
  "build_fingerprint": "Xiaomi/fuxi/fuxi:13/...",
  "created": "2026-08-01",
  "bound_accounts": ["account_a"]
}

每个虚拟设备一份档案,生成时写入,hook 层从档案读取返回,保证"这台设备"的所有标识永远一致。账号与设备档案绑定,不交叉使用。

精髓三:改机改不了的东西

有些指纹改机工具覆盖不到,是高级风控的杀手锏:

  • 电池健康度、充电循环次数:新"设备"的电池信息如果和系统报告的使用时长矛盾,露馅
  • 传感器校准数据:真实设备的陀螺仪有出厂校准值,全 0 是假机
  • 基带版本、内核编译时间:和机型官方发布信息对不上就是破绽

所以一键新机对付得了普通风控,对付不了顶级风控(微信、支付宝级别)。认清工具的能力边界。

总结

  1. 一键新机 = 设备指纹组的联合随机化,不是改一个 Android ID
  2. 标识间一致性(TAC-机型、OUI-品牌)是校验重点,以真实机型为模板
  3. 设备档案必须持久化,标识漂移是强风控特征
  4. 电池、传感器校准等深层指纹改不了,顶级风控防不住

交流微信:run1255

By 百趣云 阅读量:3 On