设备指纹: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/address 或 NetworkInterface.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 是假机
- 基带版本、内核编译时间:和机型官方发布信息对不上就是破绽
所以一键新机对付得了普通风控,对付不了顶级风控(微信、支付宝级别)。认清工具的能力边界。
总结
- 一键新机 = 设备指纹组的联合随机化,不是改一个 Android ID
- 标识间一致性(TAC-机型、OUI-品牌)是校验重点,以真实机型为模板
- 设备档案必须持久化,标识漂移是强风控特征
- 电池、传感器校准等深层指纹改不了,顶级风控防不住
交流微信:run1255