用过二手手机的朋友可能都遇到过这种情况:明明看着配置不错,价格也合适,结果一查发现设备的机器码对不上。机器码就像是手机的身份证,一旦被篡改,背后很可能藏着猫腻。
机器码是什么?
每台手机出厂时都有唯一的标识信息,比如IMEI、MAC地址、序列号等,统称为机器码。这些码分布在系统底层,正常情况下不会变动。但有些不法商家会通过刷机手段伪造这些数据,让翻新机看起来像新机。
常见伪造手段有哪些?
最典型的套路是更换主板后重新写入IMEI,或者用特殊软件修改MAC地址。有的甚至能同步伪造多个硬件参数,普通用户一眼很难分辨。比如你在某平台下单一款旗舰机,收到后拨 *#06# 查IMEI,发现和包装盒上的不一致,基本就能确定有问题。
自己怎么查?
安卓用户可以进拨号界面输入 *#*#8255#*#* 或使用 ADB 命令查看底层信息。iOS 用户则可以通过“设置-通用-关于本机”核对序列号,并去苹果官网验证激活状态。如果显示已激活但购买的是全新机,那就有问题。
更进一步的方法是用第三方工具检测,比如用 adb shell service call iphonesubinfo 1 这类指令读取原始数据(需开启USB调试)。不过这类操作有一定门槛,普通用户容易误操作。
开发层面怎么防?
一些正规应用在登录或绑定设备时会采集多维度硬件指纹,不只是看单一机器码。比如同时读取蓝牙地址、Wi-Fi MAC、传感器列表、CPU型号等,生成一个综合哈希值。即使某个码被改了,整体指纹也会不匹配。
String getDeviceFingerprint(Context ctx) {
String imei = ((TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
String mac = "";
try {
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface intf : interfaces) {
if ("wlan0".equals(intf.getName())) {
byte[] macAddr = intf.getHardwareAddress();
if (macAddr != null) {
StringBuilder sb = new StringBuilder();
for (byte b : macAddr) sb.append(String.format("%02X:", b));
if (sb.length() > 0) sb.deleteCharAt(sb.length()-1);
mac = sb.toString();
}
break;
}
}
} catch (Exception e) { }
return DigestUtils.md5Hex(imei + "|" + mac + "|" + android.os.Build.SERIAL);
}
上面这段代码就是一种常见的组合式设备指纹生成方式。即使攻击者改了一个值,最终的指纹也会变,服务器端比对就能发现异常。
日常使用建议
买手机尽量走官方渠道,别贪便宜找代购或个人卖家。收货时当场核对机器码,别等到拆封用了几天才发现被坑。另外,安装应用时注意权限控制,别随便给悬浮窗、无障碍这类高危权限,防止恶意软件偷偷读取并篡改设备信息。
现在有些黑产团伙专门做机器码批量伪造,用来注册垃圾账号、刷单、薅羊毛。普通用户只要保持警惕,多查一步,基本都能避开这些坑。