记录一下用PN532在手机上写入加密卡

 自从小米发布第一款手机开始,就一直用小米,都换了几部了,其中的NFC模拟门卡功能很好用,出门少带了不少零碎,小区门禁卡、幼儿园接送卡都成功的模拟之后写入手机上了。毛衣战以来,民族自豪感被激发了出来,看着小米的供应商列表,一水儿的米国货,想着以后再换手机,一定要买华为,一定要用麒麟芯片的,哪怕换其它品牌手机之后会造成各种使用上的不习惯。

疫情期间,窝在家里,不小心把小米手机摔坏了,下单了一款nova 5 pro,准备先进入华为的圈子试试水。生态系统的变化,除了语音不能控制米家,对使用基本没影响,没两天就完全适应了。反而窝居久了,几个月没有刷过门卡,突然拿着新手机去了一趟分矿,发现进不了门才意识到,手机没有门卡多么不便。

可是,几年前做过的流程已经很模糊了,再次操作怎么都是失败,相信绝不是华为的问题,应该是哪个关键环节自己遗忘了。最近几篇博客,都是笔记性质的,也许因为年纪大了,几年后再有换机场景时,来翻翻这篇日记,可以为自己节约不少研究的时间。

小区门禁卡也好、幼儿园接送卡也好,都是加密卡,用小米或华为钱包自带的模拟卡功能是无法成功模拟的,出于安全考虑,“钱包”只能模拟非加密卡,那么,这个功能基本就成了鸡肋了。本文就是记录如何将加密卡写入手机的过程,希望对有类似需求同好也能有所启发吧。下面言归正传。

马云家先准备好武器:PN532,买来时是散件,针脚未焊接,自己焊一下;usb to ttl 模块有现成的,玩51单片机时用过的,驱动也是安装好的;母母杜邦线准备一些,商家有的也会送。这些不表。CUID空白卡要顺便买几张,几毛钱一个的钥匙扣型卡,一并采购回来。一定要CUID卡,商家一般送的空白卡是UID的,这种卡是无法写入0扇区的。

接在电脑上,成功点亮,识别不到的话有可能是接收端发送端接错了,只要vcc和gnd没接错问题就不大。硬件没问题,就都是软件如何操作了,流程如下:

1、先把目标实体卡的数据给dump出来。PN532连接好之后,第一个按钮会显示对应的串口号,比如我的COM5,点第二个按钮,读整卡:破解KEYA和KEYB。

 用不了多久,数据就读取好了,点“扇区”二字左边的三角形,把数据另存成dump文件,方便日后随意克隆。上图中的分矿门禁卡,安全级别不高,主矿门禁卡还要根据你交的物管费,设定有效期,如果要克隆到手机上,就不能用dump文件,每年要更新一下(当然有更省事的方法,物管费虽然是不能省的,但卡的有效期写在哪个数据段,是可以钻研一下的。)。

2、将加密卡去掉密码,变为非加密卡。注意看上图中的第8行,即第1扇区的第3数据块,里面记录的就是密码,用十六进制编辑器把这行数据改成 FF FF FF FF FF FF FF 07 08 69 FF FF FF FF FF,即中间四位“FF 07 08 69”不动,将其它位全部置F。修改之后,另存一份破解版dump,修改好之后如下图。

 中间四位为“FF 07 08 69”的数据行,都是密码数据,如果有多行非F的数据,则每行都要改掉。比如主矿这张门禁卡,就比较麻烦。截图并不完整,没截到的数据中,每个密码行数据都要修改掉。 

3、将破解数据写入空白 CUID卡。点击第三个按钮的下拉选项,选“写整卡:写UID卡”选项,然后点击第三个按钮,选择要写入的dump文件,这里要选择破解过的那份dump文件,写入成功之后如下图,注意红框中的密码行都置F了。

4、用手机钱包的模拟门禁卡功能,模拟这张刚刚刷好的非加密卡。

这一步没什么好说的吧,只要刷好的是非加密卡,手机上就可以轻松地完成模拟。

5、写回加密数据。

手机上模拟成功的非加密卡,拿到外面是刷不过去的,还要把加密数据写回去,在第三个按钮的下拉选项中,选“写整卡:写普通IC卡”,这也是默认选项。这时把手机放在PN532附近,在手机钱包中调出刚刚模拟的那张非加密卡,使它处于刷卡状态,点击下图的第三个按钮,选中对应的原版dump文件,很快就可以写好。

6、实地测试。

最近在主矿自主隔离,很少去分矿,把主矿那种安全级别比较高的卡在华为手机上模拟成功了,进小区大门、进单元门一切顺利~~~~

最后,文中所用到的软件,都已经打包好在这里了,有需要请移步:https://download.csdn.net/download/xinew4712/12308920

 

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,这是一个较为复杂的问题,需要多个模块的协作。我将简要介绍一下实现的步骤。 步骤1:硬件连接 将PN532模块与C51单片机进行连接。PN532模块需要连接到单片机的串口,同时需要连接到单片机的SPI总线。M1需要连接到PN532模块的天线接口。 步骤2:编写PN532模块驱动程序 PN532模块需要通过驱动程序与单片机进行通信。可以采用SPI协议或者UART协议,这里我们以SPI协议为例。编写SPI总线的初始化函数、写数据函数和读数据函数。 步骤3:编写M1驱动程序 M1需要通过PN532模块进行读写操作。编写M1的初始化函数、读函数和写函数。 步骤4:编写主函数 在主函数中调用PN532模块和M1的驱动程序,实现向M1写入HelloWorld的功能。 下面是一个简单的代码示例: ```c #include <reg52.h> #include <stdio.h> #define PN532_CS_PIN P2_0 #define PN532_SPI_SCK P1_5 #define PN532_SPI_MISO P1_6 #define PN532_SPI_MOSI P1_7 #define M1_CARD_TYPE 0x04 #define M1_CARD_BLOCK 0x08 void spi_init() { //初始化SPI总线 } void spi_write(uint8_t data) { //写数据 } uint8_t spi_read() { //读数据 } void pn532_init() { //初始化PN532模块 } void pn532_write(uint8_t* data, uint8_t length) { //向PN532模块写数据 } void pn532_read(uint8_t* data, uint8_t length) { //从PN532模块读数据 } void m1_card_init() { //初始化M1 } uint8_t m1_card_read_block(uint8_t block, uint8_t* data) { //读M1块数据 } uint8_t m1_card_write_block(uint8_t block, uint8_t* data) { //写M1块数据 } void main() { uint8_t data[] = "HelloWorld"; uint8_t block_data[16]; //初始化SPI总线 spi_init(); //初始化PN532模块 pn532_init(); //初始化M1 m1_card_init(); //向M1写入数据 m1_card_write_block(M1_CARD_BLOCK, data); //从M1读取数据 m1_card_read_block(M1_CARD_BLOCK, block_data); //输出读取到的数据 printf("%s", block_data); } ``` 需要注意的是,代码中的SPI总线和串口通信的具体实现需要根据具体的硬件和驱动程序进行修改。此外,M1的读写操作需要遵循M1的协议规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值