ZeroTrace AirLeak Pro
Bluetooth Ops
The active Bluetooth testing tools, and when to use each
The Bluetooth Ops run on the Pro's main processor (the ESP32-S3), alongside the app link. Every Op is configured and driven from the ZeroTrace app, there's no console on the device. Some of the more advanced Ops (BLE MITM, GATT emulation) also enlist the second radio (the ESP32-C5) as a BLE advertiser and GATT server.
These tools transmit Bluetooth advertisements, connect to other devices, and can write to them. Broadcasting spoofed adverts, pop-up storms, or decoy trackers, and interacting with a device you don't own, is illegal in most jurisdictions outside an authorized engagement. Only run them against devices you own or are contracted to test, keep records of your authorization, and stay in scope. See Privacy & Legal.
The main processor has a single BLE radio. Only one BLE transmit Op can run at a time, and the client Ops (GATT dump/write, Find My beep, foxhunt, MITM) share a single BLE-client lock. The app manages the hand-off. Throughout, the app link is preserved so you never lose control while an Op runs.
BLE Advertisement Spam
Rapidly broadcasts crafted BLE advertisements to test how nearby devices, operating systems, and apps react to pairing prompts and proximity pop-ups. This is the tool for exercising OS pairing UX, validating that a fleet's devices ignore unsolicited adverts, and demonstrating how noisy the BLE spectrum can get.
The Op rotates through crafted payloads at a configurable interval (interval_ms, 20-2000 ms; the ble_spam_interval_ms config key sets the default of 120 ms). It carries a library of 40+ Apple Continuity payloads, covering AirPods, Beats, and the various "setup"/pairing pop-ups an iPhone shows near an unpaired accessory.
Eleven modes are available:
| # | Mode | What it broadcasts |
|---|---|---|
| 0 | Apple (all) | Rotates through the full library of 40+ Apple Continuity pairing/proximity payloads |
| 1 | Apple (one) | A single chosen Apple payload, selected by apple_index |
| 2 | Microsoft SwiftPair | Windows "Swift Pair" fast-pairing prompts |
| 3 | Samsung | Samsung device proximity/pairing adverts |
| 4 | Google Fast Pair | Android Fast Pair pairing prompts |
| 5 | Chaos | Rotates across all of the above vendor families at once |
| 6 | SourApple | Concentrated iOS proximity pop-up storm, a stress test of the iOS pairing UI |
| 7 | AirTag | AirTag-style pairing adverts |
| 8 | Drone ID | Drone-identity style adverts |
| 9 | QuickShare | Samsung Quick Share pairing prompts |
| 10 | Samsung Buds | Galaxy Buds pairing pop-ups (rotates through a catalog of Buds models) |
In Apple (one) mode, apple_index selects which single payload from the Apple library is broadcast, useful when you want to reproduce one specific pop-up rather than the whole rotation.
Use it to: test how phones and apps respond to unsolicited pairing prompts, confirm a device rejects/ignores spoofed adverts, and run awareness demos of BLE advertising noise.
Config & control: blespam.config (mode, apple_index, interval_ms), blespam.start / blespam.stop, blespam.status (reports sent / fps).
The SourApple mode is designed to flood the iOS pairing UI with pop-ups. It can make nearby iPhones difficult to use for their owners. Only run it in a controlled lab, against devices in scope, with the owners' knowledge.
iBeacon Broadcast
Broadcasts a standard Apple iBeacon advertisement, the beacon format proximity apps and indoor-location systems listen for. Use it to exercise a beacon receiver, verify an app's region enter/exit logic, or stand in for a physical beacon during testing.
You control the standard iBeacon fields:
| Field | Notes |
|---|---|
uuid | 16-byte proximity UUID. Default E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 |
major | 16-bit major value |
minor | 16-bit minor value |
tx_power | Calibrated 1-metre RSSI, -128..127 (default -59) |
You can save, load, and delete up to 5 profiles on the device, so a set of test beacons is one tap away instead of re-entered each time.
Use it to: test beacon-based apps and indoor-location systems, reproduce a specific beacon identity, validate region-monitoring logic.
Config & control: ibeacon.config / ibeacon.start / ibeacon.stop / ibeacon.status, plus ibeacon.profiles.list / .save / .load / .delete (max 5).
BLE Device Spoofer
Round-robins through a set of spoofed device identities, each a custom advertising name plus a manufacturer-data hex payload, cycling from one to the next on a timer. Where advertisement spam tests pop-up behaviour, the spoofer is about presenting a rotating cast of distinct-looking devices, useful for populating a scanner's view, testing device-inventory and allowlist logic, or checking how a system reacts to identities appearing and disappearing.
| Field | Notes |
|---|---|
profiles[] | Up to 8 identities, each name (≤26 chars) + mfg_hex (manufacturer data, ≤240 hex chars) |
cycle_ms | Dwell time per identity, 50-2000 ms (ble_spoof_cycle_ms config key sets the default of 200 ms) |
Each identity advertises under a deterministic MAC derived from the profile, so the same identity reappears with the same address across cycles.
Use it to: populate a scanner or inventory system with controlled test identities, exercise allowlist/blocklist logic, test reaction to appearing/disappearing devices.
Config & control: blespoof.config / blespoof.start / blespoof.stop / blespoof.status.
AirTag / Find My Decoy
Broadcasts decoy Apple Find My "lost" beacons, advertisements that look like a separated (lost) item finder, using fake public keys. This has two legitimate uses: anti-stalking awareness (showing people what a tracker looks like on the air so they learn to spot one), and testing tracker-detection systems (does a given app, scanner, or the Pro's own detector actually flag it?).
| Field | Notes |
|---|---|
count | Number of rotating decoy keys, 1-8 |
rotate_ms | How often the broadcast key rotates |
demo_mac | When true, uses an obvious C0:DE:FA:CE MAC prefix so the decoys are clearly identifiable as test traffic |
This Op emits decoy tracker beacons. To detect real nearby tags, use Find My Tools below (or the passive Tracker Detection).
Use it to: demonstrate what a tracker looks like over the air, and validate detection tools, including AirLeak Pro's own tracker detection. Setting demo_mac keeps the decoys unmistakably synthetic.
Config & control: airtag.config / airtag.start / airtag.stop / airtag.status (reports publishes and the macs[] in use).
Find My Tools
The active counterpart to passive Tracker Detection. It scans for real nearby item finders and can trigger sound on one you've located.
findmy.scan(duration_ms) detects nearby real tags, AirTag, FMNA (Find My Network Accessory), and DULT-compliant trackers, and classifies each by status, battery, and whether it's separated from its owner. Results are logged to/captures/findmy.log.findmy.beep(addr,kind:airtag|fmna|dult) plays a sound on a located tag so you can physically find it;findmy.stopsilences it.
Use it to: locate a tracker you've found on you or your belongings, confirm whether a suspected tag is nearby, and audit a space for unwanted trackers.
GATT Client (dump / write)
Acts as a Bluetooth client to a target device to enumerate and interact with what it exposes over BLE, standard assessment work for an authorized security review.
ble.gatt.dump(addr,read,timeout_s) connects to the target and enumerates its services and characteristics, reporting each characteristic's properties and, where readable, decoded values, including recognized sensor readings (battery, temperature, humidity).ble.gatt.write(addr,service_uuid,char_uuid,hex) writes a value to a specific characteristic.
Use it to: map a Bluetooth product's exposed services during an authorized security review, and, where in scope, exercise a characteristic to observe device behaviour.
Enumerating a device's GATT services is a normal part of a security review. Writing to a device you don't own, or one outside your engagement scope, is not, keep it in scope.
Surveillance & Tracker Detectors
A defensive sweep: passively scans for a chosen class of device and reports what it finds, without transmitting. Point it at one target category at a time.
| Target | Detects |
|---|---|
| trackers | Item finders, Samsung SmartTag, Tile, Chipolo |
| flipper | Flipper Zero devices (and reports the unit's color) |
| meta | Meta / Ray-Ban smart glasses |
| surveillance | Axon body cameras, Flock Safety ALPR cameras |
| drone | Drones broadcasting BLE Remote ID |
Each hit reports address, name, RSSI, kind, and category-specific fields.
Use it to: sweep a space for unwanted trackers, spot surveillance hardware and camera systems, and check for drones broadcasting Remote ID nearby.
Control: detector.scan (target, duration_ms), returns devices[] with {addr, name, rssi, kind, fields}. See also the dedicated Tracker Detection feature.
Foxhunt (direction finding)
RSSI direction-finding: hone in on a specific target MAC by watching how its signal changes as you move. On start, the Op boosts BLE scanning to 100% duty and locks onto the target.
Polling foxhunt.status is the hunt loop, each poll reports:
| Field | Meaning |
|---|---|
frac | A 0-1 closeness estimate, higher = closer |
trend | Whether you're getting closer, farther, or flat |
peak | Best (strongest) signal seen so far |
rssi | Current signal strength |
lost / age_ms | Whether the target has dropped out, and how stale the last reading is |
Walk, poll, and let trend and frac guide you toward the device.
Use it to: physically locate a specific BLE device you're authorized to find, a rogue beacon, a lost asset tag, a device flagged during a sweep.
Control: foxhunt.start (mac), foxhunt.status, foxhunt.stop.
Ninebot / Segway
Finds nearby Ninebot / Segway scooters and provides a catalog of canned command frames for authorized testing of those scooters' BLE control interface.
ninebot.scan(duration_ms) scans for scooters by name prefix, Nordic UART Service (NUS), and company ID.ninebot.payloadsreturns a catalog of pre-built command frames (Max2/G30, F2, and generic variants). There is no dedicated control-send RPC, you deliver a chosen frame to the scooter's NUS characteristic usingble.gatt.write.
Sending command frames to a scooter you don't own, or interfering with one in use, is unsafe and unlawful. Use this only against a scooter you own or are explicitly contracted to test, in a controlled setting.
Use it to: inventory scooters in an authorized assessment and, on a scooter you own or are contracted to test, exercise its BLE control surface.
BLE MITM / GATT Emulation
The most advanced Bluetooth Op, and strictly for authorized labs. The main processor connects to a target peripheral as a central and clones its services and characteristics onto the second radio (the C5), which advertises the clone as a stand-in GATT server. Two modes:
- Static clone (
proxy=false) reproduces the target's service/characteristic structure on the device so a host can connect to the emulated peripheral. - Live proxy (
proxy=true) stands up a relay: reads, writes, and notifications pass between the real device and a connecting host through the Pro, with no reboot, so you can observe and study the live exchange.
The clone captures up to 4 services and 16 characteristics. The C5 GATT server can also present standard DIS/HID identity services alongside the clone.
Use it to: study how a BLE product and its companion app talk to each other, in a controlled lab, on devices you own or are contracted to test.
A live BLE proxy sits in the middle of a real device's communications. This is powerful and easy to misuse, run it only in an isolated lab, only on devices in your engagement scope, and never against equipment in production use.
Control: mitm.clone (addr, proxy), mitm.status, mitm.stop; the underlying C5 GATT server is driven by c5gatt.push / .notify / .stop / .status. Status reports relayed_out / relayed_in counts and a recent-activity log[].
Bluetooth Ops share the main processor's radio with the app link, which is preserved so you stay in control. Only one BLE transmit Op runs at a time; the app shows each Op's live status (adverts sent, devices seen, hunt progress) while it runs and manages the hand-off between Ops.