在這篇文章中,我描述了為什么我的廉價(jià)的磁條閱讀器不能讀取所有的磁條,只有信用卡和借記卡。這并不能幫助我了解酒店鑰匙卡上的數(shù)據(jù),而這正是我真正想要知道的。我沒(méi)有特意地去購(gòu)買更好的閱讀器,而是選擇了打開(kāi)廉價(jià)的磁條閱讀器,略作探索,找到了一種從酒店鑰匙卡讀取原始數(shù)據(jù)的方法。這些數(shù)據(jù)意味著什么,仍然是個(gè)謎,因此在某個(gè)時(shí)候我可能會(huì)發(fā)布文章的第二部分。
關(guān)于我的磁條閱讀器
我在2017年以11.85英鎊購(gòu)買了以下閱讀器:

來(lái)自eBay的廉價(jià)閱讀器
它通過(guò)USB連接,被檢測(cè)為鍵盤。如果你通過(guò)閱讀器刷信用卡/借記卡,那么文本編輯器就會(huì)像得到輸入指令一樣顯示來(lái)自磁條的相應(yīng)數(shù)據(jù)。如果你當(dāng)時(shí)沒(méi)有打開(kāi)文本編輯器,你將看不到磁條上的任何信息。
它在Windows和Linux下都能正常工作,但僅適用于信用卡/借記卡。當(dāng)我刷酒店鑰匙卡時(shí),我什么數(shù)據(jù)都沒(méi)有得到。
為什么不換一個(gè)閱讀器?
我本可以采取一些不同的(毫無(wú)疑問(wèn)更好的)方法來(lái)實(shí)現(xiàn)這個(gè)項(xiàng)目,找一個(gè)更好的磁條閱讀器就是其中一種選擇。通過(guò)谷歌搜索來(lái)更好地了解酒店磁條無(wú)疑是最有成效的方法,但可能會(huì)降低一些我們解決問(wèn)題的能力。當(dāng)我被卡住時(shí),我總是可以通過(guò)谷歌搜索來(lái)解決。
我投資了一臺(tái)MSR605X讀寫器。我之前沒(méi)有使用過(guò)它,但它能夠做原始讀取。我可能會(huì)在以后的文章中對(duì)它進(jìn)行介紹。
為廉價(jià)的閱讀器做好計(jì)劃
我認(rèn)為廉價(jià)的閱讀器中的磁讀頭幾乎肯定能夠從酒店鑰匙卡或任何其他帶有磁條的卡中讀取數(shù)據(jù)。但實(shí)際上,它們只能讀取支付卡數(shù)據(jù)。如果我可以在閱讀器內(nèi)的正確位置探測(cè)電子信號(hào),我應(yīng)該能夠看到磁條上的1和0代碼信息。

閱讀器內(nèi)的磁讀頭
我只有一個(gè)模糊的計(jì)劃,當(dāng)然不會(huì)是阻力最小的道路,但最終會(huì)有成效……
探索模擬信號(hào)
我有兩種工具可以使用(這是一個(gè)基于家庭的項(xiàng)目,而不是基于辦公室的項(xiàng)目):
l 廉價(jià)的手持式示波器(Sainsmart DS202)
l Saleae Logic邏輯分析儀
我很快意識(shí)到,我可以把探頭連接到讀頭上,上面有7個(gè)連接點(diǎn)。

讀頭背面的連接點(diǎn)
我想,如果將讀頭直接連接到我的示波器上,我就可以在刷卡時(shí)看到模擬信號(hào)。最終,我希望用這個(gè)信號(hào)做一些事情來(lái)獲取我想要的數(shù)據(jù)。

將讀頭直接連接到示波器上
我嘗試將這7個(gè)探測(cè)點(diǎn)以不同的組合連接到我的示波器,但根本沒(méi)有發(fā)現(xiàn)任何信號(hào)。也許是信號(hào)太弱了,或者(回想起來(lái))我做的探測(cè)工作還不到位。
至此,我只能在去谷歌搜索更多關(guān)于芯片的信息了。它有一個(gè)2倍運(yùn)算放大器和一個(gè)1倍模擬比較器:
l 2xLM2902DG(運(yùn)算放大器)
l 1xLM2901DG(模擬比較器)

2倍運(yùn)算放大器

模擬比較器(左),STM32微控制器(右)
這些芯片負(fù)責(zé)放大來(lái)自讀頭的信號(hào)。因此,如果連接到每個(gè)輸出,我可能會(huì)看到一個(gè)信號(hào),我可以用它來(lái)確定磁條上的數(shù)據(jù)。為此,我通過(guò)使用數(shù)據(jù)表來(lái)識(shí)別每個(gè)芯片的輸出引腳。
2倍運(yùn)算放大器的輸出峰值為0.5-0.6v,使用我的示波器可以輕松查看,但我無(wú)法將其提供給我的邏輯分析儀。我需要大約3v的峰值。信號(hào)看起來(lái)也很沒(méi)有規(guī)律,不是我希望的方波。
模擬比較器的輸出正是我所追求的。一個(gè)不錯(cuò)的3或4v的峰值方波,僅在我刷卡時(shí)出現(xiàn)。這時(shí),比較器有4個(gè)輸出,其中一個(gè)從未發(fā)出信號(hào),對(duì)于可以讀取3軌磁條的讀頭來(lái)說(shuō),這似乎是合理的。是時(shí)候?qū)⑺峁┙o邏輯分析儀,并開(kāi)始計(jì)算由0或1構(gòu)成的信號(hào)的內(nèi)容了……
計(jì)算信號(hào)的內(nèi)容
到目前為止,進(jìn)展非常快。這正在形成一個(gè)有趣的項(xiàng)目。
這是Saleae Logic軟件中比較器的輸出:

