Security

DIY Spy Listening Device: Building an Eavesdropping Gadget

You’ve probably heard that almost anything can be turned into a spy device, including charging cables. In this article, I’ll show how to build and program a GSM bug with Arduino that you can call from a specific number to listen to what’s happening around it. We’ll disguise our creation as a portable power bank.

warning

The author and the editorial team do not endorse illegal activity. The information in this article is provided for educational purposes only. Please note that the unlawful trafficking of technical devices and invasion of privacy are punishable under Articles 137 and 138.1 of the Criminal Code of the Russian Federation.

info

The device’s firmware source code and schematic are provided for informational illustration only. The device will not operate with the code as published.

This material is presented in this format to help develop users’ analytical thinking and hands-on skills, and to facilitate additional review of the publication. It is also intended to warn users not to attempt to assemble equipment that is restricted for civilian use without an appropriate license from the competent authority.

Officially, only companies with government licenses are allowed to manufacture gear for covert audio surveillance, video monitoring, or extracting data from computers. In theory, these firms are supposed to fulfill government orders only. But simpler spy gadgets are within anyone’s reach. If you know your way around a soldering iron, you can build them yourself, and the parts are easy to buy at any electronics store.

There are several types of surveillance devices:

  • radio bugs
  • miniature voice recorders
  • hidden cameras
  • laser eavesdropping

We’ll be assembling a GSM bug—a device with long-range connectivity and a high-capacity battery. With these specs, it can stay on standby for up to ten days and provide live monitoring for up to four hours. Its key advantage is that you can listen in live as events unfold, rather than relying on recordings.

Choosing a disguise

The easiest place to hide something is in plain sight—in something that doesn’t draw attention. Here are some interesting ways to disguise a listening device.

Computer mouse with a built-in GSM bug
Computer mouse with a built-in GSM bug
Smartphone charger with a built-in GSM bug
Smartphone charger with a built-in GSM bug
Keyboard with a built-in voice recorder
Keyboard with a built-in voice recorder

These eavesdropping setups are also attractive because the objects hiding the bugs are almost always plugged into mains power: the bug never runs out of battery and can keep doing its job—transmitting information—for much longer.

If the bug runs solely on its internal battery, we’ll have to think about how to recharge it. In spy movies, that always creates extra complications. We don’t need that.

So my choice is to embed a bug inside a smartphone power bank. People carry it around and charge it frequently, and even if they don’t, the bank itself can power the bug. In my view, it’s an excellent place to hide such a device.

Assembly

To assemble the device, we’ll need:

  • SIM800 GSM module
  • Arduino Pro Mini
  • Power bank case for four 18650 Li‑ion cells
  • Two or three 18650 Li‑ion batteries (I used two)
  • Microphone
  • SIM card
Components for the build
Components for the build

To assemble the device correctly, you need to know the pin assignments on the GSM SIM800 module and the Arduino Pro Mini.

SIM800 pinout
SIM800 pinout
Arduino Pro Mini pinout
Arduino Pro Mini pinout

Next, solder the antenna to the GSM module at the NET pad.

  • Solder the microphone to the MIC+ and MIC− outputs.
  • Connect the GSM module’s RXD and TXD to Arduino pins 6 and 7.
  • Solder the module’s Vcc and GND to the Arduino and to the terminals of the external battery.
Test setup
Test setup

After soldering all the components in place, make sure the soldering is correct by flashing the microcontroller.

// Include the software implementation library for UART protocol communication
#include <SoftwareSerial.h>
SoftwareSerial SIM800(7, 6); // RX, TX
// Declare a variable to store the module's response
String _response = "";
void setup() {
// Data rate for communication with the computer
Serial.begin(19200);
// Data rate for communication with the modem
SIM800.begin(19200);
Serial.println("Start!");
// Send AT to set up the data rate
sendATCommand("AT", true);
// Modem setup commands on each startup
// Enable caller ID
_response = sendATCommand("AT+CLIP=1", true);
// Option with DTMF
//_response = sendATCommand("AT+DDET=1", true);
}
String sendATCommand(String cmd, bool waiting) {
// Declare a variable to store the result
String _resp = "";
// Echo the command to the serial monitor
Serial.println(cmd);
// Send the command to the module
SIM800.println(cmd);
// If we need to wait for a response, wait until it's received
if (waiting) {
_resp = waitResponse();
// If Echo Mode is off (ATE0), these three lines can be commented out
if (_resp.startsWith(cmd)) {
_resp = _resp.substring(_resp.indexOf("\\r", cmd.length()) + 2);
}
// Echo the response to the serial monitor
Serial.println(_resp);
}
// Return the result. Empty if there was a problem
return _resp;
}
// Function to wait for a response and return it
String waitResponse() {
// Variable to store the result
String _resp = "";
// Variable to track timeout (10 seconds)
long _timeout = millis() + 10000;
// Wait up to 10 seconds for a response and check for data or timeout
while (!SIM800.available() && millis() < _timeout) {};
return _resp;
}
void loop() {
// If the modem sent something, get the response for analysis
if (SIM800.available()) {
_response = waitResponse();
// Trim leading/trailing spaces and print the response to the serial monitor
_response.trim();
Serial.println(_response);
// Whitelist of phone numbers; you can list several separated by commas
String whiteListPhones = "+380713337866";
// If there is an incoming call, check for caller ID info. If present, then phoneindex > -1
if (_response.startsWith("RING")) {
int phoneindex = _response.indexOf("+CLIP: "");
// Variable to store the detected number
String innerPhone = "";
// If the info was found, parse the string and extract the number
if (phoneindex >= 0) {
phoneindex += 8;
innerPhone = _response.substring(phoneindex, _response.indexOf(""", phoneindex));
// Print the number to the serial monitor
Serial.println("Number: " + innerPhone);
}
// Check that the number length is greater than six digits
// and that the number is in the list. If so, answer the call
if (innerPhone.length() >= 7 && whiteListPhones.indexOf(innerPhone) >= 0) {
sendATCommand("ATH", true);
}
}
}
}

If soldered and flashed correctly, once powered on our listening device will answer incoming calls only from whitelisted mobile numbers specified in the firmware.

Now it’s time to remove the long jumper wires and desolder the LEDs from the Arduino board. Insulate the microphone with heat-shrink tubing, drill a hole for it in the power bank’s case, and use hot glue to secure it and the two boards in the space intended for a single 18650 cell.

In my build I used two batteries, but you can fit three—there’s enough room.

Final soldering of the components
Final soldering of the components
Test-fitting and securing the internal components in the enclosure
Test-fitting and securing the internal components in the enclosure
The finished device
The finished device

So, we’ve built a GSM bug inside a power bank enclosure. It’s not perfect, of course, but there are several ways to improve it.

  • Use an enclosure that can accommodate higher-capacity batteries.
  • To extend standalone operation, put the GSM module into sleep mode, and activate the listening function when the battery’s power button is pressed.
  • When the external battery’s button is pressed, send a message to the operator of the listening device.

Conclusion

So, we’ve designed and built a GSM bug disguised as an external battery pack. It costs much less than the bugs you can buy online or in specialty stores. You can recreate my device or improve it. Most importantly, remember that privacy is inviolable—don’t use this knowledge for harmful purposes!

it? Share: