使用Android 4.4模拟Mifare卡

42

我研究了Mifare和其他卡模拟技术,对编程有非常好的了解(不是Android,而是C/C++)。我有proxmark,并为proxmark制作了多个仿真代码,因此我知道卡片如何通信。

目前我不明白的是,安卓是否启用了完全的卡模拟。我已经研究了大约3天,得出的结论是没有一个固定的模式。有些人说可能可以,有些人说不行。我查看了安卓API和基于主机的卡模拟似乎可以做到这一点,但据我所知,这是4.4 Kitkat中的新功能,有没有人有相关经验呢?

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

那么,有没有人了解在安卓上的卡模拟。也许不使用原生操作系统。任何值得知道的东西都会非常感激。

谢谢。


我认为目前很难找到某个人,因为Android 4.4更新尚未针对所有Nexus设备推出。 - rekire
好的,如果我问理论上基于主机的卡模拟应该能行吗?对我来说似乎应该可以,但我在安卓方面没有经验。我想知道的是是否可以模拟UID和内容? - user2570174
我也有困难理解Android内部如何处理NFC,特别是替代的NDEF记录。不过你是否阅读了文档 - rekire
是的,我看过了,但是像我说的,我在安卓方面经验很少。所以我只能把它当作理论来看待。文档说明UID应该被视为随机的。但是对于Mifare UL,页面0-3存储UID,那么UID仅在防冲突时是随机的,还是页面0-3也是静态的?因为读卡器通常不会从防冲突中提取UID,而是直接读取它们。 - user2570174
4个回答

61

在 Android 4.4 中使用基于主机的卡模拟(HCE),只能模拟 ISO/IEC 14443-4 协议。更具体地说,只能模拟 ISO/IEC 7816-4 的应用程序结构(因此需要通过 AID 选择卡模拟应用程序)。此外,API 不提供任何手段来指定是使用 Type A 还是 Type 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 命令,因为这也适用于一些 NXP 的新型智能卡产品,其具有 DESFire 协议仿真。)
    3. ISO 协议:该协议基于 ISO/IEC 7816-4,并使用 AID 进行应用程序选择。因此,可能可以使用 Android HCE 模拟此协议。

    一些读者可能需要在较低的协议层(例如特定的UID级联级别、特定的ATQA值、特定的SAK值或特定的ATS)中设置某些参数值。Android HCE没有任何方法来设置这些值。有关在某些已root设备上修改这些值的可能方法,请参见Editing Functionality of Host Card Emulation in Android,以了解如何修改那些值,并参见my answer to Host-based Card Emulation with Fixed Card ID,以了解在自定义ROM中编程更改这些值的策略。

关于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。


你知道MIFARE DESFire EV1或DESFIRE SAM是否也被支持吗? - lujop
1
关于DESFire的答案同样适用于DESFire EV1。我没有关于DESFire SAM的信息,但是在我看来模拟一个SAM并没有太多意义,因为使用SAM的整个重点在于专用硬件模块的安全性。 - Michael Roland
2
你能否发布一下关于CyanogenMod中HCE功能的源代码? - Greeny
嗨,好答案!那么我们可以使用Android代码中的默认/标准HCE在智能手机上模拟Mifare Ultralight卡吗? - Marco Sanfilippo
3
@MarcoSanfilippo你看到这个答案了吗?特别是这两句话:“MIFARE Ultralight(以及其衍生版本)协议建立在ISO/IEC 14443-3之上。在Android HCE中无法使用如此低层协议来模拟卡片。” - Michael Roland

22

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

我已经成功地使用android_external_libnfc-nxp库中的隐藏函数完全模拟了Mifare Classic卡。虽然我只能读取卡片,但要使其有用,您需要访问Secure Element,在大多数情况下,NXP存在一个小应用程序,作为管理模拟卡的前端。

继续这项研究的好方法是通过反向工程谷歌钱包应用程序。


1
是的,这里有一些很好的解释:http://nelenkov.blogspot.fr/2012/08/exploring-google-wallet-using-secure.html我目前正在尝试模拟一个标签,并通过公司密钥编写器使其可写。 - Michele

7
短答案是。然而,这取决于许多因素,如Android版本、手机的NFC芯片等。要知道您的设备是否支持它,只需下载一些应用程序,例如Tapkey的“NFC Check”,它会告诉您是否支持MiFare Classic和Mifare Ultralight。也有一个最新的列表,但显然可能存在一些不匹配:https://www.shopnfc.com/en/content/7-nfc-compatibility现在的问题是“如何”。我还没有找到一款应用程序来使用新的Android基于主机的卡模拟(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

作为替代方案,root访问(或自定义的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)。NXP没有纯软件产品可用,例如任何电话仿真软件或基于云的解决方案。
此外,MiFare论坛也提到了这一点: https://www.mifare.net/support/forum/topic/creating-nfc-android-app-to-act-as-mifare-card-to-interact-with-mifare-readers/

4
MIFARE Ultralight芯片MF0ICU1(每个16页x 4字节)确实令人头疼,但无法在任何NXP接口上进行仿真,包括PN53x,因为他们将第一个UID字节(UID0)硬连到了0x08,这意味着标签具有随机的UID(根据NXP标准)。您需要UID0 = 0x04来模拟MIFARE Ultralight。
存在一款独立的MIFARE Ultralight仿真器,允许任何值用于UID0,具有可重置OTP、锁定和块锁定位。有关更多信息,请参见手册。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接