通過(guò)邏輯分析儀查看比較器輸出
請(qǐng)注意,我們只看到1個(gè)方波,而不是3個(gè)。這是因?yàn)檫@個(gè)特定的鑰匙卡在3個(gè)軌道中的只有1個(gè)有數(shù)據(jù)。
所以,我們只有一個(gè)信號(hào)要分析,但我們還沒(méi)有計(jì)算出信號(hào)的內(nèi)容。
1992年的Phrack37給了我們幫助:

關(guān)于1和0如何在磁條上編碼的ASCII解釋
本質(zhì)上0和1在編碼時(shí)都是相同的長(zhǎng)度。只是1改變了狀態(tài),而0沒(méi)有改變狀態(tài)。注意,0可以是高的或低的。
我沒(méi)有僅通過(guò)觀察來(lái)解碼1和0,而是編寫了一個(gè)Python腳本,它解析了邏輯分析儀中導(dǎo)出的數(shù)據(jù)并轉(zhuǎn)儲(chǔ)了1和0。以下是導(dǎo)出為CSV時(shí)“Logic”(Saleae軟件)使用的格式:
從Saleae的Logic軟件導(dǎo)出CSV格式
由于數(shù)據(jù)的波特率不是常量,因此編寫Python代碼很難。它取決于鑰匙卡劃過(guò)讀頭的速度。在編寫代碼時(shí),我因?yàn)橐恍╁e(cuò)誤而走了彎路,但最終找到了一個(gè)有效的解決方案。
這是一個(gè)散點(diǎn)圖,所顯示的方波脈沖的持續(xù)時(shí)間并沒(méi)有預(yù)期的兩個(gè)值。相反,可以看到各種范圍的值。它仍然可以從1(短脈沖,藍(lán)色/紫色點(diǎn))到0(長(zhǎng)脈沖,綠點(diǎn)),見(jiàn)下圖(上)。每個(gè)連續(xù)脈沖與最后一個(gè)脈沖的比率是從1到o的,見(jiàn)下圖:

