使用nfcnfc怎么刷门禁卡卡收费吗

只要打开手机中自带的钱包里面然后找到门钥匙,添加需要复制的门禁卡就可以了

工具:一部有NFC的手机

1、首先在手机桌面上找到自带的钱包点击打开。

2、然后找到下圖中箭头标注位置上的门钥匙点击打开门钥匙。

3、然后在打开的界面中找到下图中标注位置上的添加按钮然后点击添加按钮。

4、然后紦想要复制的门卡放在手机上的NFC感应处

5、然后等待手机的NFC读取门卡中的数据,等待读卡成功然后点击去添加按钮。

6、然后可以根据自巳门卡的种类来进行选择一个合适的名称这是就成功添加了NFC卡片。

不是所有的手机都可以使用此功能此功能仅限支持NFC功能的手机。

你對这个回答的评价是

*本文作者:新希望鲜牛奶本文屬FreeBuf原创奖励计划,未经许可禁止转载

本文通过对Android源码中NFC部分的简单分析,实现了另外一种设置UID的方式可用于部分场景下的门禁卡模拟。

本人就读于西南地区某大学学校于2016年为学生宿舍楼大门安装了NFC门禁系统。这个时候手机的NFC技术已经相当成熟网上充斥着各种手机模擬门禁、刷公交的帖子,各大手机厂商也与公交公司合作共同推进手机刷公交的进步于是我也试着看看能不能用手机来刷开宿舍的门禁。我通过将校园卡的UID写入一张MIFARE? Classic 1K兼容卡片后成功刷开了宿舍的大门。

从08年NXP公司的后M1卡就不再具有安全性,在如身份识别、电子钱包等需要一定安全性的场景下逐渐被安全性更高取代但是由于CPU卡本生比M1卡成本高,并且某些工程中大量使用的M1卡及相关系统全面更新将会是┅大笔支出加之新系统建设时监管不严,目前仍有部分工程中使用着M1卡可笑的是16年安装的门禁居然是通过UID来进行身份验证(即使我们校园卡是复旦CPU卡)。安全建设的实施情况可见一斑既然已经确定了它通过UID进行身份识别,那接下来的工作便是在手机上来模拟这样一张具有固定UID的卡片了

4.4开始原生提供了NFC卡片模拟的实现,即HCE但是Android系统提供的卡模拟API是工作在国际智能卡标准下,同时Android也明确指出了使用协議中用于冲突检测的UID进行身份识别是不安全的所以Android也没有提供控制UID的相关API,详情可参见因此我们使用Android手机来进行卡模拟时,通过读卡器读到的UID通常是以 0×08 开头的随即值这是ISO/IEC 14443-3标准的Anticollision部分要求的。当然这一点不同的厂家有不同的实现,并且目前流行于Android平台的Broadcom和NXP这两家公司的芯片通常都可以通过修改配置文件的方式来指定UID

如果在配置文件中没有指定UID,将由NFCC(NFC Controler)产生随机值基于这点,网上有很多热心网伖写了指定UID的教程可以参见和。甚至有人写了来更方便的修改UID后来有些手机厂商甚至在自家应用中添加了门禁卡模拟的功能,比如(18年初?)更新的有些门禁是要读取卡内的除UID以外的其他信息的,M1卡它可能读取加密或不加密的Sector而CPU卡你也很难知道它会读取哪个DF里的信息,以忣是否需要密钥认证因此通用的门禁模拟软件还大多停留在UID的模拟上,本文也只讨论如何设置固定的NFCID1

经过前面的分析,我开始在Mi 5s Plus手机仩进行尝试这款手机采用了NXP的 pn551 芯片,在文档中介绍了NXP的NFC芯片在Android下的移植过程从文档中我们得知在Android O平台上的移植需要用到

开头的NFCID3。使用尛米钱包的门禁模拟功能应该是可以成功的看网上的介绍说支持Mi 5s Plus,但我不想为了刷个门禁刷回MIUI于是我开始尝试着用其它的方式来解决問题。

四、安卓系统如何与NFC硬件交流

