你可能還不了解“TEMPEST”,它是用來竊取遠程視頻信息的一種基于軟件定義的無線電平臺技術,可被當做間諜工具包使用,用來針對某些目標電子設備的射頻信號(聲音和振動)進行分析,從而實現對目標電子設備的屏顯內容竊取。由于所有電子設備都會向外發射一些無意的射頻信號,通過對這些信號的捕捉分析,可以將其中的數據進行恢復顯示,如可以捕捉電腦顯示屏發出的射頻信號,進而恢復顯示出當前電腦屏幕的顯示內容。(這里,要感謝RTL-SDR.com讀者 ‘flatflyfish’向我們提供的如何在Windows系統上實現TempestSDR的安裝運行指導)。
支持Windows系統的TempestSDR介紹
TempestSDR是一個開源工具,允許使用任何SDR軟件,支持ExtIO(如RTL-SDR、Airspy、SDRplay、HackRF)接收捕獲目標電子設備的無意射頻信號,從而將目標設備的屏顯實時圖像進行復原;如果外加一個高增益信號的定向天線,甚至可以在幾米之外成功竊取到屏顯內容。
盡管TempestSDR工具在多年前就已經公布,但卻一直不能在Windows系統上用ExtIO接口正常運行, 在flatflyfish給我們的電郵中,他向我們展示了一個通過編譯可正常運行于Windows系統的TempestSDR新版本。編譯過程大概包含以下幾個步驟:
1. 由于ExtIO接口只支持32位JRE,所以需要安裝32位版本的JRE運行環境和JDK;
2. 需要安裝Mingw32和MSYS,并把它們的bin文件夾添加到windows PATH的環境變量中;
3. 編譯時,如果出現CC命令的未知錯誤,可以在所有makefiles文件頂部添加“CC=gcc”,當然,我也會從JavaGUI makefile中刪除Mirics編譯線,因為我們不使用其軟件定義無線電sdr;
4. 原本JDK文件夾位于Program Files目錄下,但makefile不支持文件夾中的空格格式且會出現錯誤,所以把其移動到另一個名字中沒有空格的文件夾后,能成功編譯運行;
5. 在編譯之前,需要指定ARCHNAME為x86模式,例如:“make all JAVA_HOME=F:/Java/jdk1.7.0_45 ARCHNAME=X86”
按照以上步驟進行編譯后,會得到一個可運行的JAR文件。當ExtIO接口和HDSDR能正常配合運行后,我就能用RTL-SDR連接顯示器接收到一些目標屏幕的顯示圖像。
TempestSDR程序運行和實驗效果
經過測試編譯,我們形成了一個可運行程序,為了其他人的研究之便,我們把它上傳到了github開源項目中,其中包含了makefile和一個不需要編譯即可fhru使用的TempestSDR ZIP版本軟件。請注意,如果要使用預編譯的JAR包,仍然需要安裝MingW32,且要將MingW / bin和msys /1.0/bin文件夾添加到Windows PATH的環境變量中。除此之外,還需安裝32位JRE。另外,在至少一臺Win 10主機系統上,我們還手動把“Prefs”文件夾添加到了注冊表中的Java路徑中。
我們使用了RTL-SDRs的ExtIO接口對該ZIP版本軟件進行了測試,確認其能有效運行,能成功收到集成了DVI接口的老DELL顯示器上的模糊圖像內容。在嘗試使用Airspy或SDRplay器件后,由于其帶寬較大,大大提高了最終接收到的圖像質量,其清晰度足可以在屏幕上顯示出大量文字信息。Airspy式的ExtIO接口dll文件可從此下載獲得,而SDRplay相應的ExtIO接口dll文件可從其官網下載。但注意,SDRplay最大頻率為6 MHz,而RTL-SDR則為2.8 MHz,由于會存在采樣丟失的情況,所以任何高于此兩頻率的SDR信號都不能有效接收到目標屏顯內容。
要使用該軟件,你還應該了解目標顯示器的分辨率和刷新率。但是如果你沒有方便檢測分辨率和幀速率的自相關圖,只需點擊波峰即可。另外,你還需知道顯示器的無意發射頻率。如果這些你都不確定,則可以瀏覽SDR#尋找決定屏幕圖像顯示變化的干擾峰值,例如下圖中,我們展示了具體的干擾情形。提高圖像質量的一種方法是放大“Lpass”選項,并觀察自動FPS搜索不會偏離你的期望幀速率太遠。如果太過偏離,則需重新選擇屏幕分辨率進行重置。
我們測試的最理想效果是,利用Airspy竊偵到的有DVI連接的19英寸老式DELL顯示器。另外一個是通過HDMI連接的一個新式的Phillips 1080p顯示器,雖然其信號非常弱但仍然能得到較好的恢復圖像,第三個為AOC 1080p的顯示器,我們沒有找到任何可利用的輻射信號。
當目標顯示器和天線處于同一房間時,可能竊偵到清晰的目標顯示器圖像;而相隔鄰近房間進行試驗時,DELL顯示器上的圖像仍然可被接收到,只是比較模糊,如果換成高增益的定向天線,效果可能會好點。