TempestSDR: An SDR tool for Eavesdropping on Computer Screens via Unintentionally Radiated RF

Thanks to RTL-SDR.com reader 'flatflyfish' for submitting information on how to get Martin Marinov's TempestSDR up and running on a Windows system. If you didn't already know by definition "TEMPEST" refers to techniques used by some spy agencies to eavesdrop on electronic equipment via their unintentional radio emissions (as well as via sounds and vibrations). All electronics emit some sort of unintentional RF signals, and by capturing and processing those signals some data can be recovered. For example the unintentional signals from a computer screen could be captured, and converted back into a live image of what the screen is displaying.

TempestSDR is an open source tool that allows you to use any SDR that has a supporting ExtIO (such as RTL-SDR, Airspy, SDRplay, HackRF) to receive the unintentional signal radiation from a screen, and turn that signal back into a live image. This can let you view what is on a screen without any physical connections. If a high gain directional antenna is used then it may be possible to receive images from several meters away as well.

TempestSDR showing what's on the screen via unintentional RF radiation from the monitor.
TempestSDR showing what's on the screen via unintentional RF radiation from the monitor.

Although TempestSDR has been released now for a number of years it hasn't worked properly in Windows with ExtIO interfaces. In his email flatflyfish showed us how to compile a new version that does work.

1. You need to install a 32-bit version of the Java runtime. The 64-bit version won't work with extio's possibly because they are all 32-bit. Also install the JDK.

2. You need to install MingW32 and MSYS and put their bin folders in your Windows PATH.

3. Then when compiling I was seeing a lot of CC command unknown errors. To fix that I just added CC=gcc to the top of all makefiles. I also removed the Mirics compilation line from the JavaGUI makefile to make things easier as we're not using that sdr.

4. Originally my JDK folder was in Program Files. The makefile didn't like the spaces in the folder, so I moved it to a folder without spaces and it fixed the errors.

5. Lastly to compile it you need to specify the ARCHNAME as x86 eg "make all JAVA_HOME=F:/Java/jdk1.7.0_45 ARCHNAME=X86"

After doing all that it compiled and I had a working JAR file. The extio's that are used normally with HDSDR work fine now and I get some images from my test monitor with an rtlsdr.

We tested compilation ourselves and were successful at getting a working program. To help others we've just uploaded a fork of the code with the makefile changes done, as well as a precompiled release ZIP available on the releases page so no compilation should be required to just use it. Note that to use the precompiled JAR you still need to install MingW32, and also don't forget to install the MingW /bin and msys /1.0/bin folders into the Windows PATH. You also do need to have the 32-bit Java runtime installed as the 64-bit version doesn't seem to work. On at least one Win 10 machine we also had to manually add a 'Prefs' folder to the Java path in the registry.

We've tested the software with the ExtIO for RTL-SDRs (available on the HDSDR downloads page) and confirmed that it works. Images from one of our older DELL monitors using DVI are received nicely, although they are a bit blurry. We also tried using an Airspy or SDRplay unit and this significantly improved the quality of the images a lot due to the larger bandwidth. The quality was good enough to make out large text on the screens. ExtIO's for the Airspy are available on this page, and for the SDRplay on the official SDRplay website. Note that for the SDRplay we were unable to go above 6 MHz, and on the RTL-SDR 2.8 MHz was the limit - anything higher on these SDRs did not produce an image possibly due to dropped samples.

To use the software you should ideally know the resolution and refresh rate of your target monitor. But if you don't there are auto-correlation graphs which actually help to predict the detected resolution and frame rate. Just click on the peaks. Also, you will need to know the frequency that your monitor unintentionally emits at. If you don't know you can browse around in SDR# looking for interference peaks that change depending on what the image of the screen is showing. For example in the image below we show what the interference might look like. A tip to improving images is to increase the "Lpass" option and to watch that the auto FPS search doesn't deviate too far from your expected frame rate. If it goes too far, reset it by re-selecting your screen resolution.

Unintentionally radiated RF signal from computer screen shown in SDR#
Unintentionally radiated RF signal from computer screen shown in SDR#

