HackerPhone toolkit controls

The current build adds real tools to the working MakerPhone port. It does not yet reproduce every mode from the reference projects. Original HackerPhone implementations remain MIT, as requested; GPL application code from ChimeraBLE or SquachWatch is not incorporated.

On the device

Open Security for radar, APs, stations, probes, BLE, channels, alert history, packet recording and radio test tools. Up/Down moves between entries; A or joystick click opens them. C returns home and ends an active transmitter or GATT connection. Passive listening/recording can continue behind the home screen; the top status line shows RX or REC. Stop all radio tools ends listening, transmission, connection and PCAP recording.

Settings → Theme cycles VTS Red, Dragon, Green Radar and Black & Gold. The selection survives reboot. The display remains on at full brightness. Scan mode and channel lock currently reset at boot.

Device list → A hunts the selected signal. The plot shows the most recent 24 seconds, filtered RSSI, peak and trend. Gaps and stale samples are not presented as a new reading. Radius represents relative signal strength; angular placement is a stable layout, not a measured direction. The 160×128 radar labels up to five signatures; the lists hold up to 64 observations. Selected/visible targets are protected from eviction.

Device list → D offers evidence, raw advertisement bytes, GATT connection and advertisement replay. Low-confidence names and OUIs stay labeled as such. A tracker advertisement cannot establish who owns it, whether it is following someone, or whether it is malicious. BLE privacy addresses remain distinct observations rather than being silently joined into one identity.

GATT explorer: choose a live BLE target, then Connect / BLE GATT. Up/Down selects a characteristic; A reads; D subscribes/unsubscribes; # saves the discovered tree to SD. B disconnects. The UI retains up to 48 characteristics, 48 bytes of the most recent value, and a notification counter. The small screen shows the first 16 value bytes; the USB status exposes up to 48. No automatic write or pairing-key persistence is requested. Some peers require pairing/security that this UI does not yet support. Live testing is separate from compilation.

Radio test tools: review and start a fixed-name HackerPhone-Lab Wi-Fi beacon or BLE beacon session. Complete legacy BLE advertisements up to 31 bytes can also be replayed from the selected device menu. Sessions end after 15 seconds, on Stop, on C/B leaving the test, or when a phone call takes priority. Wi-Fi sends at most ten frames per second; BLE uses a 100 ms advertising interval. A driver rejection ends the Wi-Fi session with an error. Accepted transmit calls alone do not establish reception on another radio. Ordinary replay uses the local address. The separate Replay BLE payload + MAC action also copies a live random address; public-address cloning is unavailable. Neither action clones services or pairing keys.

Wi-Fi / BLE attacks: choose a live Wi-Fi AP from its device-tools menu, optionally select an observed client belonging to that BSSID, then review a mode under Security. Left/Right changes session duration; D changes rate; A starts; A/B stops the running session. Defaults are 15 seconds and ten packets per second, bounded to 1–60 seconds and 1–100 packets per second. BLE payload/address updates are capped at ten per second; actual advertisement interval is separately configured. The running screen reports driver-accepted requests and errors, not affected devices. Nothing starts automatically. The mode ledger separates experimental subsets from unfinished upstream features.

The SD SSID playlist defaults to /hackerphone/ssids.txt, one printable 1–32-byte SSID per line. Blank lines and lines starting with # are skipped. Choose another .txt file under /hackerphone/ using D in the file browser or SSID FILE path. It retains one name in RAM, with a 4 KiB work limit per search. A file without a valid line in that window stops the session. Active EAPOL starts an EAPOL-filtered capture when none is already running; an existing capture keeps its original filtering and ownership.

Infrared is a separate home app with recording, single-signal transmission and SD library browsing. See IR controls. Entering IR stops radio tools and CSV recording.

Traffic evidence

Radio alternation, channel hopping, shielding, weak signals and unsupported bands leave observation gaps. ESP32-S3 provides 2.4 GHz Wi-Fi and BLE; there is no 5 GHz or Bluetooth Classic reception.

