初次发表于FreeBuf (https://www.freebuf.com/geek/71556.html)
先从汽车无线钥匙的“信号”长什么样说起吧?
常见的汽车无线钥匙一般工作在两个频点,315MHz和433MHz。调制方式比较常见的有两种,ASK和FSK。复杂一点的有双频点FSK,还见过多频点ASK的。
可以用俗称电视棒的一种小硬件来观察汽车钥匙的无线信号。在网络上搜索“RTLSDR”,”电视棒”,就可以找到。它本来是用来插在电脑上,收看电视节目的。大概50块钱就可以买到。
RTLSDR
把它接上天线,然后插到电脑上,使用一些观察频谱的软件就可以看到,比如:
- HDSDR (http://www.hdsdr.de/)
- SDR# (http://sdrsharp.com/)
- Gqrx (http://gqrx.dk/)
把频点设在汽车钥匙使用的频点上,就可以看到像下图这样的频谱。
一个奔驰车钥匙信号的频谱
这是一辆奔驰车的信号频谱。频段是433MHz。中心频点是433.96MHz。从频谱的形状可以看出,能量集中在两点,这是一个FSK信号。
一辆奥迪车钥匙信号的频谱
这是一辆奥迪车钥匙的信号。
从图中可以看出,信号的频段是315MHz频段。中心频点是315.04MHz。频谱集中在一点,因此判断是ASK调制。
这里使用的软件是HDSDR。将HDSDR设为AM解调,点击录音按键,录一段解调之后的波形,存为wav文件。
使用Audacity软件打开wav文件(或者其他的编辑wav文件的软件都可以)。
这就是一次按键发出的信号,ASK解调以后的波形。有两段信号。如果按的时间长一点,就会是这样。
出现好几段信号。按下的时间内,钥匙持续发出一段一段的信号。这里面的每一段信号都是一样的,重复发送。我们来仔细看一下每一段信号的样子。
把信号放大展开,可以看到每一段信号,前面部分是一些重复的脉冲,就叫它同步引导序列吧,它用来提示接收机有信号即将到来,还可以获得时钟信息。后面的部分是有效的数据。这部分数据一般是曼彻斯特编码的。
我们把一次按键的两段信号拖到一起,比较一下。
可以看到是完全一样的。如果把两次按键的信号放在一起比较。
可以发现,两个信号是不一样的。也就是说汽车钥匙每次按键,发射的信号是不一样的。
这就是大名鼎鼎的“滚动码”,“Rolling code”。
滚动码的原理大致是这样滴:
滚动码是一个周期很长的伪随机码。例如有240。意思就是码的长度有40个bit。现在大部分车钥匙的码长都比40bit长。
车钥匙里存有当前的滚动码。当车钥匙按下时,滚动码加上功能码(比如是开锁,解锁,还是开后备箱)一起发送给汽车。
汽车也存有当前的滚动码。当它收到同样的滚动码时,它就执行相应的开锁之类的操作。如果收到的码不匹配,它就不做任何动作。
车钥匙和汽车里的滚动码是保持同步的。
当车钥匙距离车很远的时候,有人不小心按了几次车钥匙,车钥匙的随机码就会前进好几步。此时跟车内的码就不同步了。为了解决这个问题,汽车允许接收当前码之后的(比如)几百个码。只要车钥匙发送的码在这个窗口之内,汽车都认为是有效的。
如果车钥匙被误按超过设定的几百次,那么车钥匙和车就彻底失去同步了。这时,需要查找汽车的使用手册,找到恢复同步的方法了。
从上面这个原理可以看出来,如果我们能得到汽车当前滚动码“之后”的一个码,只要在窗口之内,就可以把车打开。怎样才能得到一个有效的,未被使用的码呢?比较简单的方法是这样的:
录制一段信号,然后到汽车那边去播放。
或者是,一边录,一边播……
不管怎样都需要接触到车钥匙,所以这并不是那么容易的事情啊。录音工具呢,有很多种,用前面讲到的电视棒就可以了。播放工具呢,也有很多种,比如rfcat (http://int3.cc/products/rfcat)
再比如,这种像柯南表一样的,Chronos手表
(http://www.ti.com/tool/ez430-chronos&DCMP=Chronos&HQS=Other+OT+chronos)
再比如,使用TI的C1111自己做一个RF收发分析器,比如UnicornTeam做的下面这个东西(增加了PA和SMA)
那有没有不需要接触钥匙,就能得到一个有效码的方法呢?
当然也是有的,那就是一些高级方法了。下面进入密码学的学术领域……
http://www.cosic.esat.kuleuven.be/keeloq/
这个链接是2007年以色列和比利时的几个研究者,找到的一种破解滚动码的方法。它需要先花大约一个小时的时间对钥匙进行65536次试探,解出64bit中的36个bit,然后再花几秒钟就可以完全破解钥匙的滚动码。完全破解的意思就是,这个伪随机码的全部规律都已经被破解了,可以知道下一个码是什么。
在实践中,它需要用相应的芯片(也就是汽车端配对的芯片)伪造一个transponder and encoder,让它工作在IFF(IDENTIFYFRIEND OR FOE)模式,对车钥匙发出试探信号(challenge),车钥匙发回一个response。车钥匙每产生一次response需要60ms或90ms。因此,收集65536个challenge/response消息对,需要65或者98分钟的时间。而且,车钥匙能够支持IFF模式的距离是多远呢?应该是非常近的距离。所以场景差不多是这样滴:
http://www.emsec.rub.de/keeloq
2008年,德国鲁尔大学的几个研究者使用了side-channelattack(中文有翻译为,旁路攻击,也有叫边信道攻击)的方法,通过分析解码控制器的功耗来解出KeeLoq密码。因为控制器在做不同运算时消耗的功率是不一样的。通过测量控制器的功耗,结合KeeLoq的算法,这种算法基本上是很成熟和固定的,可以推导出控制器中存储的密钥是什么。他们的研究成果,把破解KeeLoq密码的时间缩短到了几秒钟。
看起来这个方法是最牛最高效的了。但是你仍然要接触到钥匙,还要懂得怎么测量控制器的功耗,能分析出啥时候在算乘法啥时候在算加法……估计全世界懂这个技术的人也不多了。
所以!开车门也不是那么容易的。实践中,小偷们的开门方法其实是这样的。
汽车制造厂家们都仔细过考虑汽车的防盗问题。滚动码是一种成本低,能有效提高攻击门槛的方法,而且芯片的功耗很小,保证汽车钥匙的电池可以使用很多年。以上说的都是通过钥匙的无线信号解锁的方法。现在的车越来越智能,出现了用蓝牙连接,用手机APP通过蜂窝网络连接,等等各种新的开车的方法。就不在本文讨论的范畴了。一个系统越复杂,可能出现的漏洞就越多。
另外,开关车门和发动汽车又是两码事,分别有两个系统管理。所以即使打开了门,也很难把车开走。你以为扯出两根电线短路一下就能发动汽车吗?那都是电视剧!
Hack,这个词有拆开来,钻进去,看看里面究竟是怎么回事,这样的意思。所以我们常常说破解XX,未必是有漏洞能利用,也有分析内部原理的意思。