使用Android 4.4模拟Mifare卡

问题描述 投票:31回答:4

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

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

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

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

谢谢。

android nfc rfid mifare hce
4个回答
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协议有三种变体: 本机协议:由于此协议不使用符合ISO / IEC 7816-4的APDU,因此无法使用Android HCE模拟它。 包装本机协议:此协议根据ISO / IEC 7816-4使用APDU,但是,当开始与包裹的本机命令模式中的卡通信时,读取器通常不会使用DESFire AID发出SELECT命令。 (注意:较新的阅读器实现更有可能发出与Android HCE兼容的SELECT命令,因为对于一些使用DESFire协议仿真的恩智浦较新的智能卡产品,这也是必需的。) ISO协议:该协议基于ISO / IEC 7816-4,并使用AID的应用选择。因此,可以使用Android HCE模拟该协议。 某些读者可能需要较低协议层中的某些参数值(例如特定的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-4的应用程序结构。您甚至可以选择是否要模拟A类或B类协议。所以应该可以(虽然我没有测试)模拟三种DESFire协议中的任何一种。但是,即使使用CyanogenMod的HCE功能,也无法模拟MIFARE Ultralight或Classic协议。此外,也不可能影响低级协议参数,例如UID,ATQA,SAK或ATS。


17
投票

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

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

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


4
投票

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

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


2
投票

简短的回答是肯定的。然而,取决于许多因素,如Android版本,手机的NFC芯片等。

要知道您的设备是否支持它,只需下载一些应用程序,如Tapkey的“NFC Check”,它将通知您是否支持MiFare Classic和Mifare Ultralight。还有一个最新的列表,但显然可能存在一些不匹配:https://www.shopnfc.com/en/content/7-nfc-compatibility

现在的问题是“如何”。我还没有找到一个应用程序来使用新的基于主机的卡仿真(HCE)用于此目的(见这里):How well does the Android NFC API support Mifare Desfire?

事实上,MiFare最近建议你应该使用“安全元素”方法:https://www.mifare.net/support/forum/topic/emulate-mifare-classic-1k/

回到你的Ultralight问题,主要的困难是Android API定义为今天在每个点击上发送一个随机UID,正如之前的用户nCypher所建议的那样:https://developer.android.com/guide/topics/connectivity/nfc/hce

作为替代根访问(或自定义cyanogen ROM)可能有助于修改UID,例如在此示例中:http://osgt7405i.bkt.clouddn.com/help/en/index.html?t=1536931682474

然而,最新的Android API直接引用了Ultralight对象:https://developer.android.com/reference/android/nfc/tech/MifareUltralight

我知道一些公司正在通过SIM存储模拟这一点。为了将您的手机用作这些MIFARE类型的RFID卡,MiFare已经制定了一个解决方案,业务可以在与运营商SIM相关联的云https://www.mifare4mobile.org/中加载卡。有一个官方认证的NFC芯片列表,其中大多数是NPX,广泛包含在智能手机中。

但是他们的解决方案是SDK API(即TapLinx)。恩智浦没有任何纯软件产品可用,如任何手机仿真软件或云基础解决方案。

更重要的是,MiFare论坛谈到了这个问题:https://www.mifare.net/support/forum/topic/creating-nfc-android-app-to-act-as-mifare-card-to-interact-with-mifare-readers/

© www.soinside.com 2019 - 2024. All rights reserved.