The best results were had with the Airspy listening to an older 19" DELL monitor connected via DVI. A newer Phillips 1080p monitor connected via HDMI had much weaker unintentional signals but images were still able to be recovered. A third AOC 1080p monitor produced no emissions that we could find.

Clear images were obtained with an antenna used in the same room as the monitor. In a neighboring room the images on the DELL monitor could still be received, but they were too blurry to make anything out. Possibly a higher gain directional antenna could improve that.

An example set up with RTL-SDR antenna and monitors
An example set up with RTL-SDR antenna and monitors

Below we've uploaded a video to YouTube showing our results with TempestSDR.

If you want to learn more about TEMPEST and TempestSDR Martin Marinovs dissertation on this software might be a good read (pdf).

21 comments

  1. Zypo

    I attempted to get this working. I installed JRE (32bit) and JDK (32bit) 9.0.1 on Windows 10. I used 32 bit MinGW. I also downloaded the EXTIO_HACKRF.dll file from https://github.com/jocover/ExtIO_HackRF . When I load the ExtIO, I get the error “The ExtIO dll is not compatible with the current machine or does not exist. Please check the filename is correct and the file is a valid ExtIO dll file and try again.” I analyzed the HACKRF ExtIO with Dependency Walker and ran into a whole bunch of errors. Does anyone have any advice?

  2. GiamMa-based researchers SDR R&D IoT

    During my windows tests I encountered various errors and exceptions such as “Exception in thread” AWT-EventQueue-0 “java.lang.UnsatisfiedLinkError:”.

    The solution that worked for me was to follow the following tutorial, How to settings MinGW / MinGW C++ Download and Installation:

    http://www.ics.uci.edu/~pattis/common/handouts/mingweclipse/mingw.html

    The version of java to be used must be higher than release 52, with version 8 I have not encountered problems on windows 32 and 64 bit.

    My test of Eavesdropping on DELL Laptop Computer Screens via electromagnetic interference (EMI) using rtl sdr on Windows. Monitor Resolution WXGA 1280×800 60hz:

    https://www.youtube.com/watch?v=OK70F4RsLjw

    To look for the frequency of interference signal, I recommend searching by scanning one waveform with many subsequent peaks between 300 and 700 Mhz.

    After tuning in to the targhet frequency let the software take autocalibriums and try to move a few Mhz to center the target.

  3. MrLiu

    C:\Users\MrLiu\Desktop\TempestSDR>java -jar JTempestSDR.jar
    Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: C:\Users\
    MrLiu\AppData\Local\Temp\TSDRLibraryNDK.dll: Can’t find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at martin.tempest.core.TSDRLibrary.loadLibrary(TSDRLibrary.java:185)
    at martin.tempest.core.TSDRLibrary.(TSDRLibrary.java:195)
    at martin.tempest.gui.Main.(Main.java:186)
    at martin.tempest.gui.Main$1.run(Main.java:165)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
    rivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

  4. Giorgio IZ2XBZ

    I’m not able to install MingW32: installers are not working as they cannot donwload packages, can someone make me a zip of all required files please?

    Thanks
    Giorgio IZ2XBZ

  5. someone

    When I try to run the precompiled jar, I get this error on Win10 x64. I have Java 32bit installed, MingW32, and MingW32 paths in the PATH.

    Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: C:\Users\myusername\AppData\Local\Temp\TSDRLibraryNDK.dll: Can’t find dependent libraries

    • admin

      Did you follow all the instructions in this post?

      Try and open the jar file from the command line using ‘java -jar JTempest.jar’ and see what error it gives you.

      • Matt

        Here is what I get when I run JTempest.jar from command line.

        Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: martin.tempest.core.TSDRLibrary.init()V
        at martin.tempest.core.TSDRLibrary.init(Native Method)
        at martin.tempest.core.TSDRLibrary.(TSDRLibrary.java:207)
        at martin.tempest.gui.Main.(Main.java:186)
        at martin.tempest.gui.Main$1.run(Main.java:165)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

        Any ideas? Thanks in advance!

        • Zypo

          I attempted to get things working in a Windows 7 VM with a single core and 512mb mem. I received the same exception.

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>