1. 程式人生 > >逆向破解 H.Koenig 遙控器 Part 1

逆向破解 H.Koenig 遙控器 Part 1

body x64 模塊 做了 目前 完成 努力 而且 優惠

逆向破解 H.Koenig 遙控器(Part 1)

最近我正在嘗試一研究些自動吸塵器機器人。iRobot公司的Roomba貌似是該領域的領導者,但是作為實驗來講的話這些東西真是太昂貴了,我也找不到任何的折扣優惠。所以我只能買一個H.koenig SWR22替代Roomba。

技術分享圖片

這個吸塵器附帶了幾個配件和一個遙控器。

技術分享圖片

iRobot的遙控器似乎是依靠紅外,而H.koenig已經選擇了在2.4 GHz ISM頻段上的一個RF遙控操作。由於我正努力學習射頻方面的知識,並開始接觸軟件定義無線電(SDR)方面知識,因此我打算逆向這個遙控器,並且試圖“構造”一個遙控器。這就是這篇文章的內容。

特立獨行的Crazy Aussie Dave 總是說:

“ 不要打開它,拆開它! ”

正如你期待的那樣,裏面沒有很多的東西:14個按鍵,一個陶瓷振蕩器微控制器,無源元件和一個可能采用了經典的SPI總線與並μC連接的RF模塊。

作為參考,在第一個修正版本中我們采用的是遙控器“XR210_T”。這可能與其他H.koenig型號兼容。

技術分享圖片

讓我們仔細看看這個微控制器。我並不指望它的固件是可以升級的,但如果制造商足夠好的話,也許我們可以只提取並逆向固件的所有命令。至少,對於電子我只是一種愛好,我更喜歡逆向軟件而不是它的組件:-)

技術分享圖片

這個鏡頭的質量不是很好,但你可以看到MCU上的參考文字:在DIL16封裝上寫著TK98P01 。

不幸的是,谷歌搜索不到這個型號。我根本找不到任何相關的數據表,雖然有幾個鏈接指向的是盛群半導體,但是該引用似乎並沒有出現在他們的產品目錄中。

順便說一句,讓我沒想到是它居然是一次性可編程器件。

因此,忘記軟件的方式,因為它似乎並沒起到作用,在顯微鏡下看看使用的是什麽樣的RF收發器模塊。

技術分享圖片

這個看起來更加有戲。該收發器是一個Avantcom A7105。這是一家臺灣公司生產的小型射頻收發器,工作在2.4GHz 的FSK或GFSK調制器上。它很像北歐的nRF2401和德州儀器(前身為Chipcon公司)CC2500。希望我已經找到這些東西了,它所需要是一個典型的SPI(串行外設接口)總線。

在顯微鏡下觀察來確定SPI總線信號是很煩躁的,而且還沒有足夠的引腳來幹擾這種做法。只需連接引腳邏輯分析儀,例如Saleae Logic。該軟件將會完成這些工作。

技術分享圖片

在上面的圖片中,MCU陶瓷振蕩器工作在4MHz。因此,SPI總線不應工作在該頻率以上,我們並不需要使用Saleae邏輯分析儀的24MHz全部帶寬。

接線邏輯分析儀後,幾秒鐘就可以得到很多樣本,在這段時間按下幾個按鈕,我們捕獲信息如下:

技術分享圖片

如果你不熟悉的SPI總線協議,它主要依靠4個信號:

1.MOSI(主出從入)用於從MCU到收發器傳輸數據;

2.MISO(主入從出)用於傳輸數據的其他方式。

3.SCK為時鐘信號;

4.SCS反向輸入來選擇一個芯片。因此,當它變為低時,傳輸可以開始。

在我們的例子中,SCS信號顯然是最後一個,在通道7和SCK,時鐘信號,是在頻道6。別急,只有頻道5是保留的,但是我們仍然需要兩個信號。

在數據表中,Avantcom A7105只用一根線作為MOSI和MISO信號,作為采用3線SPI總線。這個起初有點混亂(至少,對我來說)。此外,A7105在最高有效位(MSB)順序傳送8位,而一些通道只需要4位!這應該是Saleae SPI解碼器的原因,但是也沒必要寫一個特定的解碼器

SPI的解碼器安裝後,我們得到如下:

技術分享圖片

正如你所看到的,所有的輸入是完全解碼的。我們只需要記住一些字節指令/數據,其他的都是答案。而4位選通必須手動進行解碼。

