BLA
BLA (Blind LLM Agents) is the open-source Blue Defense MCP and CLI built to protect software artifacts against automated AI reverse-engineering workflows.
翻译准备中
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
ESP32-C5 boards as Kismet capture sources: dual-band Wi-Fi, Zigbee/Thread and Bluetooth LE advertising.查看完整 README ↗
ESP32-C5 boards as Kismet capture sources: dual-band Wi-Fi, Zigbee/Thread and Bluetooth LE advertising.
Plug an ESP32-C5 board into the machine that runs Kismet, or into a Windows PC on the same network, and Kismet gets a new capture source: 802.11 on 2.4 and 5 GHz, IEEE 802.15.4 for Zigbee and Thread, or Bluetooth LE advertising, whichever the source asks for. A board listens with one radio at a time, so add boards to cover more radios and channels. Kismet hops their channels and logs their packets like those of any other source. It keeps one source per board and radio across reboots and reconnects, because a source's ID comes from the board's MAC. Kismet has no release with this source in it yet: you build it from source with a small patch, or run the Docker image, which does that for you.
Documentation: the wiki.
| Three radios per board | Wi-Fi on 2.4 and 5 GHz, IEEE 802.15.4 for Zigbee and Thread, or Bluetooth LE advertising: one at a time, chosen by the source definition (esp32c5-ttyACM0, esp32c5zigbee-ttyACM0, esp32c5btle-ttyACM0). |
| Both Wi-Fi bands | 42 channels: 1–14, 36–64, 100–144 and 149–177. Kismet hops them, and boards on the same radio hop the list from different starting points, so they are not on the same channel at once. |
| A normal Kismet source | Source type esp32c5. Boards appear under Data Sources in Kismet's web UI, and their packets go into the device list, the logs and the REST API like any other source's. The tests checked this through the REST API; the web UI has not been looked at in a browser. |
| Boards on another machine | Kismet's remote capture feeds boards from wherever they are plugged in: the C helper kismet_cap_esp32c5 from Linux, the Python remote helper from Windows or anything else with Python. |
| Stable identity | A board reports its MAC as its USB serial number. Its source keeps the same UUID when the port name changes, the board reboots or the helper reconnects, so Kismet does not collect duplicates. |
| Radio metadata | Channel, frequency and signal with every packet: radiotap for Wi-Fi, a signal block for 802.15.4, the LE pseudo-header for BLE. |
| Receive only | The boards never transmit, except an 802.15.4 self-test you have to ask for by hand. |
| Docker | One image with Kismet and the C helper for amd64 and arm64, published at ghcr.io/oshri-almog/esp32c5-kismet, and a demo image with a fake board that needs no hardware. |
| Flash from the browser | The web flasher installs the firmware from Chrome or Edge, with nothing to install. A ready-made image can also be downloaded for esptool, from the flasher or from each release since v0.1.0; the two are separate builds of the same firmware, each with its own SHA-256. ESP-IDF 5.5 builds it from firmware/. |
| Setup | Kismet runs on | Boards plug into | Tested | Install guide |
|---|---|---|---|---|
| Raspberry Pi | The Pi | The Pi | Raspberry Pi 4, 8 GB, Debian 13 arm64, four boards on a powered hub, four sources at once | Install on Raspberry Pi |
| Linux PC | The PC | The PC | WSL2 Ubuntu 24.04 with the fake board. Fedora and Arch not tested | Install on Linux |
| Docker | A container on Linux or a Pi | The host | On a Raspberry Pi 4 (arm64), with the current image: four boards ran in a container as Wi-Fi, 802.15.4 and BLE sources, and the helper role fed a Kismet outside it. The image also passes its smoke test with the fake board on amd64 and arm64 | Install with Docker |
| Windows | WSL2, Docker Desktop, a Pi or a Linux machine | Windows COM ports, through the Python remote helper | Windows 11 feeding Kismet in WSL2, in Docker Desktop, and on a Raspberry Pi across the LAN | Install on Windows, Install on WSL2 |
| macOS, BSD | Untested | Untested | Not tested | Install on macOS and BSD |
The current helpers have passed their tests against a real Kismet with the fake board, and ran with real boards on the Raspberry Pi on 2026-10-02, four sources at once among the runs. The current Docker image ran with the Pi's boards that day too. On Windows the current Python remote helper ran with a board that day, feeding Kismet in WSL2. Its run across the LAN to a Pi used the version just before its latest changes, and the run with Docker Desktop an earlier image and an earlier version of the helper.
Kismet itself runs on Linux: natively, in WSL2 or in a container. Docker Desktop cannot see USB boards by itself, so the tested way on Windows is the Python remote helper (attaching boards to WSL with usbipd has not been tried). Choosing a setup compares the options.
Needs Docker with Compose.
git clone https://github.com/oshri-almog/esp32c5-kismet-wifi-interface
cd esp32c5-kismet-wifi-interface
docker compose --profile demo up demo
Open http://localhost:2501 and log in as demo / demo. A fake board shows three access points, one on 2.4 GHz and two on 5 GHz. For the other radios, put ESP32C5_DEMO=zigbee or ESP32C5_DEMO=btle in front of the last command:
ESP32C5_DEMO=btle docker compose --profile demo up demo
With sudo, as on a Raspberry Pi, the variable goes after it (sudo ESP32C5_DEMO=btle docker compose ...); in front of sudo it never reaches Compose, and the demo starts on Wi-Fi.
In PowerShell, set the variable first; it stays set until you close the window:
$env:ESP32C5_DEMO = "btle"
docker compose --profile demo up demo
Or, in any shell, put the line ESP32C5_DEMO=btle in a file named .env next to compose.yaml.
The first start pulls the published demo image, ghcr.io/oshri-almog/esp32c5-kismet:demo, about 60 MB, with no login. It is built for amd64 and arm64, so a Raspberry Pi needs a 64-bit OS.
Get this repository:
git clone https://github.com/oshri-almog/esp32c5-kismet-wifi-interface ~/esp32c5-kismet-wifi-interface
Give your user access to the boards' ports. On Debian and Raspberry Pi OS, /dev/ttyACM* belongs to the dialout group; without it, flashing on this machine in step 3 stops with Permission denied and a source fails with cannot open /dev/ttyACM0: Permission denied. If id does not list dialout, add yourself, then log out and back in so the change applies (the test Pi's user was in the group already, so this step was not needed there):
sudo usermod -aG dialout $USER
Flash each board. The easiest way is the web flasher, which needs nothing installed: open it in Chrome or Edge 89 or newer on a desktop computer, plug the board in by its native USB port, press Install, choose the board's port and wait until it is done. The computer does not have to be the Pi: you can flash on a PC and move the board to the Pi afterwards. Stop anything that has the board's port open first, and back up the board's flash if you may want its old firmware back; Flashing the firmware shows how, and how to write a release's image with esptool instead. A board last used for Zigbee or Thread can come up deaf to Wi-Fi after the flash: run a Wi-Fi source on it before you flash it, or afterwards run a BLE source on it and then the Wi-Fi source.
Or build and flash the firmware on this machine, from an ESP-IDF 5.5 shell. Change /dev/ttyACM0 to the board's port:
cd ~/esp32c5-kismet-wifi-interface/firmware
idf.py set-target esp32c5
idf.py -p /dev/ttyACM0 flash
To flash on another machine with ESP-IDF instead, run the same idf.py commands from its copy of firmware/, with its port name, for example COM14 on Windows.
A board flashed from the Wireshark project's browser flasher (its firmware 1.2.0) works too: a test board with the 1.2.0 image the flasher installs, written with esptool, captured Wi-Fi, 802.15.4 and BLE under both helpers, with earlier versions of them; that browser flasher itself was not used in the tests. A board that streams but never gets in sync with the helper needs this project's firmware.
Warning: until a login is set, the first person to open Kismet's web page chooses it. Step 5 sets it; if you skipped it, open the page yourself straight away.
You need boards with this project's firmware (the web flasher installs it from Chrome or Edge on this PC), a Kismet with the esp32c5 source running somewhere this PC can reach (a Pi, a Linux machine, WSL2 or Docker Desktop), and an API key from it with the datasource role. In PowerShell, with Python 3.10 or newer:
git clone https://github.com/oshri-almog/esp32c5-kismet-wifi-interface
cd esp32c5-kismet-wifi-interface
python -m pip install -r requirements.txt
python -m esp32c5_kismet.remote --list
$env:KISMET_CAP_APIKEY = "3F9A6C1E07B24D58A1C9E2F4608B7D35"
python -m esp32c5_kismet.remote --connect 192.168.1.50:2501 --source esp32c5-COM14
Change 192.168.1.50 to the Kismet machine's address (127.0.0.1 for Kismet in WSL2 or Docker Desktop on the same PC; Guide: Windows boards to a Pi feeds a Pi across the network), 3F9A6C1E07B24D58A1C9E2F4608B7D35 to your key, and COM14 to the port --list shows. The key goes in an environment variable to keep it off the helper's command line, which Task Manager can show. A Kismet login works too; Install on Windows shows both. Add a --source for each board: esp32c5zigbee-COM15 or esp32c5btle-COM15 for the other radios. Stop the helper with Ctrl+C. Remote capture shows how to make the key.
The wiki covers installation on each platform, every feature and step-by-step guides. Good places to start:
The wiki's source lives in docs/wiki/ in this repository; changes to the documentation go there.
| Path | What it is |
|---|---|
firmware/ | ESP-IDF 5.5 project for the board: one radio per boot, a line protocol over the native USB port |
kismet/ | The Kismet side, GPL-2.0-or-later: datasource_esp32c5.h (the esp32c5 source type for the server), capture_esp32c5/ (the C helper kismet_cap_esp32c5), and add-to-kismet.sh, which adds both to a Kismet source tree and fixes seven upstream bugs in Kismet's capture framework |
esp32c5_kismet/ | The Python remote helper, python -m esp32c5_kismet.remote, for boards on Windows or any other OS with Python |
docker/, compose.yaml | The Docker image (Kismet with the C helper, and a demo target with the fake board) and its Compose file |
tools/fake_board.py | A fake board on a POSIX pseudo-terminal, for trying things without hardware |
tests/ | Offline tests of the Python remote helper, a C test harness for the C helper, Kismet end-to-end tests for both helpers with the fake board, and a Docker smoke test |
303a:1001), with at least 2 MB of flash. For several boards, a powered USB hub.cfe427074 with kismet/add-to-kismet.sh applied (needs autoconf, automake and python3 besides Kismet's own build dependencies, and about 1.5 GB of memory per compile job), or Docker on amd64 or arm64 (a 64-bit OS on a Raspberry Pi).pyserial>=3.5, msgpack>=1.0 and websocket-client>=1.9.1 from requirements.txt. The helper has run with real boards on Python 3.13 (3.13.2 on Windows 11, 3.13.5 on the Pi), and its tests also on 3.12.3; an earlier version of it also passed its tests and captured on the Pi on 3.10, 3.11 and 3.12. On Debian and Ubuntu, install the packages with pip into a virtual environment: the distributions' websocket-client is older than this.The firmware started as that of esp32c5-wireshark-sniffer (its release 1.2.0), and the board speaks the same line protocol in both projects. This project's web flasher and releases install the firmware with these changes; that project's flasher installs its 1.2.0. The changes made here:
The serial stream code of the Python remote helper, esp32c5_kismet/board.py, started as that project's host/sniffer.py.
MIT, see LICENSE, except the kismet/ directory, which is GPL-2.0-or-later because it is written to become part of Kismet and links against Kismet's capture framework; see kismet/COPYING.md. The Docker image contains Kismet and is GPL-2.0-or-later too.
Built on Kismet by Mike Kershaw (dragorn) and contributors, and on Espressif's ESP-IDF. The web flasher runs on ESPHome's ESP Web Tools. Prior art and everything this project stands on are in CREDITS.md.
Only capture on networks and devices you own or are authorised to test.
Build Kismet with the esp32c5 source and install it into your home directory. The make step took about 78 minutes on a Raspberry Pi 4 with 8 GB:
sudo apt-get update
sudo apt-get install -y build-essential git pkg-config autoconf automake python3 libwebsockets-dev zlib1g-dev libnl-3-dev libnl-genl-3-dev libcap-dev libpcap-dev libnm-dev libdw-dev libsqlite3-dev libsensors-dev libusb-1.0-0-dev libmosquitto-dev libpcre2-dev libssl-dev
git clone https://github.com/kismetwireless/kismet.git ~/src/kismet
git -C ~/src/kismet checkout cfe427074
sh ~/esp32c5-kismet-wifi-interface/kismet/add-to-kismet.sh ~/src/kismet
cd ~/src/kismet
./configure --prefix=$HOME/kismet-install --disable-python-tools --disable-librtlsdr --disable-ubertooth --disable-bladerf --disable-btgeiger
nice make -j4
make install INSTUSR=$(id -un) INSTGRP=$(id -gn) SUIDGROUP=$(id -gn)
The package list has not been tried on a freshly installed system, where more may be missing; configure names any library it cannot find. Kismet's compiler needs about 1.5 GB of memory per job; with less than 8 GB, use fewer jobs than -j4.
Set Kismet's web login before the first start. Change admin and the password:
mkdir -p ~/.kismet
printf 'httpd_username=%s\nhttpd_password=%s\n' admin 'choose-a-long-password' > ~/.kismet/kismet_httpd.conf
chmod 600 ~/.kismet/kismet_httpd.conf
Start Kismet with one board on Wi-Fi, in a folder of its own, because Kismet writes its log into the folder it starts in:
mkdir -p ~/kismet-logs
cd ~/kismet-logs
~/kismet-install/bin/kismet --no-ncurses -c esp32c5-ttyACM0
Use esp32c5zigbee-ttyACM0 or esp32c5btle-ttyACM0 for the other radios, and one -c per board. Then open http://<the Pi's address>:2501 and log in.
web/| The web flasher: its page and manifest, which the firmware workflow fills in and publishes to GitHub Pages |
docs/wiki/ | The source of the wiki |
.github/workflows/docker.yml | CI: builds and tests the image for amd64 and arm64, and publishes it to ghcr.io/oshri-almog/esp32c5-kismet for version tags and manual runs (first for v0.1.0) |
.github/workflows/firmware.yml | CI: builds the firmware and the web flasher's site, publishes the site from main, and attaches the merged image to the release of each version tag |
.github/workflows/wiki.yml | Copies docs/wiki/ to the GitHub wiki whenever it changes on main |
requirements.txt | The Python packages the remote helper needs |