在一些安全性比較低的門禁系統中,有時候只會讀取 RFID 卡片的卡號,然後根據卡號來決定是否開啟門禁,現在讓我們來嘗試模擬及拷貝 M1 卡的卡號吧。
變色龍主打的功能就是模擬 RFID 卡片,變色龍裡面可以儲存八張高頻卡與八張低頻卡,透過按鈕就可以切換卡片。
使用以下的程式碼,把之前掃描到的 M1 卡片的卡號透過變色龍模擬:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
// 載入需要的常數
const { Buffer, DeviceMode, FreqType, Mf1EmuWriteMode, Slot, TagType } = await import('https://cdn.jsdelivr.net/npm/chameleon-ultra.js@0/+esm')
const slot = Slot.SLOT_1 // 使用卡槽 1
await ultra.cmdSlotChangeTagType(slot, TagType.MIFARE_1024) // 設定卡槽為 M1 卡片類型
await ultra.cmdSlotResetTagType(slot, TagType.MIFARE_1024) // 重設卡槽資料
await ultra.cmdSlotSetEnable(slot, FreqType.HF, true) // 啟用卡槽的高頻模擬
await ultra.cmdSlotSetActive(slot) // 切換到指定的卡槽
await ultra.cmdMf1SetAntiCollMode(false) // 設定卡槽使用額外設定的防碰撞資料
await ultra.cmdMf1SetDetectionEnable(false) // 關閉卡槽的偵測功能
await ultra.cmdMf1SetWriteMode(Mf1EmuWriteMode.NORMAL) // 設定卡槽的寫入模式
// 關閉 Gen1A 和 Gen2 魔術卡模擬
await ultra.cmdMf1SetGen1aMode(false)
await ultra.cmdMf1SetGen2Mode(false)
// 設定防碰撞資料
await ultra.cmdHf14aSetAntiCollData({
atqa: Buffer.from('0400', 'hex'),
sak: Buffer.from('08', 'hex'),
uid: Buffer.from('136d4a3d', 'hex'),
ats: Buffer.from('', 'hex'),
})
// 由於 M1 卡片的製造商區塊也有卡號的資料,所以模擬時我們也要寫入 Block 0 的資料
const block0 = Buffer.from('136d4a3d090804000000000000000000', 'hex')
await ultra.cmdMf1EmuWriteBlock(0, block0)
// 儲存設定並切換裝置模式
await ultra.cmdSlotSaveSettings()
await ultra.cmdChangeDeviceMode(DeviceMode.TAG)
})(vm.ultra)
執行結果如下:
請把一個 UID 魔術卡放在變色龍裝置的正面,然後執行以下的程式碼:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
const { Buffer } = await import('https://cdn.jsdelivr.net/npm/chameleon-ultra.js@0/+esm')
// 使用 UID 魔術卡的後門指令寫入 Block 0 的資料
const block0 = Buffer.from('136d4a3d090804000000000000000000', 'hex')
await ultra.mf1Gen1aWriteBlocks(0, block0)
})(vm.ultra)
執行結果如下:
CUID 魔術卡需要有正確的金鑰及存取權限才能寫入,一個非加密的 CUID 卡金鑰通常是 FFFFFFFFFFFF
。在寫入資料到 CUID 魔術卡時,請務必再三確認即將寫入的資料,因為寫錯資料可能會導致魔術卡鎖死 (俗稱變磚)。請把一個非加密的 CUID 魔術卡放在變色龍裝置的正面,然後執行以下的程式碼:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
const { Buffer, Mf1KeyType } = await import('https://cdn.jsdelivr.net/npm/chameleon-ultra.js@0/+esm')
const keyType = Mf1KeyType.KEY_A // 使用金鑰 A
const key = Buffer.from('FFFFFFFFFFFF', 'hex') // 非加密的 CUID 卡金鑰通常是 FFFFFFFFFFFF
// 使用普通的寫入指令寫入 Block 0 的資料
const block0 = Buffer.from('136d4a3d090804000000000000000000', 'hex')
await ultra.cmdMf1WriteBlock({ block: 0, keyType, key, data: block0 })
})(vm.ultra)
執行結果如下: