我是怎麼打開車庫門的:ASKOOK手動解碼及重放
* 本文作者:
loblab
,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載本文以打開無線控制的電動車庫捲簾門為目標,深入研究了ASK/OOK的編/解碼,並用樹莓派+五元錢的五元錢的發射模塊實現了打開車庫門的各種姿勢。本文適用於主流315/433MHz射頻遙控。
背景
車庫裝了電動捲簾門,為了了解其安全性,也是為了能自主控制,研究了下其遙控原理。其實在這個過程中,我測試了家裡幾乎所有的無電線遙控器,包括電動窗帘、投影幕布、電動衣架、車鑰匙。除了車鑰匙,其它都是類似的,即ASK/OOK編碼。
ASK,簡單的理解,就是調幅,用不同的幅度來代表不同的信息。OOK是ASK的特例,因為只有0和1要表示,可以用有載波來代表1,無載波來代表0。但實際上並不是這麼直接,通常會加上脈寬調製(PWM)以提高抗干擾能力。
用HackRF確定可行性
據說有的車庫門是滾動碼的(編碼是變化的),我們可以先用HackRF做個簡單的重放攻擊測試。
錄製2秒的信號並重放:
部分運行提示:
實測用錄製的信號是可以控制的(如果不行,注意調整HackRF放大器的增益)。但這個沒多大技術含量,而且成本高,數據量也大。我們的目標是解碼後再重新編碼/重放。
用GNU Radio錄製信號
用GNU Radio搭一個簡單的接收框圖,一方面將接收信號保存到文件,另一方面將信號以瀑布圖顯示作為實時反饋。因為遙控信號是433.92MHz,中心頻率設在這個附近都可以;採樣率2M就夠了。
圖1:gnuradio-companion 連接框圖
下圖是運行時的瀑布圖,其中按了5次遙控器。
圖2:gnuradio-companion 運行時的瀑布圖
用 Inspectrum 手動解碼
用apt-get安裝inspectrum,或下載最新的Inspectrum代碼,按照文檔自行編譯。試過Debian和Mac下都沒問題(Mac下用MacPorts要安裝一堆依賴)。編譯就不多說了,下面是解碼的主要步驟:
1. 用Inspectrum打開前面錄製的文件,設置採樣率為錄製時的採樣率(2M);
2. 水平拖動,找到有信號的區域;
3. 在原始信號上右鍵,Add derived plot => Add sample plot;
4. 此時原始信號上會出現兩條水平線,用滑鼠拖動,調節中心頻率的位置和寬度;
5. 在原始信號上右鍵,Add derived plot => Add amplitude plot;
6. 在Amplitude plot上右鍵,Add derived plot => Add threshold plot;
7. 勾選」Enable cursors」,此時會出現兩條豎線;
8. Zoom放大信號圖,移動兩條豎線,使其寬度包含一個符號。注意跳過前導的高低電平(start1, start0)。數據通常是脈寬編碼的,一對高低電平的組合代表一個bit:高電平較寬的代表1,低電平較寬的代表0。從圖中應該能看出這個規律。
9. 改變符號數,使其包含整個信號區域(圖中是65個符號,這相當於完整的key),並調節首尾對齊(結束時通常有較長的低電平),這時可以得到符號的速率,即波特率(對OOK,其實等同於比特率)。
圖3:用Inspectrum解碼的步驟
最後,在Amplitude plot或Threshold plot上分別點右鍵,Extract symbols (to stdout),可以得到解碼的數據。其中前者相當於模擬信號,簡單理解:正數代表1,負數代表0;後者才是我們想要的bit流。
圖4:用Inspectrum解碼的結果
為確認解碼正確,可以再選一段信號區域,做同樣的操作,看結果是否一致。畢竟ASK抗干擾不強,有時候可能會差一兩個bit。通常,按一下遙控器,同樣的數據會重複發送幾次。
遙控信號編碼分析
根據前面的解碼,以及對更多遙控器的分析,可以歸納出一個模型。一個ASK信號包含如下部分(參數):
start1: 起始的高電平時間長度;
start0: 起始的低電平時間長度;
stop0: 結束的低電平時間長度;
period: 每個bit的周期,在PWM編碼中,每個bit都對應一對高/低電平,而且總是先高後低;
duty: 占空比,比如占空比是75%,則意味著一個周期內如果75%左右是高電平,則代表1; 而75%左右是低電平則代表0;
bits: 實際的bit流。
這裡的占空比肯定是大於50%的,通常在75%左右比較合適,這樣既能拉開(每個周期內)兩種電平的比例差,減少接收端的誤判;又能保證接收時能採樣到兩種電平,也是為了減少誤碼。試想對於99%的占空比,1%周期的電平很可能被接收端採樣不到,導致採樣到199%(甚至更長)周期的同一種電平,這樣解碼時就會出錯。
發射模塊
最初,我是想用GNU Radio做ASK/OOK編碼並發射的。萬能的HackRF和SDR按說能搞定這個小Case。
研究了下,發現這並不是一件容易的事。需要使用很多的模塊。這也許是一個很好的GNU Radio的練習題。但我還是先看下有沒有更簡單的辦法。
然後口水了一下TI的EZ430-Chronos手錶,找了下「廉價」的RFcat,發現並不容易買到。最後在萬能的假貨寶發現了真正廉價的東東:只要5元!(你買不了吃虧,買不了上當。。)
這個模塊很簡單,就是把輸入的信號以433/315M的載波調製/發射出去。DATA為高電平,就按高電平調幅輸出(請注意,這裡調製的是電平,並不是數據。也就是說,數據」1」對應多長時間的高電平,多長時間的低電平,這個模塊都不管的——這些是編碼模塊要處理的事)。
圖5:ASK/OOK 發射模塊
用Python編碼
為了代碼的模塊化,也是為了減少發射時的計算量,我們採取先編碼再發送的方案。根據前面建立的ASK信號的模型,將這個信號編碼為高低電平交替的波形,並用一個數組表示,數組中每個元素存儲高低電平切換時對應的時間戳。波形總是以高電平開始。
起始/結束電平的時長、占空比這些參數理論上並不需要嚴格準確,但這取決於接收端的寬容度,所以我們還是盡量忠實於原信號。
下面是核心的代碼片斷,其中ts是時間戳數組。
用樹莓派發送
發送工作就很簡單了:將發射模塊的DATA腳與樹莓派的某個GPIO相連,電源也直接用樹莓派的;
圖6:樹莓派與發射模塊
然後根據時間戳交替翻轉對應的GPIO就行了。
用sleep控制時間儘管有一定誤差,腳本語言的運行也沒那麼快,但實測是夠用的。下圖是示波器上看到的DATA引腳的波形圖(兩個通道都連著DATA腳)。
圖7:樹莓派產生的待調製信號
為便於觀察,我將編碼周期設置為1ms,和示波器界面的1ms/div對應。圖中測量的間距是2.78ms(預期是2.75ms),偏差是可接受的。
多種姿勢打開車庫門
把發射的裝置放在車庫內,並連上網路,就可以無需鑰匙自主控制車庫門的開/關了。
手機開關門
不需要自己寫App,用ssh終端密鑰登錄並執行命令,就可以手機一鍵開/關門了,並且可以遠程控制。
圖8:手機上用ssh開關車庫門
自動開關門
以指定手機作為鑰匙,當持手機靠近車庫時(其實是連上車庫WiFi後),就自動開門。大致流程是:
遠程執行路由器的 iwinfo 命令(如下)檢測連接在上面的設備;
如果作為鑰匙的手機的MAC在列表裡,並且信號強度(SNR)超過設定值,就計為一個有效的連接。當連接數從0變為非0時,就自動開門。
如果鑰匙手機的有效連接數降到0, 就自動關門。
自動關門的好處是可以防止人走了忘了關門(俺家真的發生過)。
芝麻開門
理論上可以做到,但需要可靠的聲紋識別。這個就算了。。
鎖死車庫門
把發射模塊對應的GPIO設為高電平,由於發射模塊信號強,距離近,接收端收到的總是1,導致用真的鑰匙也開不了門。
結語
不用滾動碼編碼的車庫門其實是毫無安全性可言的。不管是簡單的原始信號重放、還是解碼後再編碼的重放都比較容易實現。但我們可以利用這種不安全為自己提供便利,更靈活地自主開/關門。另外,用發射模塊發射高電平可以干擾鑰匙的信號達到鎖死車庫門的效果。
但如果不是通過監聽鑰匙的信號,用暴力破解Key也並不是那麼容易的。因為ASK編碼除了需要數據吻合,載波頻率相同,還需要數據編碼速率,甚至起止電平的時長都要一致。
用廉價的硬體發射模塊配合樹莓派(或單片機)可以低成本地編碼/發射ASK/OOK信號,簡單易行。而HackRF加Inspectrum解碼僅適合實驗和調試用,實用價值不高。後續將會嘗試ASK/OOK的自動解碼。
* 本文作者:loblab,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
※相冊類木馬專題分析
※為什麼朝鮮格外關注加密貨幣
※婚戀網站背後,可能藏著精心設計的釣魚攻擊
TAG:FreeBuf |