之前我一直使用ACR122U进行门禁卡的识别和读取工作,但是ACR122U的效率和能力有限。
最近正好需要用手机模拟小区的门禁卡,而使用ACR122U无法进行小区门禁卡的读取。因此,我决定换用一个能力更强的Proxmark3。
现在Proxmark3的价格也很便宜,我从咸鱼上购买,仅需200元就买到一个。
首先需要参照参考资料[1],编译Proxmark3最新版固件并进行刷机。
在这里,有下面几点需要注意:
- 必须关闭系统中的ModemManager,再进行固件的刷写操作。否则可能导致Proxmark3变砖。
- 使用pm3命令连接Proxmark3时,必须使用root权限的用户才能在Linux中访问串口。
我使用的Flash是512K的,因此不用担心内存不够的问题。但我采用的Proxmark3是Easy硬件版本,不是RDV4。所以需要在Makefile.platform
文件中加入一行PLATFORM=PM3GENERIC
。
刷写完毕后,执行./pm3
命令进行后续对Proxmark3的操作。
首先,使用auto
命令判断卡类型[2]。
接下来,可以使用hf mf autopwn
命令,让程序自动识别出加密M1卡的密码,并导出卡内的数据。
导出数据完成后,可以用hf mf restore
命令,并放置相同ID的IC卡在PM3上,让程序自动替你导出数据至新卡上。
但经我在小米手机和手环上的测试,这种方法无效。必须使用hf mf wrbl
依次对每一个数据块写卡才行。
根据参考资料[3],如果想要将卡复制到小米系列手机上,主要有以下的步骤:
- 使用
hf mf csetblk
命令将原来的ID卡号写入一张空白的UID卡,此时UID卡上除了卡号没有存储任何数据。 - 利用小米手机读取明文存储的UID卡,并模拟原卡。开通完成后,此时的NFC卡除了卡号也没有存储任何数据。为什么不直接用手机读取加密的原卡呢?因为手机不知道加密的密码,无法读取加密的卡。
- 使用Proxmark3将Dump文件写入小米手机上对应的卡。此时,加密的数据和密钥一并写入到卡中。
在我的测试中,hf mf restore
命令对于小米的手机手环都不管用,因此我专门写了一个脚本,将前面提到的过程用一个脚本生成出来。我们只需要将脚本生成的命令粘贴到pm3
命令行中即可。
# 新卡的默认密码,6字节十六进制表示
DEFAULT_PASSWORD = "FFFFFFFFFFFF"
# hf-mf-00000000-dump.eml是卡内容的16进制ASCII表示,其中00000000用卡号替换
with open('hf-mf-00000000-dump.eml', 'r') as f:
card_content = f.read()
card_arr = card_content.split()
# 设置UID卡的卡号
print(f"hf mf csetblk --blk 0 -d {card_arr[0]}")
print()
# 对于每一个数据块,生成相应的写入指令
for i in range(16):
pass_blk = DEFAULT_PASSWORD
for j in range(4):
cur_blk = i * 4 + j
print(f"hf mf wrbl --blk {cur_blk} -d {card_arr[cur_blk]} -k {pass_blk}")
参考资料:
[1] 在Linux系统下编译和使用proxmark3最新版固件教程 http://pm3.echo.cool/index.php/2020/05/13/%e5%9c%a8linux%e7%b3%bb%e7%bb%9f%e4%b8%8b%e7%bc%96%e8%af%91%e5%92%8c%e4%bd%bf%e7%94%a8proxmark3%e6%9c%80%e6%96%b0%e7%89%88%e5%9b%ba%e4%bb%b6%e6%95%99%e7%a8%8b/
[2] Promark3 原版固件使用指南 http://pm3.echo.cool/index.php/2020/04/21/promark3-%E5%8E%9F%E7%89%88%E5%9B%BA%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/
[3] NFC手机模拟加密门禁卡 https://hceng.cn/2019/07/12/NFC%E6%89%8B%E6%9C%BA%E6%A8%A1%E6%8B%9F%E5%8A%A0%E5%AF%86%E9%97%A8%E7%A6%81%E5%8D%A1/