跳至主要內容

类原生系统上的Mifare Classic UID模拟

NaiveTomcat大约 2 分钟开发NFCAndroid

前言

最近更新了手机,由OnePlus Ace换成了Ace3,并且在收货后立刻刷入了PixelOS。在刷入过程中虽遇到了一些问题(见这里及之后几条open in new window,但最终成功刷入。使用过程中发现,类原生系统并无国产OEM系统的门禁卡模拟(即Mifare Classic卡的UID模拟)功能。本文记录了我在类原生系统上实现Mifare Classic卡UID模拟的过程。

基础知识

Mifare Classic卡

Mifare Classic卡是一种常见的非接触式IC卡,遵循ISO 14443标准,由NXP公司生产。其最大特点是卡片的UID(卡片唯一标识符)是固定且不可更改的。根据此,许多门禁系统使用卡片的UID作为卡片的唯一标识,因此门禁卡模拟的基本原理即是模拟卡片的UID。

Android NFC栈

Android系统支持NFC功能。对于本次的需求,我们主要关注Android NFC栈对于ISO 14443标准的支持。

自Android 4.4(API 19)起,Android系统提供了Host Card Emulation系列API支持Nfc-A (ISO/IEC 14443 type A)协议的卡模拟。但是,该功能的预期使用场景是通过该协议交换数据,且协议规定了HCE设备预期返回随机的UID。因此,我们无法通过HCE实现Mifare Classic卡的UID模拟。

然而Android系统的NFC栈底层仍然基于libnfc-nxp。因此获取root权限后,我们可以直接修改其配置文件实现Mifare Classic卡UID模拟。

实现过程

依赖条件

  • 具有Root权限的Android设备
  • 设备的/vendor/etc/libnfc-nxp.conf文件可读写

实现步骤

获取Root权限后,修改/vendor/etc/libnfc-nxp.conf文件。具体修改内容如下:

  • NXP_CORE_CONF
  • NXP_NFC_PROFILE_EXTN

具体修改内容为,修改NXP_CORE_CONF中的0x33, 0x00指令为相对应的设置UID的指令。根据官方文档,对于四字节UIDAB:CD:EF:01,设置指令为0x33, 0x04, 0xAB, 0xCD, 0xEF, 0x01;同时将上述指令追加至NXP_NFC_PROFILE_EXTN中。

修改完成后重启NFC服务,即可模拟写入的UID。

为方便模拟,参考了此项目open in new window及其修正了高版本Android权限问题的Forkopen in new window,并在其基础上进行了一些修改,见此处open in new window。得到了较为方便的图形化的可以保存多张卡的UID模拟工具。