在那之後,我們再對遙控器進行一次上電捕捉。可以肯定的是,我能初始化收發器的設置配置。但事實上,H.koenig在他們的單片機程序做了一個非常奇怪的選擇:收發器不上電初始化。相反,他們采用復位初始化,每一個按鈕上的無線電發送時間重新配置收發器!能量和時間都有損失!試想一下,每一次,該收發器有重新調整它的本地振蕩器和鎖定其PLL。除非有人說明具體情況,不然我認為固件在我試驗期間已經進行了改進:-)

好了,接著是漫長而無聊的東西:捕捉每一個按鈕動作,解碼所有的A7105數據表。

希望無論按下什麽按鈕,任何設置都保持不變。正如你所看到的,這是一個相當長的設置過程,因為他們寫的是幾乎每一個寄存器。

如下所示(這裏的布局很糟糕,但是tumblr創建不了表格)

0x00 0x00 Reset the chip

0x06 0x58 0x52 0xD2 0x41 Write ID = 0x58 0x52 0xD2 0x41

0x46 Read the ID but /SCS is set high so they don’t care about the answer…

0x01 0x42 Write Mode Control (Auto RSSI + FIFO Mode)

0x02 0x00 Write Calc

0x03 0x08 Set packet length to 8 bytes

0x04 0x00 Write FIFO 2

0x07 0x00 Write RC OSC I

0x08 0x00 Write RC OSC II

0x09 0x00 Write RC OSC III

0x0A 0x00 Write CKO Pin

0x0B 0x01 Write GPIO1 Pin

0x0C 0x21 Write GPIO2 Pin

0x0D 0x05 Write Clock

0x0E 0x00 Write Data rate (500 kpbs)

0x0F 0x50 Write PLL I (Channel is set to 0x50 which gives a +40 MHz offset)

0x10 0x9E Write PLL II

0x11 0x4B Write PLL III

0x12 0x00 Write PLL IV

0x13 0x02 Write PLL V

0x14 0x16 Write TX I

0x15 0x2B Write TX II

0x16 0x12 Write Delay I

0x17 0x00 Write Delay II

0x18 0x22 Write RX

0x19 0x80 Write RX Gain I

0x1A 0x80 Write RX Gain II

0x1B 0x00 Write RX Gain III

0x1C 0x0E Write RX Gain IV

0x1D 0x32 Write RSSI Threshold

0x1E 0xC3 Write ADC

0x1F 0x07 Write Code I (sets Preamble length to 4 bytes)

0x20 0x16 Write Code II

0x21 0x00 Write Code III

0x22 0x00 Write IF Calibration I

0x24 0x00 Write VCO current Calibration

0x25 0x00 Write VCO Single band Calibration I

0x26 0x3A Write VCO Single band Calibration II

0x27 0x00 Write Battery detect

0x28 0x17 Write TX test

0x29 0x47 Write RX DEM test I

0x2A 0x80 Write RX DEM test II

0x2B 0x01 Write CPC

0x2C 0x05 Write Crystal test

0x2D 0x45 Write PLL test

0x2E 0x18 Write VCO test I

0x2F 0x00 Write VCO test II

0x30 0x01 Write IFAT

0x31 0x0F Write RScale

0x02 0x01 Write Calc (Enables IF Filter Bank calibration)

0x42 0x00 Read Calc (0x00 means calibration is done)

0x62 0x07 Read IF Calibration I

0x24 0x13 Write VCO current Calibration

0x25 0x09 Write VCO Single band Calibration I

Strobe 0b1010 Standby mode

Strobe 0b1110 FIFO write pointer reset (ie clears the FIFO)

0x05 [8 bytes] Write FIFO data

0x0F 0x64 Write PLL I (Sets channel to 0x64 hence Freq=2450.001 MHz)

Strobe 0b1101 TX mode

這是所有的設置。我還是不明白他們為什麽在發送數據前,會從通道0×50移動至通道0×64。他們可以在剛開始將收發機設定成正確的頻道。看起來代碼質量很差。

目前為止就這樣了。接下來我會詳細介紹包裝品,在空中發送的是什麽以及遠程的每一個按鈕遠程發送的值。

我還將檢查,是否可以使用Chipcon公司的CC2500替代Avantcom A7501來工作。這樣的話,我也許能夠使用Python和GoodFET進行遠程通信:

技術分享圖片

選擇CC2500基於一個事實,我早在一個月前已經為GoodFET寫好了支持它的固件,我知道TX是確定(我還是要調試,雖然只是完成RX的一部分)。而且我還有一個(未發表)基於CC2500項目,我還是需要更多的了解這些芯片:-)

逆向破解 H.Koenig 遙控器 Part 1