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.

TempestSDR - Remotely Eavesdropping on Monitors via Unintentionally Radiated RF

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

Subscribe
Notify of
guest

47 Comments
Inline Feedbacks
View all comments
Anonymous

you need to re-complile the project

Genia B

How?

another anon

Is there an original repository on github/etc with the source code available?
You may be able to work from there, or forward it to someone else who is interested.

Genia B

Hi there,

I am trying to set up a working TEMPEST attack as a demo for my employer, but I have been having issues getting this to work. I made sure I have 32-bit java (though I am using a 64-bit Windows 10 machine). I installed mingw and msys, though I don’t think I’ll need them, as I already have a working jar file.

When I try to load the ExtIO dll, I get:

“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 and try again.”

Any advice would be most helpful and appreciated. I am at the point of trying a different dongle (like an RTL2832U), but I fear I will just end up with the same error. What am I doing wrong? The software is indeed finicky and confusing, as you pointed out in your YouTube video ? I looked at that video, but it didn’t help me, unfortunately. I tried placing the jar file and the required dll into separate folders on my desktop, but I get the same error.

Many thanks in advice for any help.

Warm regards,

Genia

Maowei Xu

Have you solved this probelm?If so,could you please tell me the method.
My email is xmw_1997 mike.dost.com
Thank you very much!

Kushagra Dixit

Your JAVA version needs to be for the correct architecture (that used by the DLL)

Me

People that like this evesdropping stuff is made up of a bunch of demorats and CIA all instigated by Obama. This is all deep state. You people are raping my constitutional rights to privacy.

commander crash

The physics would be the ultimate criminal??????

Dave Camden

And oh man, it’s so wet and soft as we do so. You wouldn’t be afraid if you had nothing to hide.

You

This capability has been around since at least the 1960’s (probably earlier). Should we blame Kennedy for it? Maybe, Eisenhower? How ’bout Truman? You are obviously an ignorant millennial. The universe didn’t even exist until you were born. Right? Don’t worry we still have a participation trophy for you. You can pick it up at the door.

Dave Camden

The guy who did not have a solid answer for where or when this was created just called someone ignorant.

OK, jackass boomer

Eat shit and die fucktard

Eat shit you gender confused retard. If you want to know where and when you can use Google like everyone else. Or is that beyond your capability.

Confused Retard Millenial Fuck

I think it is, daddy!

Own this lib harder! Do it!

Dave Camden

Jesus grandpa take your meds

Fuck

runner

1960’s would be an understatement, I remember a declassified document dating back to ’43, ’44 ish

Concerned citizen

Holy shit this caused a shitstorm over someone trolling.
Good job dude.

SDR Dude

I’m trying to replicate this on a Windows 7 VM running on a macbook. However my standalone JAR won’t run and compilation gives me the following errors.


mkdir -p include
mkdir -p ../lib/WINDOWS/X86
mkdir -p obj
mkdir -p include ../bin/martin/tempest/core/
javac ../src/martin/tempest/core/TSDRLibrary.java -d ../bin/ -cp ../src/
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object
make[2]: *** [../bin/martin/tempest/core/TSDRLibrary.class] Error 1
make[2]: Leaving directory `/c/Users/will/Documents/TempestSDR-master/TempestSDR
-master/JavaGUI/jni’
make[1]: *** [jnilib] Error 2
make[1]: Leaving directory `/c/Users/will/Documents/TempestSDR-master/TempestSDR
-master/JavaGUI’
make: *** [all] Error 2

If anyone else is having similar issues or managed to get past this please let me know !

Sam

I am having a tough time finding my signal. How do I know what to look for on SDRsharp or the TempestSDR. What does the signal look like?

Anonymous

some one
like”peak”

Matt

You should try watching Tempest For Eliza on Youtube on the target monitor. With the computer you’re using SDR# with, switch it to AM channel and find the sound. Much faster and simpler. I got great results within 15 minutes compared to the hours I spent finding it through NFM.

I identify as an RTL-SDR