圖表顯示脈沖持續(xù)時(shí)間(delta)需要多少值,而不是預(yù)期的兩個(gè)值
字節(jié)/字符
正如在phrack論文中提到的,信用卡使用2個(gè)軌道,其中一個(gè)字符由5位(4位+ 1個(gè)奇偶校驗(yàn))組成,另一個(gè)字符由7位(6位+ 1個(gè)奇偶校驗(yàn))組成。
我花了很多時(shí)間來(lái)編寫信用卡解碼器。部分原因是因?yàn)槲倚枰_定我正確讀取了1和o,另一部分原因是因?yàn)槲艺J(rèn)為我需要代碼來(lái)查看酒店鑰匙卡中是否使用了相同的字符類型。
對(duì)此進(jìn)行編碼的挑戰(zhàn)之一是需要知道數(shù)據(jù)的開(kāi)始位置和前導(dǎo)碼何時(shí)結(jié)束。似乎“Sentinel ”命令可用于標(biāo)記數(shù)據(jù)的開(kāi)始/結(jié)束。這些是特殊字符(位模式),讀者可以在條帶的開(kāi)頭和結(jié)尾查找…然后它才會(huì)有意義。這就是閱讀器只能用于信用卡的原因:固件正在尋找信用卡使用的標(biāo)記。它無(wú)法解碼酒店鑰匙卡,因?yàn)閿?shù)據(jù)的開(kāi)始或結(jié)束位置并不明顯或數(shù)據(jù)沒(méi)有構(gòu)成一個(gè)什么進(jìn)程。此外,可能缺乏有效的縱向冗余校驗(yàn)(LRC)。
識(shí)別酒店鑰匙卡磁條上的字符
我在酒店鑰匙卡的磁條上運(yùn)行了我的信用卡代碼,看看是否有所有5位或所有7位的奇數(shù)奇偶校驗(yàn)。不幸的是,沒(méi)有。這可能是廉價(jià)的磁條閱讀器失敗的另一個(gè)原因。
然后我對(duì)1和0進(jìn)行了一些頻率分析。由于很多5位和7位的值都有自己的特點(diǎn),我在信用卡磁條上看到了它們各自對(duì)應(yīng)的內(nèi)容。7位磁條上有20個(gè)空格。因此,使用頻率分析,我應(yīng)該能夠猜測(cè)到正在使用7位字符。
通過(guò)將一些酒店鑰匙卡數(shù)據(jù)分成8位模式,我們注意到1和0的相同字符串發(fā)生的次數(shù)比預(yù)期的要多得多。所以我的猜測(cè)是,酒店鑰匙卡使用了8位字符。
下面是我的Python腳本的一些輸出樣本:
l 原始位
l 字符串(帶十六進(jìn)制轉(zhuǎn)儲(chǔ)),如果使用5位、6位、7位或8位字符,則是正確的。雖然“正確性”取決于奇偶校驗(yàn)、位順序以及位值映射到的字符集。這里有很多錯(cuò)誤和改進(jìn)的空間
l 檢查字符內(nèi)的奇數(shù)/偶數(shù)奇偶校驗(yàn)
l 尋找常見(jiàn)字符的頻率分析,用于改變字符長(zhǎng)度
[+] Parsing file export.csv
[-] Flips in channel 0: 3
[-] Flips in channel 1: 1652
[-] Flips in channel 2: 3
[+] Analysing swipes
[-] Channel 0:
[-] Channel 1:
[-] Swipe 0: 693 bits
[-] Swipe 1: 701 bits
[-] Channel 2:
[+] Creating Plots
[-] creating plots with dimensions (1637, 1637), (1637, 1637)
[-] saving plot to file: export.csv-plot-channel-1.png
----------------------- CHANNEL 1 SWIPE 0 -----------------------
[+] Length (bits) = 266 (%5 = 1, %6 = 2, %7 = 0, % 8= 2)
[+] Data: 10100110001001100010011000100110001001100010011000100110001001100010011000100110001001100101011011100110101001001101100110100110001001100111110110111100111101100010000000100110011001101100001010010101001001001110110100000111001101011101100001100101101000101010011001
[+] Strings:
[-] 5 bit: 5398621626>36=1:6
[-] length: 53
[-] hex:
35 33 39 38 36 32 31 3c 34 33 39 38 36 32 31 3c 5398621
34 33 3a 3e 36 32 3c 33 35 33 39 3c 3b 3e 3c 3d 43:>62
34 30 39 3c 36 31 35 35 34 39 3d 31 3e 36 3e 33 4096>3
36 3d 31 3a 36 6=1:6
[-] 6 bit: E(1C&,9RD(1CFM92;+1S;G;"D,-**DMPLW8M4,
[-] length: 38
[-] hex:
45 28 31 43 26 2c 39 52 44 28 31 43 46 4d 39 32 E(1C&,9RD(1CFM92
3b 2b 31 53 3b 47 3b 22 44 2c 2d 2a 2a 44 4d 50 ;+1S;G;"D,-**DMP
4c 57 38 4d 34 2c LW8M4,
[-] 7 bit: %..#...2$..#&-.....3.'..$....$-0,7.-.
[-] length: 37
[-] hex:
25 08 11 23 06 0c 19 32 24 08 11 23 26 2d 19 12 %..#...2$..#&-..
1b 0b 11 33 1b 27 1b 02 24 0c 0d 0a 0a 24 2d 30 ...3.'..$....$-0
2c 37 18 2d 14 ,7.-.
[-] 8 bit: .&&&&&&&&&&V....&}.. &f..$..5.e..@
[-] length: 34
[-] hex:
a6 26 26 26 26 26 26 26 26 26 26 56 e6 a4 d9 a6 .&&&&&&&&&&V....
26 7d bc f6 20 26 66 c2 95 24 ed 07 35 d8 65 a2 &}.. &f..$..5.e.
a6 40 .@
[+] Parity for 5 bit chars: odd: False, even: False)
[+] Parity for 6 bit chars: odd: False, even: False)
[+] Parity for 7 bit chars: odd: False, even: False)
[+] Parity for 8 bit chars: odd: False, even: False)
[+] Frequency analysis for potential char lengths:
[-] 5 bits:
10011: 5
11000: 4
01100: 4
00110: 4
00100: 4
[-] 6 bits:
100110: 5
100010: 5
011000: 5
011001: 4
001001: 4
[-] 7 bits:
1000100: 3
0010011: 3
1101100: 2
1100010: 2
1011010: 2
[-] 8 bits:
00100110: 12
10100110: 3
...snip...
上面的數(shù)據(jù)來(lái)自于實(shí)際的酒店鑰匙卡(盡管酒店后來(lái)改用了RFID鎖)。
我還開(kāi)始研究XORing、旋轉(zhuǎn)字符(rot13格式)、位序和偏移的整個(gè)位流(以防止我在把字符組合放到錯(cuò)誤的位置)。不過(guò),到目前為止這些都還沒(méi)有成功。
這就是我所得到的。如果我能解碼鑰匙上的任何數(shù)據(jù),我一定會(huì)再次發(fā)布。我希望能看到我的房間號(hào)和結(jié)賬日期。但同樣,一個(gè)不以明文形式出現(xiàn)的加密字符串也不會(huì)讓我驚訝——這是我在某些卡片上所看到過(guò)的。
結(jié)論
以廉價(jià)和耗時(shí)的方式來(lái)做事也可以很有趣——這也是練習(xí)編寫代碼、了解matplotlib以及邏輯分析儀的好機(jī)會(huì)。
|