SD capture and vendor data

PCAP uses raw IEEE 802.11 link type 105 with a 1,024-byte snap length and original length retained for truncated packets. Capture timestamps are time since boot expressed in PCAP's timestamp fields, not a validated wall clock. Select EAPOL-only recording to retain observed EAPOL frames; a frame count is not proof of a complete handshake. The 64 KiB PSRAM buffer absorbs bursts and reports overflow. Writes stop on a short write. Flushes occur every two seconds; power loss can leave the final record incomplete. Files are never formatted or overwritten. There is no infinite recording capacity guarantee.

CSV snapshots and PCAP/GATT files live under /hackerphone/. USB export reads only that directory. Stop recording before exporting a capture:

PCAP STOP
python tools/phone_usb.py --port COM58 capture-00001.pcap saved-capture.pcap

An SD card is optional for listening, radar, themes, hunts and GATT. For a larger vendor list, obtain an IEEE MA-L CSV with Assignment and Organization Name columns and retain its source terms. Build the separate SD data file:

python tools/build_vendor_db.py path/to/oui.csv path/to/sd/hackerphone/oui.bin

Copy oui.bin and its generated provenance JSON to /hackerphone/ on the card and reboot. This is an independent HPOUI1 format, not a ChimeraBLE binary. The loader bounds the record count and file size and searches fixed records with a small cache. It looks up only public BLE or globally assigned Wi-Fi addresses. Missing/invalid data leaves detection operational. Vendor lookup supplies a manufacturer clue; it never promotes a generic chip vendor into a camera identification. No external vendor database is bundled or relicensed as MIT.

USB console

Command Action
INFO, HEALTH, DISPLAY, TOOLKIT Aggregate diagnostics, heap integrity, radio/capture state
HOME, TOOLS, SETTINGS, FILES, CHANNELS, ALERTS, HARDWARE Open a screen
THEME 0 through THEME 3 Persist the theme
MODE 0, MODE 1, MODE 2 Combined, Wi-Fi-only, BLE-only
RECON, PAUSE, STOP Start listening, pause listening, or stop all radio tools
TARGETS, BLEAD index Observations or retained raw BLE advertisement
PCAP START, PCAP EAPOL, PCAP STOP Begin raw/EAPOL recording or finish the file
GATT CONNECT index, GATT STOP Explicitly connect to a live selected BLE observation or disconnect
GATT STATUS, GATT DUMP Link/value state or discovered tree
GATT READ handle Read a hexadecimal characteristic handle
GATT WRITE handle hexbytes Explicit acknowledged write of 1–64 bytes
GATT SUB handle, GATT UNSUB handle Enable or disable notification/indication subscription
LAB WIFI, LAB BLE, LAB STATUS Start the named 15-second beacon session or inspect it
ATTACKS, ATTACK LIST, ATTACK STATUS Open the review menu, list local mode IDs, inspect driver/session state
ATTACK AP index, ATTACK CLIENT index, ATTACK CLEAR CLIENT Snapshot a live AP and optionally one of its observed clients
ATTACK TIME seconds, ATTACK RATE packets-per-second Set bounded session parameters while stopped
ATTACK CHANNEL n, ATTACK DEST n, ATTACK SSID name Set source/destination channel (1–11) or SSID
ATTACK START mode-id, ATTACK STOP Explicit start/stop; IDs come from ATTACK LIST, not the upstream ledger
IR, IR STATUS, IR RECORD, IR STOP Open/inspect/capture/cancel IR; further commands are in the IR guide
FILEINFO relative-path, FILECHUNK relative-path offset Read-only SD export protocol
SDTEST, SCREEN, RETRYMODEM Dedicated SD test, framebuffer capture, or modem-session retry
LIGHT Retry the identified backlight expander and request full brightness