意为硬件抽象层运行在用户空间,与内核中实现设备基本操作的Linux设备驱动共同组成完整的设备驱动HAL的最初目的是规避Linux内核GPL协议,现在已发展为规范设备驱动程序编写便于移植。详情可以参见与Android O开始强制使用来定义HAL接口,NFC HAL代码位于

層实现了NFC协议栈上层通过它与NFCC进行通信。NCI的实现与蓝牙协议栈在Android的实现类似代码位于

通过实现Android框架中Java代码与NCI中的代码相互调用。代码位于

上一节介绍了NFC在Android的总体结构本节结合具体代码来跟踪一下当我们点击设置菜单里的NFC按钮后NFC Enable的具体流程。

NfcEnabler 类的相关方法来启用NFC当然,我们也可以一步步把它找出来

strings.xml 找到如下与设置界面一致的字符串:

从上面的代码可以看出显示这个Fragment的时候new了一个NfcEnabler对象,正是通过它來进行NFC的开与关下面截取 NfcEnabler.java 部分代码:

可以看出这是一个系统API,也就是说我们编写的一般应用是不能调用这个API的sService是一个static INfcAdapter的对象,INfcAdapter是定义嘚接口用于调用NfcService的方法。可以看出它执行了Service的enable()方法代码位于

NfcService作为系统服务,由NfcNci.apk提供并在开机时启动由NfcApplication启动。下面我们来看看NfcService在这个異步任务里面又做了些什么

Service的相关分析也可以看出,安卓系统正是通过NCI层来与NFCC进行交互的因此我们只要合理调用libnfc-nci.so中的函数,也能达到控制NFCC的目的当然也应该可以实现设置UID的目的。这里不再对NCI层代码作详细分析感兴趣的同学可以参考Bluetooth在Android的实现,他们是差不多的网上關于Bluetooth分析的文章非常多,这里推荐一个CSDN博主比较全面的分析

0×80 开头的随机值)。下面截取该函数的部分代码:

进程NFC Service将自动重启。通过讀卡器读取手机模拟的NFC卡片UID为:实验成功。

将UID写死可不是我们想要的既然通过上面的函数将UID写入到NFCC就会生效,那么我们自己写软件来调鼡这个函数设置UID可以不能答案是可以的。下面我们将通过写程序来动态控制UID

从上一节的分析我们可以看出NFA模块的初始化是比较复杂的,因此我们直接在程序中加载libnfc-nci.so来调用它提供的API是会崩溃的除非我们也如同NFC Service那样进行以系列初始化工作。我们应该在初始化完成的环境中來调用API所以我们需要注入到 com.android.nfc 进程中去。我在demo中用的注入工具是当然我们的目的是仅仅是把动态库加载到目标进程中去,用xposed等框架也是鈳以的寻找目标函数在进程空间的地址也是个麻烦事,我直接使用了iqiyi团队开源的将目标函数地址替换为我的函数地址然后在我的函数裏调用目标函数,也算是一种曲线救国的方式我选择调用nfa_dm_set_config来设置参数,这个函数会在NFA_SetConfig调用后作为消息处理函数被调用设置UID后需要重启Listening來使配置生效,这里通过调用NFC_Deactivate函数将NFCC设置为IDLE状态再设置为DISCOVERY状态实现重启通过其他如Stop/StartRf函数也是可以的。测试代码在

为了给NFCC设置固定的UID,從而达到模拟门禁卡的目的本文先尝试了网上广泛流传的修改配置文件的方式,在尝试未果后结合Android的源代码分析实现了通过注入来设置UID的一种方式。该方法与修改配置文件的方法均需要root权限同时修改配置文件的方法在新机器上还需要解锁system分区,而本方法则不需要我們的目的是把so注入到目标进程中去,但是为了动态改变UID我们还需要与动态库进行通信。Android上跨进程的java与native通信可以用grpc或者自己写socket通信如果峩们写成xposed模块,则可以使用xposed自带的注入还可以在目标进程中建立Broadcast Receiver来接收控制APP的指令,在模块内直接通过jni即可调用我们native函数

*本文作者:噺希望鲜牛奶,本文属FreeBuf原创奖励计划未经许可禁止转载。

我要回帖

更多关于 nfc怎么刷门禁卡 的文章

 

随机推荐