macOS下libnfc 1.8.0寫卡失敗問題及解決方案
摘要
本文記錄了在mac下使用1.8.0版本的libnfc時寫卡失敗的問題,并給出了使用1.7.1版本libnfc的解決方案。本文同時在文末記錄了使用libnfc對NFC卡片進(jìn)行復(fù)制和編輯的操作步驟。
問題描述
最近筆者在折騰nfc相關(guān)的應(yīng)用,為此購入了一個型號為ACR122U的NFC讀寫卡器,但是在mac上使用libnfc進(jìn)行nfc寫操作時遇到了問題,具體表現(xiàn)為:當(dāng)某個扇區(qū)的密碼和原密碼不同時,該扇區(qū)實際寫入失敗,但是nfc-mfclassic指令并沒有報錯。
具體而言,使用mfoc指令讀入一張nfc白卡的數(shù)據(jù)為old.dump,其中某個扇區(qū)的key默認(rèn)是FFFFFFFFFFFF,如果我們把這個key改成0A1B2C3D4E5F,存儲為new.dump,然后使用nfc-mfclassic w a old.dump new.dump寫入,指令沒有報錯。但是如果這時候再使用mfoc去嘗試讀取卡片,就會發(fā)現(xiàn)那個扇區(qū)的key并沒有發(fā)生變化,也就是說,可以直接使用FFFFFFFFFFFF解密,這就說明寫入操作實際是失敗的。如果是復(fù)制門禁卡等場景,這一點還可以通過實際去刷這張寫入后的卡來驗證。
解決方案
參考了github上的這個 https://github.com/nfc-tools/libnfc/issues/684 issue之后,發(fā)現(xiàn)是libnfc的版本有問題。我們通過brew install mfoc安裝的libnfc是1.8.0版本的,issue里面有大佬指出可以通過切換到1.7.1版本的libnfc來解決此問題。
具體操作方式為:通過這個鏈接 https://github.com/nfc-tools/libnfc/files/12026826/libnfc-1.7.1.zip 下載1.7.1版本的源碼
然后運行./configure,sudo make && sudo make install
最后執(zhí)行nfc-list,查看當(dāng)前的版本,如果為1.7.1則表示安裝成功。
如果查看到的版本號仍然是1.8.0,則可能是homebrew安裝的libnfc在PATH里的優(yōu)先級比我們安裝的高,可以通過which nfc-list來查看nfc-list的目錄,如果是homebrew下的,則需要編輯~/.zshrc,在PATH環(huán)境變量后面加上PATH_TO_NFC_1_7_1/utils(其中PATH_TO_NFC_1_7_1就是你解壓的libnfc-1.7.1文件夾的絕對路徑)
添加完成之后執(zhí)行 source ~/.zshrc,然后再使用nfc-list查看版本號,此時應(yīng)該就會顯示版本號為1.7.1。
附:使用libnfc進(jìn)行NFC卡復(fù)制&編輯的操作流程
首先把需要復(fù)制的NFC卡放在讀卡器上,執(zhí)行mfoc -O target.dump,把舊卡數(shù)據(jù)dump下來。如果原卡是有加密的,則還需要進(jìn)行密碼破解的步驟,這里的具體原理不再贅述。
然后把新卡放在讀卡器上,執(zhí)行mfoc -O white.dump,這一步是為了獲取包含白卡密碼的dump,用于后續(xù)寫入。
最后執(zhí)行nfc-mfclassic w a target.dump white.dump即可把原卡的數(shù)據(jù)寫入新卡中,完成復(fù)制。如果是需要保留原卡ID的場景,則需要使用nfc-mfclassic W a u target.dump white.dump來覆寫第0扇區(qū)里的ID部分(僅部分NFC卡片支持此功能)。
如果需要修改卡內(nèi)容,只需要使用vim -b target.dump打開dump文件(注意,一定要使用-b參數(shù),如果只是用vim打開二進(jìn)制文件會導(dǎo)致vim對換行符進(jìn)行特殊處理,會影響后面轉(zhuǎn)文本和轉(zhuǎn)回二進(jìn)制)
然后輸入:%!xxd,將二進(jìn)制文件轉(zhuǎn)為文本文件,編輯中間的十六進(jìn)制數(shù)字區(qū)域,編輯完成后再使用:%!xxd -r將文本文件轉(zhuǎn)回二進(jìn)制,最后:wq保存。然后使用nfc-mfclassic w a target.dump key.dump寫入即可,這里的key.dump就是即將寫入的NFC卡的dump,里面包含的密碼會用于解鎖當(dāng)前要寫入的NFC卡。

浙公網(wǎng)安備 33010602011771號