我目前正在为我的大学课程开发一个项目,我希望能够编辑Android的HCE功能的功能,以便在模拟卡片时设置我自己的UID。
现在,我已经下载了AOSP源代码,并构建了一个没有编辑代码的自定义映像,并将其安装到我的Nexus 7(这包括下载并包含供应商特定的硬件驱动程序),并且我坚持下一个一部分。
我实际上无法找到管理Android NFC功能的设备代码,我不确定如何去寻找a)寻找它,以及b)我应该如何编辑这段代码。
Android中的NFC代码是否基于内核?如果是这样,在我再次运行“make”并希望它构建之前,我将如何编辑?还是在其他地方?我注意到我下载和提取的Vendor文件夹中的文件是.ncd格式,我认为这种格式不可编辑。
我将非常感谢你能得到的任何帮助。
答案 0 :(得分:14)
好的!所以我找到了解决我遇到的问题的方法!
在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}
要编辑在Emulation中生成的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
希望这有助于任何人阅读我的问题!
答案 1 :(得分:4)
Android的NFC堆栈基本上分为五个部分:
NFC接口设备驱动程序。这是内核的一部分。简而言之,该驱动器简单地在字符设备文件和NFC控制器硬件之间隧道传输数据帧(例如,NCI协议帧)。您不必为项目触摸该部分。
用C语言编写的低级接口库(libnfc-nci或libnfc-nxp用于具有恩智浦PN544 NFC控制器的设备)。该库提供了一组与NFC控制器交互的高级功能。因此,它基本上将高级功能(例如"开始轮询技术X,Y和Z")转换为通过内核驱动程序发送到NFC控制器的NCI命令。这肯定是您需要添加修改的地方。作为AOSP的一部分,您可以使用普通的AOSP构建系统进行编译。
用C ++(libnfc_nci_jni)编写的JNI接口库。该层将libnfc-nci C库与高级Java代码连接起来。如果您想从Android应用修改模拟的UID,这肯定是您需要添加修改的地方。作为AOSP的一部分,您可以使用普通的AOSP构建系统进行编译。
用Java编写的Android NFC system service。该服务控制整个NFC堆栈,并根据libnfc-nci提供的资源实现高级功能。如果您想从Android应用修改模拟的UID,这肯定是您需要添加修改的地方。作为AOSP的一部分,您可以使用普通的AOSP构建系统进行编译。
Android core framework为NFC系统服务的功能提供API,Android应用可以访问该功能。
关于设置/修改模拟的UID,你肯定想看看我最近在GitHub上发布的这些项目(尽管它们仍在进行中):