iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0

Day 14 透過 JS SDK 模擬及拷貝 M1 卡的卡號

在一些安全性比較低的門禁系統中,有時候只會讀取 RFID 卡片的卡號,然後根據卡號來決定是否開啟門禁,現在讓我們來嘗試模擬及拷貝 M1 卡的卡號吧。

使用變色龍模擬 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 魔術卡

請把一個 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 魔術卡需要有正確的金鑰及存取權限才能寫入,一個非加密的 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)

執行結果如下:


上一篇
Day 13 透過 JS SDK 讀取 RFID 卡號
下一篇
Day 15 認識 M1 卡的資料結構
系列文
免安裝!一起用 JS 來控制開源的 NFC 讀卡機變色龍吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言