Radio operations are not queued automatically on boot. Explicit PHONE DIAL, PHONE ANSWER and PHONE HANGUP commands control live calls. USB does not expose SMS sending. See cellular diagnostics and hotspot controls for the 0.6 commands. Captures and exported observation lists may contain nearby device identifiers; development outputs remain private and ignored by version control.

Expanded 0.4 workflows

The dedicated scanner menu groups APs/stations/probes, Espressif, Pwnagotchi, Pineapple candidates, multi-SSID BSSIDs, Find My/AirTags, Flipper, skimmer clues, Flock, Meta/Ray-Ban, iBeacon, Remote ID, Axon, tracker families, Ring, EAPOL, disconnects and SAE. The list and radar retain device-family colors across themes. Open target tools → Detection evidence, then Left/Right for raw BLE, AP details, AP/client mapping and decoded Remote ID. Data ages remain visible. A matching name/OUI never proves a hostile device.

Settings → BLE scan chooses passive listening or active scan requests. Passive is the default. Active scanning can retrieve names and fields carried only in scan responses, at the cost of additional transmissions/power. The setting is saved from the physical Settings menu; the USB override is temporary.

Packet / BLE analyzer → D switches to M1–M4, complete-sequence and PMKID counters. A complete sequence means the observed replay counters and nonces match in order; no MIC or password validation is performed. The target-tools capture actions restrict recordings to frames containing the selected AP address. Channel selection follows the AP's advertised channel rather than misreporting strong adjacent-channel leakage as a channel change.

Saved device / SSID lists writes unique files below /hackerphone/lists. .hpl lists are validated completely before replacing observations, and reload as not live. A stopped scan discards pending receive work, so old queued packets cannot reactivate a loaded list. Saved lists contain addresses/names, not retained classification proof or cloned identities. Saving SSIDs selects the resulting text file as the beacon playlist. In the file browser, D selects another .txt playlist below /hackerphone/.

Attack target settings accepts manual AP/client MACs, channel and SSID, or snapshots a live target. Add target to list stores up to 16 AP/client pairs. # on the review screen toggles list use; the running session visits targets every 250 ms. Each chosen mode validates its prerequisites. Full-beacon clone, random-BSSID clone, CSA and Quiet preserve the captured security/vendor IEs. SAE uses a stable client and group-19 commit for anti-clogging retries. No peer-effect success is inferred from driver counters.

Tracker sound request explicitly connects to one selected live BLE device, checks its sound service and sends an AirTag, Find My or DULT command. The separate Find My live sweep lasts 15 seconds and attempts up to eight distinct newly seen Find My devices. Unsupported/paired/connected trackers may reject the request. A successful write does not mean sound was audible. C stops the sweep; BLE connection cancellation can finish asynchronously.

Connected network tools has a multi-tap SSID/password/IPv4 editor, an explicitly saved local NVS profile, join/DHCP status, ping/ARP and TCP probes. Host probes use the configured address; subnet and named-service probes use the connected /24 through /30 subnet. Full TCP scan covers 1–65535 and can be slow for filtered ports; D cancels, C disconnects, and # saves completed results. The first 64 result rows are retained with a truncation indicator. A port accepting TCP is not proof of the named application.

Hotspot/portal mode uses a local AP at 192.168.4.1, optionally WPA2 with an 8–63-character password. It provides no Internet routing. Custom HTML loads from /hackerphone/portal/index.html (maximum 16 KiB). The default page identifies itself as a local training demo. POST bodies are capped at 512 bytes and queued for main-loop SD writing; records in portal/submissions.csv contain uptime, client IP and hex-encoded body bytes. forms, saved and lost counters distinguish accepted, persisted and failed records. User-supplied pages should match this local demonstration purpose. Selecting Portal from probe SSID configures that one observed name and opens a review screen; it does not automatically answer arbitrary probe names.

Additional USB commands