Am testing this on a Windows 7 64-bit machine with Java JDK 8 update 172 installed to C:\Java and using an AirSpy R2, doesn’t work. After opening the precompiled JAR file, going to File > Load ExtIO source and selecting the AirSpy ExtIO 1.0.7 DLL (which I downloaded from http://www.montefusco.com/airspy/), I got an 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.”. @OP how did you guys manage to get this working with the AirSpy?

Things I’ve tried:
1. Using the 32-bit version of the JDK instead of the 64-bit version.
– After doing this step, I can’t even get to the GUI of TempestSDR, just a Java error and crash. So I uninstalled the 32-bit JDK and reinstalled the 64-bit JDK, which at least allowed me to get to the main GUI of TempestSDR.
2. Installing both MinGW and MSYS.
3. Ensuring the Java (C:\Java\bin) / MinGW / MSYS paths (yes, both C:\MinGW\bin and C:\MinGW\msys\1.0\bin) are in my Path system environment variable.
4. Putting the downloaded AirSpy ExtIO 1.0.7 into the Release\dlls\WINDOWS\X64 folder instead of the X32 folder.

I’ve narrowed down a likely cause: for the AirSpy to be used for this on a 64-bit machine, I think a 64-bit ExtIO DLL is needed, but the one provided in http://www.montefusco.com/airspy/ (specifically AirSpy ExtIO 1.0.7) seems to be a 32-bit version. Any comments/corrections?

Jeff C.

Does anybody know if there is a Linux version of this or any other Linux based programs with similar capabilities?

Sendenbar

If you are only interested in using rtl-sdr with TempestSDR, then there is a version that supports it https://github.com/hennichodernich/TempestSDR/
You just need to compile it yourself, and it should work.

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?

GiamMa-based researchers SDR R&D IoT

the same error was found with rtl sdr extio, try to verify::

– MinGw installation
– Path Windows MingW/bin and msys/1.0/bin
– Java registry on Windows
– dll file

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.

Vitor Martins Augusto

Under 64 bit Windows, you need to use the 64 bit TempestSDR version:

https://raw.github.com/martinmarinov/TempestSDR/master/Release/JavaGUI/JTempestSDR.jar

AND use the 64 bit version of ExtIO_RTL.dll:

https://github.com/josemariaaraujo/ExtIO_RTL/tree/master/Release

Then it will work with RTL2832U dongles.

Now looking for 64bit ExtIO_HackRF…

Regards,
Vitor

Anonymous

hi
I run 64 bit Windows 10, I have downllowd JtempestSDR.jar and 64 bit ExtIO_RTL.dll
I have RTL2832U dongles and HackRF ONE
can you give me a guid step by step
I don’t know how operation to get “TempsetSDR.exe”
Thanks.
bjing51117 mike.dost.com

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)

Angel Sevov

i have same error 🙁

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

Giorgio IZ2XBZ

Solved!
TempestSDR works, but I can’t “tune” the signals of monitors and tv.
(Using HackRF)

Anonymous

hi ,Giorgio IZ2XBZ
can you give me a guid step by step “how can I get the tempsetsdr.exe”
thanks!
bjing51117 mike.dost.com

Matt

I just posted this up top but, You should try watching Tempest For Eliza on Youtube on the target monitor. With the computer you’re using SDR# with, switch it to AM channel and find the sound. Much faster and simpler. I got great results within 15 minutes compared to the hours I spent finding it through NFM. Also I used this with a HackRF and it worked surprisingly well.

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

someone

Also, the three DLLs that came with the precompiled JAR are in the same folder.

Anonymous
someone

Yes, I had to add the Prefs reg key prior to this error.

I have also verified that the MinGW folders are in the PATH var

Anonymous

It should be mingw/bin and msys/bin folders.

someone

Yup, both the mingw/bin and msys/1.0/bin folders are in the path.

Anonymous

Try to install java and mingw+msys to c:\. Somebody told that spaces in adress is not good.

t17lab

my lcd resolution is 1366×768 px, cannot adjust specific resolution TempestSDR GUI

Anonymous

I can’t open the java file, any help for a noob please?

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.

Tech Guy

The best results were had with the Airspy

Interesting. I will try that next.