安卓中主机卡模拟的编辑功能

17

我目前在为我的大学课程开发项目,希望编辑 Android 的 HCE 功能,以便在模拟卡时设置自己的 UID。

现在,我已经下载了 AOSP 源代码,并构建了一个没有编辑过的自定义映像,并将其安装到我的 Nexus 7 上(这包括下载和包含特定于厂商的硬件驱动程序),但我卡在了下一步。

我无法找到管理 Android NFC 功能的设备代码,也不确定应该如何进行以下操作:a)寻找代码,b)应该如何编辑此代码。

Android 中 NFC 的代码是否在基础内核中?如果是,那么在再次运行“make”之前,我应该如何编辑它并希望它构建成功呢?还是说代码存储在其他地方?我注意到已下载和提取的 Vendor 文件夹中的文件以 .ncd 格式存储,似乎无法编辑。

如果有任何帮助,将不胜感激。


在模拟卡时,设置自己的UID。我一直在寻找一个好的“卡模拟器”,但一直没有找到有用的东西。你正在使用哪个应用程序来模拟卡? - Alexandre T.
2个回答

16

好的!所以我找到了解决我遇到的问题的方法!

在Nexus 7上,当NFC打开时,它会从"/etc/"中的一个名为"libnfc-brcm-20791b05.conf"的配置文件中获取其信息。

在这个文件中有一个叫做"NFA_DM_START_UP_CFG"的参数。

默认情况下,它是这样的:

NFA_DM_START_UP_CFG={42:CB:01:01:A5:01:01:CA:14:00:00:00:00:0E:C0:D4:01:00:0F:00:00:00:00:C0:C6:2D:00:14:0A:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:01:C8}

要编辑在仿真中生成的UID,您需要向该参数添加一些字节。

您要添加的第一个字节是0x33(这意味着您将手动设置UID)。

添加的第二个字节是您要设置的UID的长度(可以为4、7或10个字节,因此第二个字节可以为0x04、0x07或0x0A)。

接下来的字节就是您要设置的ID!(注意:根据您添加的字节数,您应该更改数组的第一个字节以反映数组的新大小 - 它从42开始,因此如果您要添加6个字节,它应该变成48)

例如,如果您希望设置一个由01 02 03 04 05 06 07组成的7字节ID,则新的配置行将如下所示:

NFA_DM_START_UP_CFG={4B:CB:01:01:A5:01:01:CA:14:00:00:00:00:0E:C0:D4:01:00:0F:00:00:00:00:C0:C6:2D:00:14:0A:B5:03:01:02:FF:80:01:01:C9:03:03:0F:AB:5B:01:00:B2:04:E8:03:00:00:CF:02:02:08:B1:06:00:20:00:00:00:12:C2:02:01:C8:33:07:01:02:03:04:05:06:07}

然后,您可以使用adb将此配置文件推送到您的nexus设备:

-> adb root
-> adb remount
-> adb push libnfc-brcm-20791b05.conf /etc/
-> adb reboot

这将使用新的配置文件重置Nexus,并在仿真时将UID设置为01 02 03 04 05 06 07。

希望这能帮助任何阅读我的问题的人!


嗨,我尝试在libnfc-brcm.conf文件中修复我的OnePlus One的UID,但似乎不起作用... :( 你有关于OnePlus正确配置的任何想法吗? - Spawnrider
安卓系统能够使用卡模拟技术实现这个功能吗? - muyiou

8

Android的NFC堆栈基本上分为五个部分:

  • NFC接口设备驱动程序。这是内核的一部分。简而言之,该驱动程序仅在字符设备文件和NFC控制器硬件之间隧道传输数据帧(例如NCI协议帧)。您不需要为您的项目触及该部分。

  • 用C编写的低级接口库(libnfc-nci,或者libnfc-nxp适用于搭载NXP的PN544 NFC控制器的设备)。该库提供了一组高级函数来与NFC控制器交互。因此,它基本上将高级功能(例如“开始轮询X、Y和Z技术”)转换为通过内核驱动程序发送到NFC控制器的NCI命令。这肯定是您需要添加修改的地方。由于它是AOSP的一部分,您可以使用正常的AOSP构建系统进行编译。

  • 用C++编写的JNI接口库(libnfc_nci_jni)。此层将libnfc-nci C库与高级Java代码连接起来。如果您想要从Android应用程序修改模拟UID,则这肯定是您需要添加修改的地方。由于它是AOSP的一部分,您可以使用正常的AOSP构建系统进行编译。

  • 用Java编写的Android NFC系统服务。此服务控制整个NFC堆栈,并基于libnfc-nci提供的资源实现高级功能。如果您想要从Android应用程序修改模拟UID,则这肯定是您需要添加修改的地方。由于它是AOSP的一部分,您可以使用正常的AOSP构建系统进行编译。

  • Android 核心框架提供了一个API,可让Android应用程序访问NFC系统服务的功能。

关于设置/修改模拟UID,您肯定会想要查看我最近在GitHub上发布的这些项目(尽管它们仍在进行中):


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