Command Action
SCANNERS, SCANS LIST, SCAN index Open/list/select local scanner profiles 0–21
PACKETS, EAPOL STATUS Packet screen or handshake counters
CHANNEL 0..11, RADIO STATUS Hop/lock and actual-vs-logical radio channel
BLE ACTIVE 0, BLE ACTIVE 1 Temporary passive/active BLE scan selection
APINFO index AP capabilities and cached full-beacon availability
PCAP AP index, PCAP EAPOLAP index Selected-AP full/EAPOL recording
LISTS, LIST SAVE ALL, LIST SAVE AP, LIST SAVE BLE, LIST SAVE SSID Open/save observation lists or SSID playlist
LIST LOAD /hackerphone/lists/name.hpl Stop radio tools and atomically load saved observations as stale
SSID FILE /hackerphone/path.txt Select a streamed SSID playlist
ATTACK MAC address, ATTACK CLIENTMAC address Manual target, accepting 12 hex digits or colon-separated MAC
ATTACK TARGET ADD, ATTACK TARGET CLEAR, ATTACK TARGET LIST Manage the in-memory AP/client list
ATTACK USELIST 0, ATTACK USELIST 1 Select single-target or list operation
TRACKER SOUND index Explicit sound command to one live BLE observation
TRACKER LIVE START, TRACKER LIVE STOP, TRACKER LIVE STATUS Explicit timed Find My sweep and state
NETWORK, NETWORK STATUS, NETWORK RESULTS, NETWORK SAVE Network UI/status/results/SD export
NETWORK SSID text, NETWORK PASSWORD text, NETWORK HOST IPv4 Configure network parameters without echoing the password
NETWORK JOIN, NETWORK AP, NETWORK PORTAL Explicit join/hotspot/portal startup
NETWORK PROBE 0..11, NETWORK CANCEL, NETWORK STOP Start a probe, cancel worker, or disconnect/stop AP
NETWORK SELFTEST Idle-device TCP-open/TCP-closed/ICMP loopback test; no external host
NETWORK PORTALTEST Test the already running local portal with GET, a marked demo POST and DNS; writes a marked SD test record

Network probe IDs are: 0 host ping, 1 subnet ping, 2 subnet ARP, 3 common TCP ports on host, 4 all TCP ports on host, 5 Telnet, 6 SSH, 7 DNS, 8 HTTP, 9 HTTPS, 10 SMTP and 11 RDP service-port subnet sweeps. These services and all active modes need their own live validation; available controls are not a parity certificate.

0.5 missions, lists and files

Security → Recon missions records combined, Wi-Fi-only or BLE-only observations in a new /hackerphone/missions/mission-NNNNN directory. events.jsonl contains observations, repeats, departures, AP/client relationships, probe names and alerts; manifest.json records counts, completion and errors. Location is null because this board has no verified GNSS source. This is an original JSONL format, not a promise of compatibility with Marauder mission binary files. A bounded 64-slot snapshot is taken each second, repeats at most every five seconds per device. Short-lived observations and excess events can be missed; raw PCAP is the packet-level recording option. Times are uptime, not UTC.

SSID list editor stores up to 64 ASCII names of 1–32 bytes. Add/delete, import observed names, generate names, clear, save and load are available on screen. Left/Right chooses the entry to delete. Save selects the file as a beacon playlist; it does not start transmission. SSID text imports are limited to 4 KiB.

AP-list JSON import/export uses Marauder's array fields essid, bssid, channel, rssi, packets, sec, wps, man and stations. Import validates the complete file before applying it, limits JSON to 32 KiB and total AP/client entries to 64, and loads entries as stale. Saved RSSI/packet counts are not treated as a live measurement. A in the browser imports an AP .json file. Other JSON documents remain accessible through USB/file export. AP JSON export is in Recon missions.

In target lists, # marks/unmarks an observation. Marks prevent table eviction; marking all 64 slots leaves no room for newly discovered devices. Attack target settings can snapshot marked AP/client pairs or fresh clients of the selected AP into the bounded 16-pair list, and remove its final entry. USB can remove an arbitrary list index. Selection never transmits by itself.

