本文章主要讲述了我们在2021年Geekpwn比赛上展示的第一个项目——超声波定向传输,感兴趣的师傅可以来看看。
Geekpwn 2021—— 超声波项目解说
这篇文章背后的故事可谓是惊心动魄、意外频频,又峰回路转。我们本次作为NISL物联网安全研究小组参加Geekpwn2021,超声波项目有幸被Geekpwn组委会选中,在此十分感谢Geekpwn组委会的认可。
满怀欣喜的我们大包小包地带着项目所需设备飞到了杭州参加录制,万万没想到这次比赛经历注定不同寻常。
传音入密
这个题目是Geekpwn给我们的项目起的名字,还是比较贴切的,有某种特工的意味。本质上这个项目利用的是超声波的物理性质,结合一些天线整列的基本思想完成的设计。脑洞比较大和传统的网络安全项目最大的不同是展示的方案没有任何代码的元素,完全是电路设计、信号处理。
技术原理
不多说“片汤话”,直接说原理。
基于非均匀介质对不同声音频段吸收系数不同,对调制过后的声音信号产生自解调效应。利用自解调过程逐步将超声波探头阵列发射出的高频调制信号中的低频声音信号与高频载波信号分离开。经过一段物理距离使人(机器)听(接收)到。
超声波扬声器阵列依据天线阵列的设计原理,进行布阵。通过CST/HFSS等仿真软件仿真,调整排布,最终找到适合的阵列口面大小Ae,布阵拓扑结构。经过仿真、实际测试发现,对超声波覆盖的角度起主要作用的因素是天线口面大小。
理论计算
黑客界有一句名言‘Don’t talk too much,but show me the code.’光说说这个原理不来点公式总觉得是在忽悠。(为了公式显示清晰下面我直接粘上截图)
通过这个最后的公式,可知随着传播距离的增加“自解调”现象会越来越明显。
这里留一个工程性问题,就是这个“自解调”现象,从算式上看仅与一个非线性空气因子beta相关,结合不同地区的空气(不同湿度、温度、天气···)这个声音“自解调”的效果会有差异。
结合常识不难想到随着距离的增加,有限的能量终将会消逝,这里存在一个最佳解调区域留给各位师傅去探索了。
具体实现
相信这是各位读者最关心的部分,看了那么多公式推倒也没有什么作用,对实现来说只能起到一个指导性作用。下面就来阐述我们实现的两种方案。
PWM 调制设计方案
比赛场上我们展示的是这个模式,因为距离上的限定——要求比较高的功率传输,所以展示的是这款(采用半桥放大器L293DNE)。另一个采用L386N-4功放的方案,之后也会阐述。
半桥放大器L293DNE(数据手册 https://www.ti.com.cn/cn/lit/ds/symlink/l293d.pdf )这种半桥放大器的输入要求是ttl信号,不可以是音频模拟信号(各位师傅可以买来试试直接通模拟信号会发生什么lol),这个输入电压信号形式,正好满足这种PWM方案的要求。
实际上,两种方案都涉及到原声音信号的采集,毕竟没有采集(采样)调制就无从谈起。一开始方案中采用NE555这个时钟芯片自带的pin-5 触发引脚对音频信号进行采样、调制工作,相当于一个简易版ADC。可是这种纯电路方式需要时常调参,并且效果也不是很好(基本调不到最佳水平),于是,我们便替换成stm32开发板完成音频的采集、调制工作。
最佳水平——
要保证载波输出PWM信号方波占空比接近50%,这个参数决定后期音频质量。为什么这个要接近50%,一言以蔽之“为了最大限度地‘复刻’出声音信号。”
来上一个信号仿真图:
图中左侧为50%占空比输出载波,调制后声音信号频带范围下频谱,右侧不是50%(记得是70%正占空比),这种情况下原本的低频声音信号调制后会有很多高次谐波分量,极大地影响最后音质的效果(自解调后会有刺耳的声音或者可以听到的声音很小)。
通过stm32开发板,就可以很好的解决模拟电路通过插拔电阻或转电位器麻烦且极其不准确的调参方式。(开发代码还需进一步改进,先不公开了)
经过调制的信号还是不可以直接接负载(扬声器阵列),声音太小,即信号峰峰值很小。因为stm32板不可能输出一个36V峰峰值的电压信号(L293DNE最大工作电压36V),需要把这个调制信号进行放大处理,才能通过最后的扬声器阵列传输一定距离。
可能各位师傅想之后就直接将放大信号通入阵列就完事了,但事情远没有这么简单。如何通,怎么进行电路连接还是有讲究的。
这个半桥放大器(L293DNE)是4通道,每个通道的功能独立(详见模块数据手册),和L386N-4等一众芯片一样皆存在端口的输出阻抗,是需要和负载进行匹配的。
关于音箱前级放大器和音箱阻抗之间的纠葛我会在“AM调制设计方案”会一起讲。现在,通俗来讲就是能否驱动起来的问题,对应到本项目涉及的问题,就是一个输出通道驱动几个超声波探头组成的阵列比较合适。
AM 调制设计方案
L386N-4 (数据手册链接 https://www.ti.com/cn/lit/ds/symlink/lm386.pdf )是一个音频功放,输出阻抗是4——8欧姆(稍后会讲这个阻抗的讲究)。
L386N-4的选取原因在于它的Vcc可以达到24V。由于我们不是专业搞音频设计的,同时这次需要放大的声源信号频率在40kHz。一般的放大器不适用,会大面积信号失真(芯片摆率不够),我们的方案就没有尝试其他音频功放,或者更高级的音频电路设计,而仅仅以实现功能为导向,调制信号直连一级功放接负载。如若各位感兴趣、或对音频信号有独特见解,师傅们可以再改进此方案。
对于上面提到的AM调制,这种调制方法很久之前就出现了,在此我不多赘述,各位可自行baidu、google(科学上网)。这个调幅AM方案,还是我们两个到录制酒店,利用等待录制这几天现设计、制作出来的,可能方案上比较糙,各位大佬多担待。
方案设计和上边的类似,还以stm32用来调制信号,后面接一个放大器,(主要区别由于不同的调制信号对应不同型号放大器、功放器),而后接负载(阵列)。不过这次是用stm32对声音信号进行AM调制,放大器换成了L386N-4音频功放,阵列拓扑结构以及单个功放驱动的阵列元数量也做了一些改变。(stm32 对信号调幅代码就先不公布了)
此方案拓扑图如下:
来讲一讲阻抗的问题
- 什么阻抗
在具有电阻、电感和电容的电路里,对电路中的电流所起的阻碍作用叫做阻抗。阻抗常用Z表示,是一个复数,实部称为电阻,虚部称为电抗,其中电容在电路中对交流电所起的阻碍作用称为容抗 ,电感在电路中对交流电所起的阻碍作用称为感抗,电容和电感在电路中对交流电引起的阻碍作用总称为电抗。 阻抗的单位是欧姆。(详见百度 https://baike.baidu.com/item/阻抗/332224?fr=aladdin) - 阻抗匹配
阻抗匹配(impedance matching) 主要用于传输线上,以此来达到所有高频的微波信号均能传递至负载点的目的,而且几乎不会有信号反射回来源点,从而提升能源效益。信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输入端或输出端处于阻抗匹配状态,简称为阻抗匹配。(百度again https://baike.baidu.com/item/阻抗匹配/1707531?fr=aladdin)
阻抗匹配的通常做法是在源和负载之间插入一个无源网络,使负载阻抗与源阻抗共轭匹配,该网络也被称为匹配网络。阻抗匹配的主要作用通常有以下几点:从源到器件、从器件到负载或器件之间功率传输最大;提高接收机灵敏度(如LNA前级匹配);减小功率分配网络幅相不平衡度;获得放大器理想的增益、输出功率(PA输出匹配)、效率和动态范围;减小馈线中的功率损耗。
输入端阻抗匹配时,传输线获得最大功率;在输出端阻抗匹配的情况下,传输线上只有向终端行进的电压波和电流波,携带的能量全部为负载所吸收。
实际上讲,这一步的目的就是为了匹配,没有必要一定要加一个无源的匹配网络(一般情况下源和负载是不能变的),可以改变负载或者源的一些属性,直接match。虽然电感、电容在理论上可以不消耗能量,但是在实际工程上的误差就够我们受的了。看一下下面利用频谱仪对单个探头的阻抗扫描结果。
在40kHz频段下只要偏移一点信号就存在一定相移(并且探头实际中心频点也不是40kHz),此类效应会因为阵列的拓扑结构、组成探头数量而叠加,倘若以添加无源网络方式实现阻抗匹配在工程上难度就会变得很大了。为此,我们选择改变信号源、负载的相关参数达到直连匹配的效果。(工程性解决) - 修改信号源(实际工程上怎么匹配?)
探头使用的型号是TCT40-16T(数据手册 https://wenku.baidu.com/view/002d82d276a20029bd642da9.html ) ,可以发现真实的频谱仪扫描出的结果与数据手册上的数字还是存在一定的差距。
根据频谱仪数据,探头的中心频点在40.25kHz左右,所以stm32的输出信号频率要做出对应的修改。 - 驱动探头数量
单个探头在中心频点的阻抗大致为400欧(频谱仪扫描结果),每一个L293DNE通道的输出阻抗大致在20~30欧左右,L386N-4的输出阻抗是4~8欧,分别对应的探头数量为20、90多个探头的并联。
负载阻抗比功放或者放大器的输出阻抗大时,没有很大的影响,信号不会有很大变形的(多级放大器原理)一旦负载阻抗太小,比方原先PWM设计方案中,使用的阵列为91个探头并联。这个就出事了,信号面目全非,负载阻抗太低导致发热极其严重。
根据这一点我们改变了阵列的走线规则,将原来的单通道放大电路转变为了6级同心圆放大,拓扑结构保持不变(口面大小不变)。
15、15、12、12、18、19 这是PWM由外到内个通道驱动的探头数。这里把91个探头分区的目的除了为了阻抗匹配,还可以用于之后调整阵列定向性参数。
AM方案参考上面的图片,方案中将使用三个L386N-4功放器驱动三个框选分区。(源于阻抗匹配,各位师傅可自行计算。分区内各探头连接方式都是并联)
实际制作之“坑”
关于实际制作的“坑”,我从源到负载进行阐述。
-
“源”处的坑
这个位置原先使用NE555时钟模块时坑还挺多的(调参就十分麻烦),更换成stm32作信号调制板问题就会好很多,但是还需要注意共模串扰问题。
PWM方案在调制源处的“坑”比较少,最主要的AM调制的“坑”。由于stm32的输出特性,最终输出的调制信号都在0V以上,此时若功放的反相输入直接接地就会使调制信号损失一半的信息。因为功放的输入侧归根结底还是个比较器,所以为了契合stm32的输出信号特性,反相输入需要施加stm32输出的直流偏置电压,同时给功放通上24V的Vcc便可达到最大的放大效果。(2dB左右) -
放大器需要注意的问题
AM方案中涉及放大器主要的“坑”就是避免输入信号的共模串扰。PWM方案在放大器这部分的“坑”比较重要,目前我还不知道为什么我的解决方案可以。L293DNE模块是一个半桥放大器主要的参量是输入信号的占空比。stm32输出信号存在直流偏置,这个模块也会把stm32输出信号的直流分量同样保留下来并放大。我们消除这个直流分量的方案是在负载和通道输出端口之间调加无极无极电容。PS 若各位不懂无极电解电容是什么,可以使用两个有极性电解电容负极端串联在一起,整体连在放大器和音箱之间。而电容容值的计算便等于两个电容串联大小。
虽然根据超声波探头数据手册显示探头是根据输入信号的峰峰值对应输出声压的强弱,也就是说输入信号中混杂有直流偏置应无影响。(望各位师傅就此点指点一二)
两个放大器尤其是L293DNE在远距离传信号时会通入高Vcc电压,工作时会发热,需要外加散热片防止芯片烧坏。 -
负载(阵列拓扑设计)
这里就涉及到天线阵列的知识了。首先在常温空气中,声速为340m/s,这里理论超声波中心频率40kHz,也就是声波波长为lambada=v/f=0.0085m=8.5mm。 得知波长再类比天线阵列计算模型(这里各个阵列元是同相激励)便可玩一些有意思的事情。(详情可参考《天线》这本书)
探头方向图如下:
上面这个探头的方向图HPBW约为40度,同时是端射阵。也就是无论这个阵列元是以怎样拓扑结构进行排布阵列也不可能变成双向图,同时在平面二维布阵的条件下HPBW也不会得到很大的改观。由于整体阵列的方向性D等于单个的D乘上阵因子。
至少在传播距离、整体方向性以及阵列口面大小三个因素的联合限制下,单凭这款超声波探头是无法完美完成10m间距目标人物与旁人间隔0.5m完成信息定向传输的(这个阵列方向性小得可怕)。或者允许三维布阵,这个课题感兴趣的师傅可以自行玩玩。
实现效果
距离攻击目标 8 米,向攻击目标定向发出带有语音命令的超声波,攻击目标能听到攻击者发出的语音命令,以攻击目标为中心的周围1.5~2米外听不到攻击者发出的声音(或不识别为声音)。
使用到的器材及型号
- PWM方案
stm32f407vet6 1
面包板 1
阵列PCB 1
0.1uF无极电解电容 6
10kohm直插电阻 4
L293DNE 2
散热片 2
TCT40−16T超声波探头 91
导线若干 - AM方案
stm32f407vet6 1
面包板 1
阵列PCB 1
L386N-4 3
TCT40−16T超声波探头 121
散热片 3
导线若干
感想
这次比赛可以讲是惊心动魄,Geekpwn也是第一次引入这么硬件的演示。AM备选方案用48小时的设计加酒店现场制作,途中一次为了切割PCB阵列板找酒店要锯子一度引起前台xjj惊恐xs。比赛前一天AM备选方案stm32板子因一些神奇地错误操作坏了,至今不知道为什么lol,而满杭州城找stm32f407vet6 这个型号的开发板。极大地锻炼了我们电路开发和解决实际工程的能力。
感谢各位师傅的阅读,可能这个项目涉及的问题过于底层,同时基本从零开始实现,涉及设计、实现、现实客观因素方面问题较多不知道在下是否都已涵盖并讲述一二,如果上面有哪里不够清晰,或者各位师傅哪里不明白请务必让我知晓,我会尽快添加、删改。
- 本文作者: Mori
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/855
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!