使用Android 4.4模拟Mifare卡

时间:2013-11-18 18:51:10

标签: android nfc rfid mifare hce

我研究过Mifare和其他卡片仿真我对编程非常了解(不是Android,而是C / C ++)。我有proxmark,我为proxmark制作了多个仿真代码,所以我知道这些卡是如何通信的。

我目前不明白,android是否支持全卡模拟。 我已经研究了这个约3天了,结论是没有一个恒定的模式。有人说这是可能的,有人说不是。我查看了android API,基于主机的卡仿真似乎能够做到这一点,但据我所知,这是4.4 Kitkat的新功能,有没有人有这方面的经验?

为了简单起见,目前我正在调查Mifare Ultralight最简单的基本模拟。这张卡是一个安全噩梦,没有加密,只有大约10个功能。所以我有兴趣用这张卡开始研究,因为它是最容易复制的。

所以有人对android上的卡片仿真有任何了解。也许不使用股票操作系统。任何值得了解的事情都会非常感激。

感谢。

3 个答案:

答案 0 :(得分:51)

在Android 4.4中使用基于主机的卡仿真(HCE),您只能模拟ISO / IEC 14443-4协议。更具体地说,您只能根据ISO / IEC 7816-4模拟应用程序结构(因此需要通过AID选择卡仿真应用程序)。此外,API不会为您提供任何方法来指定是否应使用A类或B类协议进行卡仿真。

关于各种MIFARE协议的仿真:

  • MIFARE Ultralight (和衍生物)协议在ISO / IEC 14443-3之上运行。使用Android HCE使用这种低层协议模拟卡是不可能的。
  • MIFARE Classic 协议部分在ISO / IEC 14443-3之上运行(具有一些不同的框架)。因此,它也无法使用Android HCE模拟MIFARE Classic。
  • MIFARE DESFire 协议在ISO / IEC 14443-4之上运行。 DESFire协议有三种变体:

    1. 原生协议:由于此协议不使用符合ISO / IEC 7816-4的APDU,因此无法使用Android HCE模拟它。
    2. 包装本机协议:此协议根据ISO / IEC 7816-4使用APDU,但是,当开始与包装中的卡通信时,读者通常不会使用DESFire AID发出SELECT命令本机命令模式。 (注意:较新的阅读器实现更有可能发出与Android HCE兼容的SELECT命令,因为对于一些使用DESFire协议仿真的恩智浦较新的智能卡产品,这也是必需的。)
    3. ISO协议:该协议基于ISO / IEC 7816-4,并使用AID选择应用程序。因此,可以使用Android HCE模拟此协议。
    4. 某些读者可能需要较低协议层中的某些参数值(例如特定的UID级联级别,某个ATQA值,某个SAK值或某个ATS)。 Android HCE没有任何设置这些值的方法。有关在某些有根设备上修改这些值的可能方法,请参阅Editing Functionality of Host Card Emulation in Android;有关在自定义ROM中以编程方式更改这些值的策略,请参阅my answer to Host-based Card Emulation with Fixed Card ID

CyanogenMod 中从版本9.1到版本10.2的HCE功能的注释:这将模拟任何基于ISO / IEC 14443-4的协议,而不需要符合ISO / IEC的应用程序结构7816。您甚至可以选择是否要模拟A类或B类协议。所以应该可以(虽然我没有测试)模拟三种DESFire协议中的任何一种。但是,即使使用CyanogenMod的HCE功能,也无法模拟MIFARE Ultralight或Classic协议。此外,它也不可能影响低级协议参数,如UID,ATQA,SAK或ATS。

答案 1 :(得分:17)

一年前我花了几周时间研究这个话题,基于当前实施的结论是: MIFARE Classic的仿真是可能的,但只有通过嵌入式安全元件,这个元素嵌入在恩智浦的NFC芯片(内置的三星I9300的PN65芯片)中。

我已经能够使用android_external_libnfc-nxp库中的隐藏函数完全模拟Mifare Classic卡。虽然我只能读取该卡并且它有用,但您需要访问安全元素,其中大多数情况下NXP的applet存在,此applet服务器作为管理模拟卡的前端。

继续此搜索的一个好方法是通过逆向工程Google的钱包应用程序。

答案 2 :(得分:4)

MIFARE Ultralight芯片MF0ICU1(每页16页x 4个字节)确实是一场噩梦,但无法在包括PN53x在内的任何NXP接口上进行仿真,因为它们硬连线了第一个UID字节(UID0)至0x08,这意味着该标记具有随机UID(根据恩智浦标准)。您需要UID0 = 0x04来模拟MIFARE Ultralight。

存在standalone MIFARE Ultralight emulator,它允许UID0的任何值,具有可重置的OTP,锁定和块锁定位。有关详细信息,请参阅手册。