Radio MAC settings can randomize or restore the station/AP address, or copy the viewed Wi-Fi address. Stop radio/network tools first. Changes last until reboot; the driver address is read back before success is reported. This changes a radio address, not the selected device's services, credentials or identity.

SD browser → # opens file actions: rename, copy, move to recoverable /hackerphone/trash, create folder, raw SPIFFS backup or explicit CSV upload. Writes are restricted to /hackerphone, never overwrite a destination and reject active capture/music/mission paths. Renaming a directory containing an active file is also rejected. SPIFFS backup reads the existing partition without mounting or changing it; its CRC manifest accompanies the new SD file. Restore is not implemented, because this sample's original recovery layout must be preserved. While a file operation is running, D in File actions cancels it and removes only its unfinished temporary file.

Full/common TCP host scans now multiplex up to eight nonblocking connections with a shared 180 ms deadline, instead of serially waiting once per port. This reduces timeout overhead, but a filtered 65,535-port scan can still take minutes. Stop/cancel closes pending sockets; no response is not proof a host is absent.

Optional external CSV uploads

The file-action review screen names WiGLE or WDG. A starts that selected upload; D cancels. It requires a joined Wi-Fi network, a WiGLE-format CSV supplied on SD, and /hackerphone/upload.json containing wigle_basic (base64 API username/token) or wdg_key. Keep this credential file private. Do not commit it. No upload runs automatically. TLS certificate verification remains enabled; an explicit upload may synchronize time with NTP. A receipt is written only after server acceptance.

HackerPhone's unlocated CSV/mission logs are rejected by the WiGLE header check. Files beginning with the WiGLE header still require valid, appropriately sourced location rows; the remote service validates their contents. Local QA only tested rejection of non-WiGLE data. No authenticated WiGLE/WDG upload has been tested. Cancellation after sending may leave the server outcome uncertain; the firmware does not retry automatically.

Command Action
MISSION, MISSION START 0..2, MISSION STOP, MISSION STATUS Mission UI, combined/Wi-Fi/BLE start, stop and counters
PLAYLIST, SSIDS, SSID ADD name, SSID REMOVE index Editor UI, current names, add/remove
SSID GENERATE count, SSID CLEAR, SSID SAVE, SSID LOAD path Generate, clear, save, validate/load
LIST EXPORTJSON, LIST IMPORTJSON path, LIST REMOVE index AP JSON interchange or remove a stopped observation
ADD AP mac channel name, ADD STATION mac ap-index Add a manual stale target while stopped
SELECT index, SELECT ALL, SELECT NONE, SELECT CONTAINS text, SELECT LIST Mark/unmark and list selected observations
ATTACK MARKED, ATTACK CLIENTS, ATTACK REMOVE index Populate/edit the AP/client target snapshot, without starting it
MACS, MAC STATUS, MAC RANDOM AP, MAC RANDOM STA MAC menu, actual addresses, randomize
MAC AP address, MAC STA address, MAC RESET AP, MAC RESET STA Set or restore an idle interface address
FILE STATUS, FILE CANCEL, FILE MKDIR path, FILE TRASH path File operation state/cancel, new folder, recoverable trash
FILE COPY source|destination, FILE RENAME source|destination Copy/rename with a literal pipe delimiter
BACKUP SPIFFS Read-only SPIFFS-to-SD backup, no restore
UPLOAD BEGIN size crc32hex path, UPLOAD DATA offset hexbytes, UPLOAD END Bounded CRC-checked SD upload; prefer tools/sd_upload.py
UPLOAD WIGLE path, UPLOAD WDG path, UPLOAD STATUS, UPLOAD CANCEL Explicit external CSV upload and status

All paths in this table are absolute SD paths under /hackerphone. Range notation means supply one number. Music, RTTTL, LED and side-button controls have their own guide.