逆向破解 H.Koenig 遥控器 Part 1
逆向破解 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项目,我还是需要更多的了解这些芯片:-)