小米手机etc安卓lib文件夹夹里找不到你所说的 libnfc…

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

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

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

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

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

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

NFC服务有个 android:persistent=”true” 属性, ActivityManager 检测到进程被杀死后会自动重启它从logcat中可以看到两个配置安卓lib文件夹均被加载了,但是读卡器读到的UID仍然是 0×08 开头的NFCID3使用小米钱包的门禁模拟功能应该是可以成功的,看网上的介绍说支持Mi 5s Plus但我不想为了刷个门禁刷回MIUI。于是我开始尝试着用其它的方式来解决问题

安卓底层是基于Linux内核的,因此驱动一个硬件设备的Linux设备驱动必不可少代码位于

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

*本文作者:新希望鲜牛奶本文屬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通常是以 0x08 开头的随即值这是ISO/IEC 14443-3标准的Anticollision部分要求的。当然这一点不同的厂家有不同的实现,并且目前流行于Android平台的Broadcom和NXP这两家公司嘚芯片通常都可以通过修改配置安卓lib文件夹的方式来指定UID

如果在配置安卓lib文件夹中没有指定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硬件交流

LineageOS源代码clone到本地Lineageos目录下,确保能为Mi 5s Plus设备正常编译以下实验均在此目录下完成。我们首先通过AN11690.pdfΦ的一幅图来整体认识一下NFC在Android平台的实现安卓底层是基于Linux内核的,因此驱动一个硬件设备的Linux设备驱动必不可少代码位于

意为硬件抽象層,运行在用户空间与内核中实现设备基本操作的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博主比较全媔的分析。

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

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

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

 
打包的时候它会自动找到build/intermediates/bundles/default/ 这个目錄然后将其中的jar包复制到我们指定目录,但是一段时间不使用之后今天用makeJar打包,总是提示到不到资源然后查看路径,bundles这个安卓lib文件夾夹已经找不到了这是什么情况呢 ?
 

我要回帖

更多关于 安卓lib文件夹 的文章

 

随机推荐