iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

Day 17 讀取 M1 卡片的資料

在認識了 M1 卡的資料結構後,讓均民帶你使用變色龍來讀取 M1 卡的資料吧!

讀取非加密的 M1 卡

非加密的 M1 卡,代表卡片的金鑰是常見的金鑰,所以在已知金鑰的情況下就能直接讀取卡片的資料。請把一個非加密的 M1 卡放在變色龍裝置的正面,然後執行以下的程式碼:

// 在測試網頁的開發者工具中執行 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 bufToHex = buf => buf?.toString('hex').toUpperCase()
  const key = Buffer.from('FFFFFFFFFFFF', 'hex') // 非加密的 M1 卡金鑰通常是 FFFFFFFFFFFF
  const keyType = Mf1KeyType.KEY_A // 使用金鑰 A
  const dump = Buffer.alloc(1024) // 用來存放讀取到的資料,M1 卡總共有 1024 位元組的資料
  
  for (let i = 0; i < 64; i++) {
    try {
      // 讀取一個區塊 (Block)
      const block = await ultra.cmdMf1ReadBlock({ block: i, key, keyType })
      dump.set(block, i * 16) // 將讀取到的區塊資料存放到對應的位置
    } catch (err) {
      console.error(`無法讀取區塊 ${i}`) // 如果讀取失敗,顯示錯誤訊息
    }
  }
  
  console.log('讀取到的卡片內容為:')
  // 將讀取到的資料分成每 16 位元組一組,轉成 hex 格式並顯示
  console.log(dump.chunk(16).map(bufToHex).join('\n'))
})(vm.ultra)

執行結果如下:

讀取 UID 魔術卡

UID 魔術卡有後門指令,可以無視金鑰與存取權限直接讀取卡片的資料,請把一個 UID 魔術卡放在變色龍裝置的正面,然後執行以下的程式碼:

// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
  const bufToHex = buf => buf?.toString('hex').toUpperCase()
  // 讀取 UID 魔術卡的所有區塊
  const dump = await ultra.mf1Gen1aReadBlocks(0, 64)
  
  console.log('讀取到的卡片內容為:')
  // 將讀取到的資料分成每 16 位元組一組,轉成 hex 格式並顯示
  console.log(dump.chunk(16).map(bufToHex).join('\n'))
})(vm.ultra)

執行結果如下:


上一篇
Day 16 認識 M1 卡的存取權限
下一篇
Day 18 M1 卡片的完整模擬及拷貝
系列文
免安裝!一起用 JS 來控制開源的 NFC 讀卡機變色龍吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言