程序控制电话(phone phreaking)和拨号调制解调器日结束后,廉价的软件无线收发(Software-Defined Radio)出现后,无线窃听的前景立即被重新定义
通过“软件无线收发”的使用,对于无线,我们不再限制在以前的“黑盒子”(black box)操作模式,相反,这时几乎可以不受任何限制地访问射频频谱、无线模块和协议。以前通过“保密协议”(Non-Disclosure Agreement,NDA)进行屏蔽的内容和只有专业设备才能看到的现象,现在已全部无遮无拦地展示在您面前,任由您操纵。无线频谱的使用是由不同的政府机构严格监管的,所以您有责任确保在“接收和发送”,以及“接收或发送”无线电信号的时候,请遵守当地的法律。
其次,您也应该注意到,“软件无线收发”目前仍然处于起步阶段,还谈不上是真正的“即插即用”。即使您按照软件说明书上的指示操作,仍有可能出错。信号处理涉及大量高等数学的概念,并且很多概念之间经常有循环依赖。
一、“软件无线收发”设备的体系结构
我们将“软件无线收发”比作一种处理无线电波的声卡。下面就是一个简化后,并且以功能块分割后的一个基本“软件无线收发”原理图。大多数“软件无线收发”有三个主要部分:“射频信号放大器”(Radio Frequency Amplifier,简称“RF放大器”),“调谐器”(tuner)和“模数转换器”(Analog-to-Digital Converter,ADC)。
虽然从技术角度上来看,天线并不能算是无线的一部分,因为天线只是“采集”(picking up)无线信号,不过,真要说起天线,还是有很多讲究的。有一些天线的功能可以很好地在多个频率上使用,而另一些天线的功能则只能在一个频率上使用。各向同性天线可以发送和接收(或同时收发)来自任何方向的信号。然而,如果想进行长距离的沟通,那么一个定向天线(如“八木天线”)将会是一个更好的选择。其实有一个简单的原则,那就是在大多数情况下,“软件无线收发”设备自带的天线应该基本足够使用了。
“射频放大器”负责将弱信号功率提高。用户指定的增益值是以“分贝”为单位,表示为“dB”,“射频放大器”所控制的是在没有增益的前提下放大的数量,因为可能接收不到太弱的信号。但太多的增益也会扭曲信号,就像将一个音响的音量开得太大了,一些声音会发生变形一样。还有一些无线是通过增益的多个阶段获得的。除此之外,还包括“自动增益控制”(Automatic Gain Control,AGC),在使用这种设备的时候,它会试图帮您选择最佳的增益值。
接下来的“调谐器”,或者叫“混合器”。就像老式收音机的调谐旋钮一样,“混合器”的作用是选择无线电的频谱部分进行分析。这个过程可以理解为“混合器”将一系列的频率“拉到”到一个较低的频率上。有一些无线处理设备是通过几步完成这一操作的,而处理的信号中包含“中频”(Intermediate Frequency,IF)和“基带”(BaseBand,BB)信号的增益。
最后,无线信号的选择,是通过一个“模数转换器”实现的。“模数转换器”的作用是在进行“采样”(sample)的过程中,将模拟的语音波形转变成数字流。
以图1为例,我们在理想状态下,把整个过程中每一个模块的处理过程放到一起,集中展示出来。“射频输入”(RF Input,即图上的第一行)代表许多传输中的无线频率,您可能会注意到一些熟悉的波段,如FM调频广播、Wi-Fi无线网络,还有蓝牙网络。“低噪声放大器”(Low Noise Ampfifier,LNA,即图上第二行),简称“放大器”,作用是在模拟信号的频谱中增加增益,使信号得到加强。“调谐器”(Tuner,即图上的第三行),在这个情况下,中心频率是800MHz,主要作用是将高频的频谱调谐到基带区域,以方便“模数转换器”的采样。通过配置“模数转换器”,使其运行在每秒1000万的采样值,换句话说,达到10个“每秒百万次采样值”(Million Samples Per Second,MSPS),计算机可以处理的频谱范围是795MHz~805MHz,也就是说计算机可以处理的带宽是70MHz。
图1 理想状态下的“软件无线收发”SDR处理过程
“模数转换器”并不知道正在采样的是哪一部分频谱,其实在“混合器”阶段之后,我们就不知道正在转换的是什么信号了。如图1所示,任何波段的信号均可以混合到“模数转换器”所需要的这10MHz带宽中。最终用户的软件,比如gqrx程序会持续跟踪这一信号的变化,并以图形的方式还原成原来的频率。在分析过程中,会经常看到相对于调谐频率的频率变化值。需要注意的是,分析时总的可用带宽和原来采样信号的带宽是相等的,只是频率位于0MHz左右,并且中心频率位于0MHz。
二、选择合适的“软件无线收发”设备
让我们先看看市场已有的各种“软件无线收发”设备,主要讨论选择一款设备的四个主要特性。
采样率(Sample Rate)/带宽(Bandwidth)采样率就是您能同时看到的最大带宽,通常以“每秒百万次采样值”为单位。看看Wi-Fi无线网络的802.11b/g,或者是“低功耗蓝牙”的信号,至少需要20MSPS的带宽。不过,相比于这些“带宽大户”,我们更多使用的信号带宽都是2MSPS。
动态范围(Dynamic Range)/“模数转换器”分辨率(ADC Resolution)“模数转换器”的分辨率,类似于现代电视上对比度和“每英寸点数”(Dots-Per-Inch,DPI),是以“位”(bit)为单位。较高的“模数转换器”的分辨率一般是14位或16位,这样既可以在记录中分辨出很大的声音和极其细微的小细声音,并且可以对信号中声音的轻微差别进行区分。对于一些要求比较苛刻的应用,如“低功耗蓝牙”加上“全球定位系统”,8位的分辨率可能是不够的。不过,具体还要看是做什么,对于跟踪飞机、解码传呼消息和更多简单的应用上,8位就足够了!
发送功能(Transmit Capability)一些“软件无线收发”设备只有接收功能,而没有发送功能。虽然据大部分的调查工作,大家都是把“软件无线收发”设备作为一个接收器使用。要鉴别设备是只有接收功能,还是兼具收发功能,可以注意一下“软件无线收发”设备的输入/输出配置,即使是具有收发功能,有一些“软件无线收发”设备可以同时发送和接收,一般标注为“全双工”(full duplex),而另一部分则只具有“半双工”(half duplex)的传输能力。
调谐器调谐范围(Tuner Range)调谐器的调谐频率范围决定能够接收的频率范围。例如,如果想接收蓝牙通信数据包,最好确保挑的这款“软件无线收发”设备包括了2.4GHz的范围!
在软硬件产品市场上,有几款“软件无线收发”设备可以使用,表1中列出了其中四个最常见的产品介绍。在后面的介绍中,我们将集中围绕着RTL-SDR和HackRF-SDR这两款“软件无线收发”设备中的技术进行分析,而这两款也是目前可用的“软件无线收发”技术中最常用的。
表1“软件无线收发”设备硬件与功能注释
1、RTL-SDR:入门级的软件无线收发设备
RTL版的“软件无线收发”设备就是作为一款最廉价的“软件无线收发”设备粉墨登场的,这款设备的作用主要是收看“数据广播电视”(Digital Broadcast Television,DVB-T),收看节目遍及欧洲、亚洲和大洋洲。插到您的笔记本电脑的USB口中,只要有信号,就可以看电视。
研究人员Eric Fry发现这个设备是通过USB口发送原始无线信号的波形的。更重要的是,该设备可以在50~1750MHz之间任何调谐。于是他随即编写了一个简单的驱动程序,并增加了支持“GNU计划”中的无线部分。这项开发迅速发展,不久,各地“软件无线收发”设备的无线电爱好者都热追该软件。同时,这款设备的售价也只有20美元,其实物图如图2所示。
图2 RTL版“软件无线收发”设备
不过,虽然20美元听起来对于这样一个基于USB加密狗的RTL版“软件无线收发”SDR设备来说,是相当吸引人的,但也不可否认,这个设备也有一些缺点。比如该设备的晶体振荡器(也可以认为是设备的时钟)很容易发生振荡漂移,从结果上来说,那就是时钟不准,偏差较大,当温度高的时候,这种现象更是明显。比如,您把您的调谐器降到10kHz左右,可当您回来再看的时候,您的无线信道已经漂移出这个范围了。同时,接收到的信号噪声太大,还有系统内部时钟的加工工艺是在28.8MHz的整数倍。
对于RTL版“软件无线收发”设备来说,这是一个理想的无线信息处理设备,并且通过这个设备,可以完成这里所有的例子。这只不过是一个收看电视的小信号接收器,怎么可能成为一个黑客工具?如果您还在迷茫于这个问题而表示不服气的话,那么可以将注意转向网站,您将看到使用该设备所进行的一些最近的项目列表。
2、HackRF:多功能的软件无线收发设备
2014年,Mike Ossmann发布了“HackRF一号”(HackRF One),该设备如图3所示。这是一个灵活的、基于USB接口的“软件无线收发”设备平台。该设备可以在10MHz和6GHz之间进行调谐。可以实现接收功能和发送功能,但属于“半双工”通信模式。HackRF版的“软件无线收发”设备在“软件无线收发”设备系列中,与提供了相同功能的更昂贵的“软件无线收发”设备平台相比,成本相对较低的。该设备包括一个20MSPS的采样率。
图3“HackRF一号”
对于您来说,要开始研究“软件无线收发”技术,RTL版“软件无线收发”设备是进行实验和学习的最低成本的平台。在这里,我们将集中大量的例子介绍RTL版“软件无线收发”设备平台上的应用,还有少量附加的例子则需要使用HackRF版“软件无线收发”设备,这主要是针对那些在功能上想使用超过RTL版“软件无线收发”设备的附加功能的那一部分用户。
另一个基于“软件无线收发”技术的开发平台就是Airspy版的“软件无线收发”SDR平台。Airspy版的“软件无线收发”平台的设计目标就是为了满足“软件无线收发”爱好者人群中,希望功能比RTL版的“软件无线收发”平台多一点,价格又比HackRF版的“软件无线收发”平台少一点的那些人的要求。
三、开始使用软件无线收发设备
接下来,我们将分别在Windows和Linux操作系统上,看看要成功运行“软件无线收发”设备,一些作为先决条件的软件工具是怎么工作的。
1、在Windows操作系统上的下载与安装SDR#程序
在Windows操作系统中,首先介绍的能与RTL版和其他版的“软件无线收发”平台进行交互操作的流行工具是“软件无线收发#版”(SDR#),发音同于“SDRSharp”,是由Youssef Touil编写的。SDR#提供了一个直观的界面,可以用来浏览无线频谱,界面有“瀑布式”(waterfall)视图和“实时信号”视图两种。
在Windows“资源管理器”中,导航到上面安装程序所创建的sdrsharp目录中,以管理员的身份启动zadiag.exe文件。该程序会让用户配置系统驱动程序,以便支持RTL版“软件无线收发”设备的使用。对用户来说,要完成这一操作,需要先单击“选项(Options)|列出所有的设备(List All Devices)”菜单,然后在界面下拉列表菜单中,选择“散装,接口(Interface 0)”(Bulk-In,Interface(Interface 0))的下拉列表项。这时的界面如图4所示。单击“安装驱动程序”(Install Driver)按钮,程序就会开始安装要与RTL版“软件无线收发”设备进行交换所需要的驱动程序。
图4 配置系统驱动程序
“SDR#软件支持通过插件方式增强工具的功能。一组由软件开发者提供的插件列表,发表在网站上,可供用户查阅使用。其实“频率管理器+扫描器”(Frequency Manager+Scanner)插件是由Jeff Knapp开发的,在保存有价值频率时所用的功能时必须用到这个插件,所以建议想要使用这一功能的朋友,先下载并安装这个插件。
2、在Linux操作系统上的下载与安装gqrx程序
就像“软件无线收发#版”软件这样的Windows应用程序,在启动SDR设备的时候,都可以分别设置时间。然而,多数使用SDR设备进行信号分析和解码的工具,都假设您现在使用的操作系统是Linux操作系统。所以虽然后面的例子中,大多数的攻击目标是Linux操作系统的,但如果有可能的话,作为控制SDR设备的软件,我们会尽量介绍一些Windows操作系统上的工具使用的例子。
首先,从网站上下载和安装最新的64位Ubuntu操作系统的ISO映象文件。后面该映象文件可以作为一个Ubuntu的虚拟机使用,但这样做后,系统整体的性能会下降,另外,USB接口对高吞吐量适配器的支持开始变得挑剔,由于SDR设备也是基于USB接口的,所以这也会影响对SDR设备的支持。因此,不建议以虚拟机的方式使用Ubuntu操作系统。
有了Ubuntu操作系统,下一步就是在Ubuntu系统中添加一个第三方程序包文件,这个程序包文件由Alexandru Csete提供技术支持。这个人同时也是gqrx程序的作者,而这个gqrx程序是一个基于UNIX的多种操作系统下的SDR设备工具。这个程序包所在的站点经常会更新这一程序包,有的时候频率甚至比官方的Ubuntu程序包还频繁。这个程序包可以让您轻松地在Linux操作系统上,安装和配置RTL版SDR平台和HackRF版SDR平台。
其次,就是更新软件包列表,安装以下软件包到安装了SDR平台的目录中。
安装了核心的,与SDR相关的软件之后,我们首先要做的事情就是确认RTL版的SDR设备能正常运行。这一步很容易,只要运行rtl_test命令就可以轻松验证:
上面代码中,最后一句的内容是:如果在这儿之后,没有看到更多的输出内容,那就说明您的RTL版的SDR设备安装正确。
RTL版的SDR设备的“主业”是收看多国多地的电视信号,所以有一些版本的Ubuntu操作系统会天真地以为您真的想用RTL版的SDR设备来看电视。因而Ubuntu也会“自作多情”地自动加载该设备的驱动程序,这种“画蛇添足”的行为最终会导致驱动程序访问上冲突。如果遇到了此类问题,简单的处理办法是通过“rmmod dvb_lisb_rt128xxu命令简单地卸载由Ubuntu操作系统安装的驱动程序。
测试程序rtl_test是一个不会停止工作的程序,该程序在运行后会一直处于测试状态,所以一旦认为您已完成了测试工作,按Ctrl+c组合键中止当前的测试工作。在RTL版的SDR设备上,一次只能同时使用一个应用,另外,在RTL版的SDR设备上有一个轻微的小毛病(slightly buggy),即当您关机的时候,偶尔会看到一个“数据段操作失败”的错误,即segfault错误。另外,如果您的设备停止响应,重插一下USB软件狗再试一次,一般问题就可以解决。如果重插设备后问题仍然存在,那就要考虑重新启动SDR系统。
如果只能够以root用户的身份运行rtl_test程序,那么需要安装一个Linux操作系统中的“设备管理器”,名叫udev,这其实是一个以“rules”为扩展名的配置文件,从该扩展名上可以看出,该配置文件中保存的应该是一些“规则”。
如果足够幸运地拥有一款HackRF版的SDR设备,那么该设备也有一个简单的工具,可以如法炮制地使用这一工具验证该设备与计算机之间的通信。这个与HackRF版的SDR设备进行通信的工具,名字叫hackrf_info。
一旦验证试验是成功的,就可以在“命令提示符”中运行gqrx工具了。这个命令的运行权限并不局限于root用户,非root用户也可以使用。与Windows操作系统上使用SDR设备的SDR#程序相比,gqrx程序不仅提供了所在SDR#程序的功能,而且还支持其他有用的功能。
3、使用SDR#和gqrx程序扫描无线频谱
接下来,我们研究如何通过Windows操作系统下的SDR#程序和Linux操作系统下的gqrx程序,对各种无线信号进行分析。
通过RTL版的“软件无线收发”设备,我们要做的第一件事就是监听当地的“调频广播电台”(FM radio station)。这是一个开始的好地方,因为几乎每个人都生活在一些调频广播电台的信号覆盖范围之内,它们都位于全国一致的频率。
SDR#程序和gqrx程序的界面一致,主界面都是由四个主要的“用户界面”元素(User Interface element)组成。其中“音量控制/调谐器”(volume control/tuner)突出位于顶部,我们不妨称之为“1区”。而这些功能都如预期所料,是一个收听调频广播的最基本功能。在左边的一列,是无线配置区,不妨称为“2区”。在这里,主要是由您告诉程序要接收什么类型的信号。现在,输入一个当地的调频广播站调频号码,设置无线“宽带调频”(Wide FM,WFM)。在图5中,我们收听的广播是WBRU95.5的调频广播,当地的一个另类摇滚电台,设置完上面的操作以后,按“播放”按钮或“电源”按钮,就可以开始收听了。
图5 SDR#程序界面截图
“快速傅里叶变换”(Fast Fourier Transform,FFT)区显示的是您的RTL版的SDR设备不停地采集到的“振幅”(amplitude)和“频率”的显示值。不妨称该区为“3区”,其中的竖线(即“3区”正中的黑线),表示的是当前调谐到哪个电台的频率。下面是瀑布显示区,不妨称为“4区”。在这里,显示的是接收信号的历史过程,以时间为单位。当试图找到一个无线电信号时,“3区”和“4区”的数据都被证明是有用的。
虽然我们还没有讨论“频率”和所用的单位“Hz”(中文名也写作“赫兹”),然而,在前面的内容中已多次遇到过这些术语。现在,我们需要知道的是:对于一个信道的“频率”,是电台在使用之前分配到然后由电台告诉我们的。“Hz”,全称是Herz,只是“频率”的单位,一个调频广播电台会占据的一小段频率。以上面的WBRU 95.5为例,虽然95.5MHz是WBRU广播所指定的中心频率,但在实际的传输中,这个频率实际占用的宽度大约100KHz,换句话就是0.1MHz,在以95.5MHz为中心,向两边方向上偏移。这也是为什么电台的调频频率从来都不用偶数结尾的原因。
另一个要注意的事项,就是多个调频电台都在不停地对外广播。而SDR#程序和gqrx程序一次只能解调一个电台的广播。通俗地讲,就是一个这样的设备,一次只能收听一路广播信号。但这并不是程序和SDR设备的限制,这只是因为这个程序并不想让您同时收听多个流。其实只要程序稍做修改,就可以产生额外的线程,来同时收听多个,甚至是所有的电台!
当然,费这么大的劲,如果只是听听收音机信号,那就不值了,因为直接买个收音机,就可以以更容易的方法听调频广播电台了。然而,我们特意使用的是SDR设备,这是因为相比于收音机,可以读取到其他无线电系统不容易找到的频率,比如“广播式自动相关监视”(Automatic Dependent Surveillance-Broadcast,ADS-B)中的无线信号。
通过dump1090工具解码“广播式自动相关监视”系统
首先我们使用专用的应用程序与RTL版的“软件无线收发”(SDR)设备进行通信,这个专用程序就是dump1090。这个程序是由Salvatore Sanfilippo编写的,作者其实在黑客界还有一个更响亮的名字,叫做antirez。从dump1090这个名字来看,1090应该是得名于频率值,因为飞机通常都使用1090MHz的频率发送自己的位置和航班号,与地面空管基站进行通信,而这个程序又与“广播式自动相关监视”息息相关。必须手工下载和编译dump1090手,不过这个很简单,操作步骤如下所示:
命令中的“--interactive”标志会让dump1090程序输出一个标准格式化的ASCII表,“-net”参数会让程序关联到8080端口,而该端口是“Google地图”(Google map)软件所用的端口。
一些航班不发送“纬度”(latitude)和“经度”(longitude)信息。所以有时即使看到有某个航班的消息弹出,但却看不到该航班相关的坐标或航班号。
上面输出的这张表格中,有很多信息是相当令人印象深刻的,这些内容真的是从稀薄的空气中主动以“拉”(pull)的方式读取出来的吗?但是“一张图片胜过一千句话”。打开:8080,随后确实看到了飞机实时的跟踪信息,如图6所示。
图6 飞机实时的跟踪信息
dump1090工具的工作就是解调飞机以1090MHz频率上发出的“广播式自动相关监视”信号。这些信息会被该飞机信号发射功率覆盖范围内的其他飞机以及地面站所使用。数据没有加密,所以很容易在数英里以内接收到,甚至在室内,只要是带有天线,无论是RTL版的SDR设备,还是HackRF版的SDR设备都可以收到!
接下来,让我们特别关注一下SDR设备的另一个功能,那就是捕获业余无线电爱好者的短信信号。
通过gqrx程序解码“自动分组报告系统”协议
“自动分组报告系统”(Automatic Packet Reporting System,APRS)协议大致相当于业余无线电爱好者之间的“手机短信服务”(Short Message Service,SMS)协议,是1993年在“业余无线电频段”(Ham radio band)发送短的基于文本消息(short text-based message)而设计的一个无线协议。通过该协议所发的数据包可以在“中继器”(repeater)补发以后,最终连接到互联网,甚至连接到到国际空间站上!
gqrx工具有一个内置的AFSK1200解调器模块,这意味着可以简单地调谐到144.39MHz,然后选择“窄带FM”(Narrow FM,NFM)模式,再单击软件“工具(Tools)|AFSK1200解码器(AFSK1200 Decoder)”菜单项。那么随后,当设备接收到“自动分组报告系统”信息的时候,这些信息就将被解码出来,并显示在屏幕上,如图7所示的是在“北纬39.2148,西经76.4991”(即图上“3921.48N”)位置处捕获到的“自动分组报告系统”数据包。
图7 被捕获到的“自动分组报告系统”数据包
RTL版的SDR设备可能会有频率的漂移,所以在使用“瀑布”视图查看附近无线电爱好者所发送的数据的时候,数据会略有偏差!
有时可能会发现,在您的程序的“自动分组报告系统”解码器窗口中,一直是空空如也。如果想接收到这些“空野来信”,需要从下面几处建议中排查没有收到的原因。
拨弄一下增益,调调看其他值的情况下是不是能收到什么数据。当有“自动分组报告系统”信息出现时,SDR设备会有很明显的“嗞…嘀…噢…喀”的声音出现。调一会儿增益,正常情况下,总是能听到一个的。
换另一副更好的天线,或者是将天线的头朝向山外没遮挡的方位。
一旦开始收到一些“自动分组报告系统”的消息,就可能想进一步解码这些信息,最好是能将显示的消息中包含有GPS坐标的信息,都以加亮的方式显示。这样的工具也有不少,比如Dire Wolf软件,另外还有Xastir软件,都可以从接收到“自动分组报告系统”数据包中,提取地理位置信息,并且可以将这些信息按这些地址绘制在地图上,甚至如果您有正确的硬件和无线电许可证,对方会要求您回传一个回执信息。
虽然通过gqrx工具,可以将“自动分组报告系统”消息直接接收和解码,但是作为“自动分组报告系统”协议本身,对于业余无线电爱好者来说,还是有一些限制的。而另一个相似的,具有与“自动分组报告系统”差不多的功能,但却被更广泛地使用的协议叫作“传呼网络”(pager network),对于公众来说,更加普及,而且值得高兴的是,我们的SDR设备也仍然可以访问这种协议。
对传呼信号进行破解
我们最后要解码的数字信号,就是“POCSAG传呼”(POCSAG pager)通信数据包,其全称是“基于‘邮局代码标准化顾问组’的传呼业务”(Post Office Code Standardization Advisory Group pager)。寻呼机仍被广泛地运用在医疗和工业领域中,所以对于黑客来说,这仍然是一个很好的机会,通过传呼,可以在家里,就能听到一些外边人相互发送的传呼内容。只要能捕获到这些数据包,传呼的信号很容易识别和解码。由于传呼的使用频率范围在不同的地理位置有显著的差异,所以不得不需要到处寻找传呼可能使用的信号。可以搜索的频率有如下几种:
.152~163MHz,这段频率被称为“甚高频”(Very High Frequency,VHF)
.454~465MHz,这段频率被称为“特高频”(Ultra High Frequency,UHF)
.929~931MHz,这段频率被称为“特高频”(Ultra High Frequency,UHF)
幸运的是,“邮局代码标准化顾问组”协议有一个非常独特的波形和声音效果。当您听到“哔…嘟,哔…嘟”的声音的时候,就说明现在有“窄带FM”(NFM)音频解调信号。将信号通过“快速傅里叶变换”(FFT),信号就会变成“蝙蝠耳朵”的形状,在信号的两端有两个明显的峰值,通过gqrx程序,其显示效果如图8所示。
图8“邮局代码标准化顾问组”协议信号显示效果图
在gqrx工具中,内置了一个“自动分组报告系统”解调器,但这里所用的“软件无线收发”设备中,并没有配置对“邮局代码标准化顾问组”码的解调支持。不过,这个问题也不大,我们可以将这些音频通过UDP协议传送到另外具备对该协议进行解调和转换的软件工具上。整个操作的过程的概述如图9所示。
图9 操作流程图
一旦我们发现了有通过“邮局代码标准化顾问组”协议传输的信道频率,我们需要将这个信道上捕获的音频数据流,通过UDP协议转发出去。要完成这个操作,我们在gqrx软件的“音频”(Audio)选项卡(在前面gqrx程序主界面的右下角),然后单击“音频设置”(Audio Settings)按钮(就是那个“扳手和螺丝刀”图标的按钮),然后选择一个端口,默认的端口值为7355。然后我们单击界面上“两台电脑”的图标开始在本地以“广播”(broadcasting)的方式发送音频流。可以通过Netcat程序(其命令是“nc”命令)进行测试,使用时,将该命令连接到上面指定的端口即可工作,其操作实例如下所示:
因为上面gqrx程序和multimon-ng程序分别由不同的作者编写的,我们必须改变程序音的采样率,以便两个程序可以统一参数。尽管gqrx程序输出音频频率是48个“每秒千次采样值”(KSPS),而multimon-ng程序希望运行在22050“每秒采样值”(SPS)。命令行工具sox可以完成这种转变。不过,在使用这个程序之前,必须首先安装了sox数据包:
sox安装好以后,我们就可以通过该工具将gqrx的输出转换成通过UDP发送的数据包,其命令格式如下所示。
这个命令的前一半是告诉sox程序以“原始(raw)的16位有符号整数”值的形式从“标准输入设备”(stdin),以48000Hz的采样率进行采样。这里的“原始”采样,指的是所采用的音频值没有头部数据,直接全部都是音频采样值,就像我们在wav文件或mp3文件中保存的那样。命令的后半部分是告诉sox程序以“16位有符号整数”值的形式从“标准输出设备”(stdout),以22050Hz的采样率进行输出,同样,发送的时候,采用原始没有头部数据的格式。最后,我们在multimon-ng程序中,接收由sox程序输出的数据,作为自己重新采样的数据。
multimon-ng是一个命令行实用程序,是由Elias nal编写,该程序可以解调许多不同的数字信号。要使用这一工具,我们需要下载和编译该程序的源代码,然后安装编译后的二进制可执行文件。其步骤如下所示:
multimon-ng程序的执行实际上是相当简单的。我们只是告诉该程序希望使用原始格式进行采集(即“-t raw”参数),并且是从“标准输入设备”作为输入源(这是通过单独一个减号“-”作为参数),而且在命令中,给出了一组尝试潜在的调制参数列表。在这组列表中,程序会依次尝试这些组参数,遇到成功即停止随后的尝试,或全部都不成功则退出。“邮局代码标准化顾问组”支持三种信息格式的解码,对于每种格式,multimon-ng程序都有相应的解码模式:
如果我们把所有上述命令集中到一行中操作的话,就会生成一个超长的命令行。这时,这个命令行的格式将如下所示。
shell命令中的“\”表示的是转义符,而该符号后面紧跟回车的话,表示的是当前这一段和下一段的内容是连接在一起的,不仅这个“\”转义符不属于shell命令的一部分,随后的“回车”也不是命令格式的一部分。可以将“\<回车>”理解为只是显示格式上的优化,在命令执行的时候,该符号都将被去掉。
一旦mulLimon-ng程序正常运行,它就会打开一个简单的示波器(oscilloscope)界面显示从输入接口中采集到的数据。下面显示了一个有效的输入信号所展示的示波器界面效果,该图上起伏的波形,正是通过gqrx程序选定的频率后,捕获到的音频频率的一个实例效果。
运气好的话,在程序的界面上将会开始出现滚动的页面。一个传呼数据捕获的实例,内容如下所示,考虑到隐私问题,内容中,部分与技术无关的敏感信息和累赘的冗余信息都经过了编辑,比如,有些都以“XXXXXX”显示,有些以“…”省略掉。
没有这些专业的硬件,能将模拟的无线电波想尽办法转换到ASCII数据的格式,也都是徒劳的。
四、数字信号处理
在“频域”(frequency domain)的范围内分析数据的传输,对用户来说,通常会有一个相当直观的形式化印象,这无论对于信号定位、识别、两信号间比较都是一样。然而,这也只是图表中所表达的内容中的一半内容,另一半对信号的分析,则是通过“时域”(time domain)实现的。下面我们来讨论一下数字无线通信的内部工作机制。
1、最基础的通信
想象一下,在我们十岁的时候,我们需要通过我们的“树上堡垒”(tree fort)之间传送秘密的信息,两个“树上堡垒”之间有一定的距离(如图10所示)。所以就用了花园浇花软管,在软管的一头套上一个气球,然后您在那边的“树上堡垒”中对着软管吹气,您所吹的气通过软管到达我这边,就把气球吹大了。
图10 通过“树上堡垒”通信
通过软管吹气球,我可以向您发送一个消息;如果在预定吹的时候,我没有吹,那么一个瘪的气球也同样表示我向您发送了一个消息,只是这两个消息表示的意思不一样。比如不吹气球表示“送我一块巧克力;我饿了”;那么,吹气球则可以表示为相反的意思。当然,既然这么做可以发送多于一个消息了,所以我们很快就发明了二进制,并且通过上面的方式,约定了每五秒我们之间至少会做一个“吹”与“不吹”的动作,这里的“吹”与“不吹”的动作其实就是二进制传输中“位”(bit)的概念。
很显然,这个方法很快就遇到了一些问题。我们都有了难以说出的节奏感(sense of rhythm),因为有时我需要超过五秒或者更长的时间才能发送一个“位”。这会对接收方带来困扰,对方是发了连接的两个“0”?还是只有一个“0”?或者,在无意识中,您接收的时间起始点,正好是发送方发送过程中的某个点。这都会导致“发送方的发送没有出错,接收方的接收也没有出错,但接收方接收的信息不是发送方发送的信息”的现象。为了解决这个问题,我们发明了一种数据包结构,即在数据中增加一个“校验和”(checksum)。这样,发送方在发送前,先对要发送的数据通过一定的算法算出一个“校验和”,然后在发送的时候,除了发送数据之外,额外加上这个“校验和”。接收方将数据与“校验和”一起接收后,通过同样的方法对数据进行计算,然后将自己算出的“校验和”和接收到的“校验和”进行比较,如果二者一样,则表示数据是对的,不一样则表示或者接收到的“数据”是错的,或者接收到的“校验和”是错的,总之,接收到的数据是错的。这样,我们至少可以确保得到消息的正确性(包括正确和错误两种可能)。
如果您用过像Arduinog一样的微控制器,会知道这是怎样的数字通信工程。上面例子中的软管代表的是信号传输线(或电路板上的走线),吹到气球中的压力代表电压。显然,上面吹气球的这个“系统”具有一定的物理局限性,因为我们只能在一个方向上进行通信(就是吹气),除非我们再拉第二条等长的软管,在另一端套上气球由这边来吹,或者事先约定好,在软管的两端都可以套上气球,并定时切换由谁来吹。同时,如果软管的长度太长,那么要吹大一个气球,将耗费的能量太多了。
2、最基础的无线通信
同样在上面的例子中,我们在发送1和0的过程中,随时有可能会有数据丢失现象。显然,我不能在发送0的时候,把周围所有的大气都吸净,而生成一个真空的环境。同样,我们可以像动画片“Cap’n Crunch”一样,只要吹响哨子(whistle),就可以搅动周围的空气压力以便让您的耳朵可以听到,这样做的好处是双向通信也容易了,但是代价就是附近的所有人都可以接收到我们之间通信的信息。
要想让我们所做的事变得更容易,我们只有把我们的哨子换成长笛,因为长笛有许多个音洞,多种发音的音调,这样,当我们遇到一种干扰源的时候,我们可以“移动”到另一个远离干扰源的通信方式上。
这种原始的例子正在一点一点地接近无线通信工程。大致的意思就是:我一次发送一个“广场”的1,虽然简单,但是也难免出错;但是如果能在传输的过程中,发送一个需要改变的“通知”,然后临时地改变频谱却是件很容易的事。通过下面的一个例子,我们看看能不能理解“邮局代码标准化顾问组”协议的工作原理。
3、在“时域”和“频域”上的POCSAG信号
“邮局代码标准化顾问组”(POCSAG)协议是一个无线通信协议。这个协议的数据传送机制是,从开始时首先拿到一段文本信息,然后将这段文本信息保存在一个有几千字节容量的内存芯片中,再根据数据包的结构将数据打包,最后,将这段打好包后的信息以“位流”(stream of bit)的方式发送到空中,而无线调制模块在调制这些信息,然后将它们依次发送到空中的时候,是以一个电磁波的形式发送的(见图11)。
图11 以电磁波的形式发送信息
在这里,可以看到一个模拟的“邮局代码标准化顾问组”协议编码在“时域”上的传输过程。上面的虚线是帮助您看清楚原始的二进制信息。在这种情况下,“邮局代码标准化顾问组”协议使用两个频率值代表数据,其中较低的频率表示0,较高的频率表示1。这种调制称为“二进制频移键控”(Binary Frequency Shift-Keying,BFSK),也可简称为FSK。利用“树上堡垒”的例子,“二进制频移键控”就像用长笛发出两种不同的音符来表示发送的信息。
回到我们的例子上,在信息结束之前,有人用一个强大的发射器开始与我们进行对话,这就形成了对我们的“干扰”。虚线表示我们的数据仍然是存在的,但由于新的信号叠加进来以后,导致我们很难看出原来的数据信号,如图12所示。不过,在我们放弃这些后来干扰时的数据包时,让我们来检查一直被干扰期间的“频域”信号。
图12“干扰”信号加入后的波形图
两条竖直的“铁轨”瀑布代表的是信道上的每个用户正在发送信号。两个“铁轨”的每一个轨道上,都有两个频率值,而使用这两个频率信号就可以构成上面所说的“二进制频移键控”。如果您看到这个信号的“快速傅里叶变换”图的话,那么这里的两个“铁轨”看起来,会像一对“兔子耳朵”。
比原来信号中的“1”和“0”本身大得多的是“干扰信号”(interfering signal);就是图12中,右边的竖亮条。如果我们让这个信号通过一个“滤波器”(filter),就可以可以把干扰过滤掉,然后留下我们想要的信号,消除不必要的“噪声”(noise)。在“时域”上,这样做就可以消除“干扰信号”,最终让我们看到我们的信号。当然,无论我们怎么做,总是还会有一些“干扰信号”通过滤波器,最后仍然保存在正常信号中;只是我们希望能尽可能多地过滤掉这些“噪声”,防止读取“位”发生差错的现象发生!
4、声音中的信息
到目前为止,我们已经可以方便地将无线通信信号想象成我们经常听到的声音了。但是毕竟二者还不能完全等价,简单地说,二者唯一的区别在于声波和通信用的无线电波之间的传播介质和使用的频率是不一样的。这是一种说法,其实还有的区别就是,不是所有的无线信号都有声音。著名的“木星之声”(Sounds of Jupiter),是由“旅行者一号”(Voyager I)航天器所录,其实名为“之声”,实际上所录的只是在经过这个星球的时候,这个星球表面的太阳风(solar wind)所引发的电磁波的信号值。然后有人将这些信号加速,并且将其转换到人类听觉频率的范围,然后再把转换后的信号通过扬声器播放出来,享受这种“天籁之音”的效果。而实际上,在太空中,是没有我们人类可以听得到的声音的,只有那些听不到的无线电磁波。
可是,换一种角度,我们也可以发现,有好多种无线通信方式喜欢用声音进行交流,比如“自动分组报告系统”(APRS)解调器,以及V.92协议调制解调器。这取决于如何看待它。这些调制解调器的原始设计者意识到电话线有3~4KHz带宽,所以在设计自己的协议产生的电信号时,如果能“看”到这些信号,那会显得很直观,于是他们就把这个带宽的数据当成是声音的带宽,然后将其当作声音。在某些情况下,比如对方传的原始信号恰在声音的范围内,那么这个信号通过“声音耦合器”(acoustic coupler)后,在调制解调器上还是可以听到声音,这时,就相当于有两个持有手机在通话一样。
抛开上述个别比较钻牛角尖的事例之外,整体上,您应该对原始的无线通信理论有较好的理解。下面就将结合这一新的认识去攻击脆弱的无线设备。
攻击车库入口的电子钥匙
SDR设备的功能远远超过我们已经展示的上述,在生态系统领域内有限的应用。当然,“好马还要配上好鞍”,除了SDR设备本身,还要有dump1090程序和multimon-ng程序的鼎立支持。其实,“好马好鞍之外,还要有好的骑师”,那就是对于SDR设备,有什么样的工具能从“无线轮胎压力监测系统”(Wireless Tire Pressure Monitoring System,TPMS)以“拉”的方式拿到数据呢?在一次模糊测试中,又有什么应用程序允许发送任意格式的“全球移动通信系统”(GSM)协议的数据包呢?这下麻烦了,我们大概要东拼西凑地去各处找针对具体应用的这些程序。其实则不然,想想这个设备名字中,本应属于“硬件”来做的“无线收发”,现在却改成了“软件”来负责,这其实就足以说明,即使是针对上述不同的应用,通过软件的定义,我们仍然可以通过SDR设备进行控制。
下面我们将分析“无线电子钥匙”(wireless key fob)系统,并试图确定该设备是否存在容易遭受攻击的漏洞。
像所有真正的入侵一样,黑客需要一些努力、技巧、耐心和运气。这种类型的分析一直是充满着挑战性,心脏脆弱的请绕道离开!
5、挑选攻击目标
找到一个“开关键控”的发射器应该不会太难。在您的房子周围,可能就有多个这样的设备是采用“开关键控”技术的,比如车库门遥控器、汽车的电子钥匙、气象站、门铃、智能喷水枪。我们建议先从一个廉价的无线门铃,或者简单的车库门开启装置开始,因为越便宜的无线设备,越有可能采用“开关键控”技术。
在这次攻击中,我们的目标是“精灵公司”(Genie Company)的车库门开启装置。不需要为了检验这里的内容而专门再买一个这样特定的产品,因为这里介绍的是通用的步骤,这些对付这类电子产品的技术可以直接应用于您所选的其他电子产品上,一般情况下,同样可以作为您自己攻击实验中的目标。
设备的侦听
虽然,进行“黑盒测试”(black-box testing)是完全有可能的,但那样只是对于一个初学者才采用的方式。为了减少这里攻击情节描述的复杂性,现在,我们假设您已经能对要攻击的电子设备进行物理层面上的访问,换句话说,就是您可以走的离车库电子门足够得近。那么第一个问题就是“什么是FCCID?”,“美国联邦通讯委员会”(Federal Communications Commission,FCC)是一个组织的名称,大多数的无线设备,若要在美国销售就必须符合该组织的“FCC Part 15”条例。“美国联邦通讯委员会”维护着一个兼容设备的在线数据库,提供对各种电子产品的测试“记录”(test record)、“所分配频率”(frequency allocation),“产品用户手册”(manual),甚至产品内部的照片!“美国联邦通讯委员会”会为每个设备编一个唯一的识别码,有了这个概念,那么FCCID就是“美国联邦通讯委员会设备编码”。
通常情况下,“美国联邦通讯委员会设备编码”(FCCID)会印在装置的背面,有时候该码也会直接在设备模具的外壳塑料上塑模成型,也有时候只是简单地在外壳上印上一个标签,在标签上打印或手写上这样的编码。如果在设备上找不到编码,那就检查包装盒或说明书。找到这个“美国联邦通讯委员会设备编码”之后,就可以通过“美国联邦通讯委员会”的网站进行查询。
图13 车库门遥控器上的FCCID
如图13所示,这个车库门遥控器上的“美国联邦通讯委员会设备编码”是“B8QACSCT”,乍一看,我们也看不出什么意义。要想知道每一位的明确含义,我们需要知道该编码的组成结构,这个ID值可分为两个部分,分别是“受让人代码”(grantee code)和“产品代码”(product code),其中,“受让人代码”由三或五个字符组成,剩下的那当然就是“产品代码”了。对于这个实例,“B8Q”就是“受让人代码”,而“ACSCT”就是“产品代码”。把这两个值输入到“美国联邦通讯委员会”FCC的网站后,可以查询到一组产品文档的列表,本实例中,查到了两个结果,如图14所示。对这些文档的内容稍稍进行一点点的信息挖掘,我们就会发现这款车库门遥控器的无线频率被分配到390MHz上,如图14产品列表中,最右边一列字段所示。
图14 实例查询结果
没有上述这些信息,我们就只能通过gqrx工具在空气中,通过暴力破解(brute-force)的方式,搜遍所有频率来找这个无线车库门遥控器的频率。这种情况也不是不可能的,每次当我们按下“搜索”按钮的时候,当然心里希望能有所斩获,只是有些时候,用些巧劲儿又是完全必要的,比如如果某次攻击中,必须得靠暴力方式找到对方所用的频率,若要搜索的产品属于工业(Industrial)、科学(Scientific)和医疗(Medical),三者常被合称为“ISM”,那么它们三个行业产品的无线频率,一般分别开始于315MHz、433MHz和915MHz。如果采用更高的采样率,将会不断地看到更多射频频率的频谱。
6、查找和捕获射频发送信号
我们将使用一个新的工具,名叫osmocom_fft。该程序的用户界面是一个精简版gqrx程序和SDR#程序,不过该功能注重的是实用而不是功能繁杂。我们的目标是找到要捕获无线设备的信号,所以该软件主界面图的正中间,就是频段的中心,在图中设定好中心频率以后,再选择一个合适的增益,并将这些参数保存到一个文件。
下面就可以运行RTL版的SDR设备,中心频率设定为390MHz,采样率设定为2.5“每秒百万次采样值”(MSPS)。这给了我们一个“大水桶”(wide bucket)来装所捕获到的信号,这是为了防止某些无线电子设备万一不按“美国联邦通讯委员会”规定的频率值发送数据的时候,我们也能捕获到。另外,我们也把射频增益调在某个地方的中部,对于增益这种耗大、影响极大的参数来说,仅凭预感,我们就知道电池可能很快就能耗掉一半。最后,我们知道这些无线设备信号传输持续时间将是很短的,想想按一个汽车的无线钥匙还能用多长时间呀,多数情况下比眨眼还快。为了让我们不错过对方的每一次按键,我们不妨启用“峰值保持”(Peak Hold)功能。
一旦我们按下了车库门遥控器的按钮,在软件osmocom_fft的主界面上,我们就会看到一个突发的活动,在390MHz的左边一点,如图15所示。这是我们第一次尝试就抓到的第一个信号。不用说,在实战中,我们并不总是这么幸运。
图15 在软件osmocom_fft上看到的突发活动
虽然我们找到了要找的信号,我们还没有准备好去捕获到它。在这个例子中,我们所设的增益值太高了。所以在该频率的左边和右边,分别都出现了一些干扰导致的扭曲,解决这个问题,我们可以降低增益,直至这些扭曲消失在噪声层(noise floor)中,如果看到“载波振荡”(carrier wandering),那就每次给予100KHz的微调,因为这种偏移不是接收机造成的,而是对方廉价的无线车库门遥控器造成的,可以说这也是廉价的“开关键控”类发射器的共同特点。您可能也注意到图的中心一个直流的“穗”状毛刺,这是射频测量系统中的一种常见伪影现象(artifact)。调整您的信号“偏移量”(offset),一直到直流的“穗”状毛刺不再干扰您的正常数据!
剩下要做的就是将捕获到的数据保存到一个文件中。按下右下角的“录制”(record)按钮后,应用程序就开始将射频采样的数据保存到硬盘中了。连续捕获两个或三个好的发射数据以后,就可以再次单击“录制”按钮停止当前录音。
7、通过盲测发起“重播”攻击
示例中的这个车库遥控钥匙是很老的型号,所以只要简单地将上面捕获到的数据包简单地“重播”(replay)一下,就可以打开车库的大门。打开HackRF版的SDR设备,后面的处理过程非常简单,注意在osmocom_fft软件上的设置,主要是“频率”、“增益”和“采样率”三个参数。接下来,就可以开始捕获的过程了,这里用的是HackRF版的SDR设备上自带的hackrf_transfer程序。其命令格式和运行效果如下所示:
采样的数据都被保存到一个文件中。命令中的“-a”参数、“-l”(小写L)参数和“-g”参数主要分别用于调整“幅度”,“低噪音”(low noise),和“中频增益控制”(intermediate frequency gain control)。另外,“-f”参数是以Hz为单位的采样率。如果想知道该命令中更多有关参数的信息,可以运行“hackrf_transfer--help”。在完成采集数据的记录以后,按Ctrl+C停止捕获过程。
要重传这些信号,以发运“重播”攻击,可以运行以下命令:
在这个例子中,“-x”参数的作用是设置发射增益。这个参数具体选什么值,当然就是“仁者见仁,智者见智”的事情了,一般都是“看不同人的口味下调料”。除非碰巧有一个频谱分析仪,可以帮您确定需要设置多少发送信号的输出功率。您可能会认为存在一个0分贝(dB)的增益值来发送原始信号,但实际中这种情况是不可能存在的,因为发送0分贝的增益就意味着您的发射器必须位于一个“极度安静”(quietest signal)的场所中。
假设您站在车库门附近,我们发现10~20分贝的增益就可以很好地捕获信号。但如果没有发射天线连接到您的无线收发设备中,一个噪音的干扰就有可能破坏,甚至摧毁设备中的模拟电路,所以一定要确保您的天线是与您的SDR设备是硬件兼容的!这里所说的“兼容”不是尺寸上正好可以安装,而是指二者要匹配正确阻抗(impedance),阻抗组一般在50欧姆(ohms)左右,并且在操作前就将频率设好,直接设为目标的工作频率。
如果设备不工作怎么办?
设备的正常工作,通常是所有环节设置都对的结果,但导致设备不能正常工作的原因太多了,所以面对“如果设备不工作,该怎么办”这样的问题,答案就是“没有直接的答案”。这种练习就像是“撬锁”(lock-picking),谁也不能说哪种方法就是好的,哪种方法就是对的。“自己动手,丰衣足食”,通过您对SDR设备工作原理的理解,需要自己开发出一套直观的操作流程,然后借助于您自己的流程,操控SDR设备,完成攻击,并且在某些情况下,需要的纯粹是运气。对于创建符合自己习惯的套路,我们可以给您一些想法,但是没有承诺。
如果您攻击一个廉价的无线门铃,或是一个旧车库的电子门,这一招应该很灵。攻击上述设备失败的主要原因,最大的可能是您的SDR设备的发射信号太弱导致的。解决方法也很简单,逐步认真地加强发射增益,并尝试重新接近这些无线设备的接收机。如果还失败,那就是您的信号仍然还是太弱,继续尝试加大到更大的接收增益,直到显示出接收的波形。
现代车库的电子门和汽车,都在安全系统上有了较大的改进,很多产品都通过“滚动码”实现。这样做的好处是,即使您偷偷录制了某个电子门或汽车的上一次通信数据包,但由于电子门或汽车在使用一段时间以后,就自动滚动到下一组值上了,所以即使通过“重播”攻击,也许只能有效地使用一次,也许根本连一次也用不了。在录制远端通信的过程中,如果想“重播”看看效果,也要确保您的距离足够远,以便对方的电子门和汽车接收器无法“听到”您发的“重播”信号。对于现代的电子门和汽车系统,这些录制的数据通信包应该尽可能早地使用,因为先进的系统可以在某个编码使用一段时间以后,自动终止该码的使用,而更换成新的编码,这个时候,再用原来保存的旧码通过“重播”攻击方式进行攻击就没有效果了。
现在我们已经检验了捕获和“重播”功能,所使用的实例就是开启一个简单的车库电子门。下一步,让我们进入到一个更高级的攻击方式,即攻击一个“免钥匙开门”的汽车系统。
攻击“免钥匙开门”的汽车系统
根据前面我们破解车库大门电子锁的那套设备和操作流程,我们使用了相同的认证手段、相同的捕获数据包方式、相同的“重播”技术,的确打开了一次它的车门。不过,当我们想第二次打开的时候,我们发现之前捕获的数据包已不再有效。难道“Mini Cooper”使用的是“滚动码”机制?或者车锁系统采用的是“质疑响应”(Challenge response)机制?我们不得不回过头来,从自身的操作流程和分析思路上找问题的原因和解决办法。既然前面我们已经将捕获到的开门无线信号的波形记录到磁盘上了,那么我们就不需要再从捕获无线信号这一步开始了。
我们使用“‘GNU计划’中无线部分同伴”(GNU Radio Companion)设计一个信号处理算法,来还原从无线车钥匙上捕获到的数据包。我们的算法将非常接近于那个我们正在分析的无线电子车钥匙的型号,所以您需要在这些设备上改变这些步骤的时候,只需要进行微调即可,当然也不排除有大幅调整的可能。而且,这种设计方法是非线性的(nonlinear)和实验化的(experimental),所以要想在最大程度上获得成功,我们需要关注的是概念的内涵(implicit concept),理解它想表达的深层含义;而不是“邯郸学步”,只是简单地模仿前面各个明确的操作步骤(explicit step)。
“GNU计划”中无线部分的“Hello World”当我们要创建一个应用程序的时候,通常会先构建一个框架,然后借助于这个框架来验证当前的工作是不是有益的。对于现在要进行“Mini Cooper”车门只能接受一次“重播”攻击的事实,我们要建立的框架就是将一些信号加入到一个“快速傅里叶变换”数据块(FFT block)中,并且确认一下,我们确实看到了相同的发送数据包,而这个发送的数据包正是我们之前记录的。记录的步骤如下。
(1)打开gnuradio-companion程序,这个程序可以让我们通过对所用数据包的选用数据块(using block)的拖放处理(drag-and-drop process)设计出我们自己的信息处理算法。
(2)按下Ctrl+F组合键,查询“文件源”(File Source)数据块,然后将选中的块拖到“工作区”(workspace)上。
(3)双击“文件源”(File Source)数据块,就可以打开该数据块的“属性”(properties)窗口,单击窗口中的标题为省略号“...”的按钮,就可以打开文件浏览器,并选中所捕获的文件。
(4)查询“减速”(Throttle)数据块,将该数据块放在“文件源”数据块的后面。单击“输入”(In)和“输出”(Out)选项卡就可以将这些信息插入到“减速”(Throttle)数据块中。这个数据块的作用是负责限制采样样品从磁盘文件中的读取速度。除非使用的是一块硬件(例如声卡或SDR设备),否则应该在流程图(flowgraph)中的某个地方包含这个数据块。
(5)在“减速”数据块的后面放置一个基于QT的图形化频率接收器,然后连接上去。当运行这个程序的时候,程序将会在输出显示中增加一个“快速傅里叶变换”视图。
(6)确保“选项”数据块(Options block,通常在界面的左上角)是用于生成一个QT图形化界面的设置,而不是使用WX工具包(QT最终会成为gnuradio-companion程序的图形化界面)。
(7)打开名为samp_rate的“变量”数据块(Variable block),将该项设置成与文件的采样率相同的值。我们在osmocom_fft程序中使用的是1个“每秒百万次采样值”(MSPS),所以我们进入1e6(或1000000)。这个变量是全局和传播在工作区中的所有数据块。
以C语言为主的编程中,数字的科学计数法表示形式。1e6等价于1×106,即100万。
(8)将上面流程保存到磁盘文件中,然后单击绿色箭头来开始执行程序。
在设置的时候,要确保您的samp_rate值设置的是正确的。许多“数据块”操作都需要知道两次采样之间的这个时间段长度,比如说“滤波器”就与采样率关系很大。另外,虽然同为“数据块”的名称,但不要在上面的概念中混淆了“减速”数据块的作用,“减速”数据块只影响文件处理的速度,而不会影响到收发速度怎么处理。
在图16只有一个峰值了,一峰值就意味着只有一个“开关键控”发射器。如果看到两个峰值,那您的设备可能是一个“二进制频移键控”发射器。保持这种状态继续监听着!还应该能够得到一些数据;只是我们得多做一些工作才能够关联并得到这一些值!
图16 我们的第一个“GNU计划”中的无线程序,包含了程序的输出
信号波形加工:在我们的例子中有一个非常干净的信号,中心频率接近于0Hz。大约40dB的信噪比(Signal-to-Noise Ratio,SNR)是一种优良的低数据率数据,很像前面提到的“开关键控”发射器。如果设备所接收到的信号中有干扰信号,或很弱的信噪比,那么可能需要对您的信号波形进行加工。虽然不能改变您的信号所对应“底噪”(noise floor)的振幅,但是可以去除噪声,有效地提高信噪比,这个过程可以通过以下步骤实现:
(1)从前面的步骤中,使用“快速傅里叶变换”公式,写下您的信号占用频率的范围。在我们的例子中,信号之间运行在-100kHz和+100kHz之间。
(2)如果您的信号是接近您的图形的中心,那么使用一个“低通滤波器”(Low Pass Filter)。并且放在“减速”数据块和“快速傅里叶变换”之间。
(3)如果您的信号向一侧发生偏移,可以使用“复用”数据块(Multiply block),配以余弦函数(cosine)调用,将其调谐到中心点上。然而,这样可能会发现使用的“带通滤波器”(Band Pass Filter)会更容易。
(4)设置您的滤波器的“截止频率”(Cutoff Frequencies)和“传输带宽”(Transition Width),并重新运行程序。在这个例子中,我们配置了“频率接收器”(frequency sink)同时接收两个流,所以我们可以比较它们的之前数据和之后数据的差异,如图17所示。
图17 配置频率接收器后接收的两个数据流
什么是一个合适的滤波器?如果我们从开始到结束,设计的是一个高性能的无线滤波器,我们可能需要使用“匹配的滤波器”(matched filter),这样可以利用一个已知的信号更可靠地检测到一个未知的信号。然而,这更多的是一种“餐巾纸的背面”(back of the napkin)式的逆向工程项目,同样,现在仅仅是设计一个滤波器,通过该滤波器让您的信号在通过的时候去除掉您不要的那部分频谱。
也就是说,数字滤波器不是让信号更自由地想到哪个频段就到哪个频段,而是在传输的时候,限制在更窄的带宽范围之内。带宽越窄,您的滤波器就与CPU关系越大。选择一个比您的采样频率略少百分之十,可能会使您的模拟显得更缓慢。在这个例子中,我们将“低通滤波器”设置在任一方向上允许+/-100kHz的变化范围,这样可以将下一个100kHz内的噪声逐渐减弱。您可以在前面的图像中看到,在滤波器滤通区域之外的“底噪声”显著地下降了。
解调“开关键控”发射器 该过程的下一步,是瞥一眼正在发射的实际的数据“位”。这里,我们需要引入两个新的数据块。“复数型Mag”数据块(Complex to Mag block)负责解调“开关键控”发射器,和“QT图形界面时间接收器”数据块的作用是及时将解调后的声波输出出来。如果碰巧有一个“二进制频移键控”信号,那就用“正交解调器”(Quadrature Demodulator)取代“复杂型Mag”数据块。
在放置数据块的时候,需要注意“复数型Mag”数据块的选项卡的颜色将会由蓝色变成桔黄色,变化的原因是因为数据类型已从“复数”变为“浮点数”。令人遗憾的是,我们没有足够的空间来讨论复数型信号。在任何情况下,都要确保配置“QT图形界面时间接收器”(QT GUI Time Sink)的数据类型是“从复数型到浮点型”(Complex to Float)这个选项。
“QT图形界面时间接收器”是一个复杂的数据块,有许多配置选项。图上所选择的参数值,也正好是将根据上面例子中所用的参数值。这些选项可以在运行时通过双击图上区域进行查看。
第一次时,我们按这个流程图的顺序运行程序,迎接我们的是部分数据“位”因为数值不停地变化,而从整体看上去在不停地闪来闪去。回想起来,这是有道理的,因为我们已经将“QT图形界面时间接收器”的值配置为一次显示1024个采样值。对于一个有1个“每秒百万次采样值”(MSPS)变化率的采样值,每个值只能在窗口中显示短暂的1毫秒,那数据位不闪反而不正常了。找到问题所在,解决方法也很简单,在图像中间单击菜单,我们配置数据块显示的点数为“100倍速”显示(即“100 x”)。这样,一旦有一次数据发送出现,我们就可以停止当前的显示,操作方法仍然是在图像中间单击一下菜单。然后按下鼠标左键,拖动出一个“缩放框”(zoom box),以便让系统知道我们想看的区域,然后系统就只显示这个区域内的图像内容。如果想调整图像内容的大小,可以通过右键鼠标缩小(zooms out)图像,左键鼠标放大(zooms in)图像,或者可以使用鼠标滚动轮进行调节,其方式和其他程序通过滚动轮调整大小的方式一样。
在图18中,可以看到,数据流的部分是由1和0组成。每一个“位”看起来和旁边相同的值的“位”看上去都有些不同,这是系统中的噪声造成的。如果信号传输的距离远一些,那么“位”的振幅会减小。如果噪音太大,或信号的幅度太低,那么可能会在记录某一位的时候意外地出错。
图18 调整后的数据流
对信息进行解码的方法之一,是把一个屏幕的窗口进行截屏,然后手工地录制每一个比特位。这也是一种“把自己搞得头晕脑涨,失去仅有的那么一点理智”的伟大方式,这样做很容易让电脑明白和理解我们。除此之外,“时钟恢复”(clock recovery)也是一个最复杂的、令人沮丧和棘手的一件事。另外,因为我们对“逆向工程”(reverse engineering)就是一个睁眼瞎,所以想知道我们正在做的这一部分是否正确,也是件很困难的事。最重要的事情是我们可以帮助您设计自己的系统,那就是放置一个“时间接收器”(Time Sink)到流程图的每一步,这样只要您在每一步中检查时间接收器的结果,就可以确定所输出的结果是不是您所期望的值了。
首先,我们必须确定一下,数据“位”发送的速度有多快,换句话说就是“波特率”(baud rate)的值有多大。在传输开始时,首先传的是“前导码”(preamble),这样对于同步定位是有帮助的。“前导码”通常是一个值为“10101010……”的字符串,并且在通信的时候,“前导码”会重复地发送足够多次,以便帮助作为接收方的计算机“锁定”时钟。通过使用“时间接收器”,我们算出它花了大约2.1毫秒发送10个数据“位”,做一个小小的除法运算,也就是4761比特/秒,因此我们使用最接近的波特率值为4800波特,因为对于串行端口来说,这是一个有效的波特率,在这个波特率中,我们有足够的信心可以保证数据传输的正确性。
很简单,就是10×103=4761.90。
在速率为1个“每秒百万次采样值”(MSPS)时,每个“位”将有208.3个采样。这是一个很大数据量的样本!我们配置的“低通滤波器”将其除以20,也就是说每20个采样,只取其中1个。那么这样,每一个符号“位”就给我们留下了约10.4个样本。通过使用“Marker”标注“时间接收器”,我们可以看到实际的采样值,如图19所示。
图19 通过Marker标注“时间接收器”,看到实际的采样值
在图19中,可以看到的数据代表的是“1011”(至少我们非常肯定,我们没有看到有一位少于10个采样)。每一个“位”刚刚超过10个“采样/符号”。我们的目标是将这个值再下降到每个“位”一个采样,并将其写入一个文件。我们通过设置“决策阈值”(Decision Threshold)约为0.5。这样采样在大于这个值后,就会知道哪个位代表数字1,剩下的位当然就代表数字0。
您可能会天真地认为,配置一个“低通滤波器”,然后再除了208就“足够好”了,(1个“每秒百万次采样值”除以208约为4800Hz)。但很快会发现,不幸的是,“时钟抖动”(clock jitter)会引起数据“位”的错误。一个更好的方式来做这件事是使用“时钟恢复”数据块。您可以告诉这段代码您对每个符号会产生多少采样,这样一来,整个系统就会表现得很好,并且尽最大的努力智能地挑选每一个数据“位”。
“时钟恢复”数据块是很微妙的,它的工作就是提供一个每个符号采样四次的滤波信号。只要试着将“时钟恢复”数据块的输出与您的“输入信号”(Input Signal)做一个对比,就会发现有趣的现象,那就是因为采样率发生了改变,所以最后导致您需要两个独立的“时间接收器”。试着建立起这样的触发机制有助于后面数据的捕获。
因为这里的“时钟恢复”数据块输出了一个“估计位”(estimated bit),所以我们需要做出一个决定。“二进制识别器”(binary slicer)将会把正的采样值(positive sample),也就是大于0.0的采样值识别成“逻辑1”(logical 1),而把负的采样值(negative sample),识别成“逻辑0”(logical 0)。可以指定“减速”值,以便使用“减速”数据块帮助滤波器输出这些数据“位”。
在这个系统中的一个有趣的数据块,就是“根升余弦滤波器”(Root Raised Cosine Filter)。这种特殊的滤波器只用于数字数据。配置输入采样率和预期的波特率,它就会通过删除不必要的频率,平滑地输出比特位。正确使用“根升余弦滤波器”,可以帮助我们得到一个较低的“误码率”(Bit Error Rate,BER)。
图20说明了一个可以可靠地工作的解决方案。应该指出的是,这种设计只适用于在“实验室环境”中可以良好地工作,因为“实验室环境”中,一切传输条件都是理想化的。而对于一个在野外的环境中进行工作的系统,设计更为复杂,并且涉及大量的参数微调,如果把这个系统安装在您的车中,会发现您只能对在10英尺范围内的汽车车门进行开锁的破解工作。
图20 终极“开关键控”发射器解调方案
经验丰富的信号处理专家可以在上面方案中指出一些糟糕的设计选项。比如,在流程的正中间,我们决定需要有“减速”选项的地方都放置了“减速”数据块。另外,我们任意地选择了0.5作为一个“减速”值的参数。然而对于这个“减速”值需要设置多低,我们仍然还能接收到信息?也许,额外的分析和滤波器的结构,可更好地提高对传输数据捕获的可靠性。
一旦我们有数据“位”输出,我们就需要从中找到我们所需要的信息,并且显示出来。这时,应该多注意那些在每个传输开始的“前导码”,因为这之后的,才是发送的内容部分,为此,我们专门写了一块叫“模式输出”(Pattern Dump)的数据块。可以配置一定的模式,然后进行搜索。当这个数据块的运行中发现有合适的模式,就会打印随后的N个字节到屏幕上。或者,也可以按位次把这些数据“位”拼凑成一个一个的字节,然后依次将它写到一个文件中,用于以后分析。
8、还有什么遗漏吗
下面的内容,就是通过上面的信号处理流程输出的结果中的一小段。
从整个文件的内容来看,很明显,有人使用电子钥匙首先发送了一个长的“前导码”。跟着连续发送了4次相同的信息,看上去这把电子钥匙是拿错了。如果我们的车没有接收到第一次所发的消息,那么电子钥匙还有三次开锁的机会。在文件中深度查找,我们可以找到五次相似的块信息。
我们注意到一件奇怪的事情,没有消息顺序地依次超过两个1秒的时间。有一些无线电使用“曼彻斯特编码”(Manchester encoding)避免“1秒”的长串是“背靠背”(back to back)的形式。也就是说当出现一长串1或一长串0的时候,“曼彻斯特编码”可以有效地避免接收方无法通过“时间恢复”数据块进行同步的问题,这是因为“曼彻斯特编码”将要传送的数字“1”转换成了二进制的“10”,而将数字“0”转换成了二进制的“01”,所以无论传输什么样的值,中间总有一个“跳变”的过程,因而十分利于“时间恢复”的操作。
在配置“模式输出”数据块以后,就可以完成“曼彻斯特码”的解码工作,如上所述,我们可以从中恢复出可靠的比特流数据,如下所示。不过,有些与被攻击汽车门锁上,带有隐私性质的数据都已去掉。
尽管我们还没有完全做到通过逆向工程破解这把电子钥匙,但是看上去,上面的数据中,好像有两个字段正在发生变化:一个16位的字段和一个32位的字段。如果我们重复使用第一次的消息会发生什么呢?是这次能够把车门打开,还是显示代码已过期?16位字段的第二字节为什么一直以3为步长进行增量累加?为什么锁车按钮所发送的数据,每次会有如此惊奇的不同?这辆汽车能够反过来跟电子钥匙进行数据传输吗?
要回答这些问题,唯一的办法就是收集更多的数据。在您理解了车锁和电子钥匙之间通信协议的详细格式以后,就可以进展到实时修改程序的工作了,然后就可以将这一方法扩展到其他车型的车锁和电子钥匙上。在某些时候,甚至可能会尝试构建一个发射器,然后通过暴力的方式破解这些汽车的车锁安全系统。
五、结语
这些SDR设备对以前的无线攻击进行了重新定义,因而黑客的兴趣都转向了如何做好一个个人预算,以便购买更好的一款SDR设备。本文首先介绍了每一款SDR设备的重要特征,这对于黑客选择SDR设备都是非常重要的建议。然后介绍了许多可以用于数字信号解码的第三方的应用程序,有一点好运气、耐心,加上一个具有发射功能的SDR设备,您就应该能够进行一些基本的“重播”攻击,这样至少可以破解大量常见的电子设备。对于技术深厚的朋友来说,他们应该有更坚实的基础,可以运行与本文实例相似的攻击方案,并将无线信息解调,使之恢复到它们原来作为二进制有效载荷时的状态,因为这是下一步进行分析、修改、重新攻击的基础。
您现在在对无线安全方面进行研究的时候,都需要将SDR设备工具作为您的攻击装备随时携带,这些工具毫无疑问都是必不可少的。