Android 中主机卡仿真的编辑功能

Editing Functionality of Host Card Emulation in Android

我目前正在为我的大学课程开发一个项目,我希望在其中编辑 Android 的 HCE 功能的功能,以允许我在模拟卡时设置自己的 UID .

现在,我已经下载了 AOSP 源代码,并构建了一个没有编辑代码的自定义图像并将其安装到我的 Nexus 7(这包括下载并包含供应商特定的硬件驱动程序),我坚持下一部分。

我找不到管理 Android 的 NFC 功能的设备代码,我不确定如何着手 a) 寻找它,以及 b) 我应该如何编辑此代码。

Android 中的 NFC 代码是在基础内核中吗?如果是这样,在我再次 运行 "make" 并希望它建立之前我将如何编辑它?还是在别处?我注意到我下载和提取的 Vendor 文件夹中的文件是 .ncd 格式,我认为这是不可编辑的。

我将不胜感激任何对此的帮助。

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

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

  • 用 C 编写的低级接口库(libnfc-nci, or libnfc-nxp 用于带有 NXP 的 PN544 NFC 控制器的设备)。该库提供了一组与 NFC 控制器交互的高级函数。所以它基本上将高级功能(例如 "start polling for technologies X, Y and Z")转换为 NCI 命令,这些命令通过内核驱动程序发送到 NFC 控制器。这当然是您需要添加修改的地方。由于它是 AOSP 的一部分,您可以使用普通的 AOSP 构建系统编译它。

  • 用C++编写的JNI接口库(libnfc_nci_jni)。该层将 libnfc-nci C 库与高级 Java 代码连接起来。如果你想修改来自 Android 个应用程序的模拟 UID,这当然是你需要添加修改的地方。由于它是 AOSP 的一部分,您可以使用普通的 AOSP 构建系统编译它。

  • 将Android写成NFC system serviceJava。该服务控制整个 NFC 堆栈,并根据 libnfc-nci 提供的资源实现高级功能。如果你想修改来自 Android 个应用程序的模拟 UID,这当然是你需要添加修改的地方。由于它是 AOSP 的一部分,您可以使用普通的 AOSP 构建系统编译它。

  • Android core framework 提供 API 的 NFC 系统服务功能,Android 应用程序可以访问该功能。

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

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

在 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)

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

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

希望这对阅读我的问题的人有所帮助!