之前听说有个神奇的软件叫做tempestsdr,可以用sdr来接收显示器泄露出来的信号。
这个软件说实话很难安装,因为是java的,并且只给了代码。但是我看了他的代码其实核心就是AM解调,因此我有了自己写代码来实现这个功能的想法。
tempestsdr的名字其实不是随便起的,tempest是Temporary emanation and spurious transmission的缩写,专指这种类型的泄漏。
我用了另一个知名软件TVSharp也大致看到了HDMI泄漏的信号,进一步验证了我的想法,就是用AM解调并把结果依次一行行画出来就行。
以下是我实测的效果。
SDR接收HDMI泄露信号 无需tempestsdr_哔哩哔哩_bilibili-https://www.bilibili.com/video/BV1b94y127Qh?spm_id_from=333.337.search-card.all.click但是如果要进一步改善效果要改代码,TVSharp是C#开发的,不开源,可以反编译看到代码,但是不能重新再编译了(主要是我懒得建一个C#工程,本就不喜欢windows开发)。
我主要习惯的开发环境还是Linux下的C/C++开发或者Python开发。我之前也用C++写过模拟电视接收的程序。但本次为了做一个尽量通俗易懂的教程,我打算用Python 2.7来开发。
首先,我找到一个叫做pyrtlsdr的包,它把rtlsdr的驱动封装了一下。
它里面有个例子
- from pylab import *
- from rtlsdr import *
-
- sdr = RtlSdr()
-
- # configure device
- sdr.sample_rate = 2.4e6
- sdr.center_freq = 95e6
- sdr.gain = 4
-
- samples = sdr.read_samples(256*1024)
- sdr.close()
-
- # use matplotlib to estimate and plot the PSD
- psd(samples, NFFT=1024, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq/1e6)
- xlabel('Frequency (MHz)')
- ylabel('Relative power (dB)')
-
- show()
运行上面的代码就能看到下面的频谱图。
我基于这个代码来做了修改,因为我事先已经找到了频点,我只需要把时域信号画出来就行了,不需要频谱,因此我先把频谱绘制代码删掉了。然后我需要持续循环获得时域信号,并且为了调试,我还要把信号值打印到屏幕上。
修改后的代码:
- from pylab import *
- from rtlsdr import *
-
- sdr = RtlSdr()
-
- # configure device
- sdr.sample_rate = 2.4e6
- sdr.center_freq = 395.991e6
- sdr.gain = 4
-
-
- while True:
- samples = sdr.read_samples(1*1024)
- print (samples)
-
- sdr.close()
有了这段代码,如果你有一个rtlsdr插在电脑上,再找一个portapack,用信号源功能在395.991MHz上发射一个信号,就能看到没信号时终端上数字都很小,发出信号后,终端上的数字也变大。
后面我们要做的工作就是把这些大大小小的数字转化为颜色就行了。
未完待续,敬请期待!