
Ubiquiti AirMAX वायरलेस प्रोटोकॉल फ़्रेम के लिए डिकोडर/एन्कोडर; pcap/लाइव कैप्चर पार्स करें, डिवाइस खोजें, असुरक्षित फ़र्मवेयर के लिए स्कैन करें, विकृत पैकेट तैयार करें और AirMAX AC/M लक्ष्यों का अनुकरण करें।
Ubiquiti AirMAX वायर-प्रोटोकॉल फ्रेम के लिए डिकोडर और एन्कोडर, जो AC (WA फर्मवेयर) और M (XW/XM फर्मवेयर) दोनों श्रृंखलाओं को कवर करता है।
ksy/ के अंतर्गत संचालित होता है। AC पेलोड (संस्करण-गेटेड, msg_type पर स्विच्ड, डीऑथ XOR-अनमास्क के साथ) ac.py में हस्तलिखित है — वह तर्क पार्स-ओनली Kaitai में फिट नहीं होता।| वैरिएंट | डीकोड | एन्कोड | pcap पुनरावृत्ति |
|---|---|---|---|
| AC | ✅ सभी 5 msg प्रकार (beacon, assoc req/resp, probe req, deauth) | ✅ बाइट-सटीक व्युत्क्रम + बिल्डर + seal | ✅ |
| M | आंशिक (9 प्रलेखित बाइट्स; शेष unknown_rest के रूप में) | ✅ प्रलेखित हेड + unknown_rest का राउंड-ट्रिप | ✅ |
| Routerboard.com IE (M का सहयोगी) | ✅ डिवाइस नाम + उप-IE सूची | लागू नहीं | ✅ |
AC वायर प्रारूप
docs/ac_wire_format.md का अनुसरण करता है
([P]-ubnt_poll_host.ko के विरुद्ध पुष्टि)। सभी AC मल्टी-बाइट पूर्णांक
बड़े-एंडियन हैं।
pyrmax.ac.encode(AcPacket) -> bytes — decode() का हस्तलिखित बाइट-सटीक
व्युत्क्रम (+ seal(), to_ie(), और build_* कंस्ट्रक्टर)।pyrmax.m.encode(MPacket) -> bytes — M के लिए भी वही (+ build_m,
seal, to_ie)।[open] AC फ़ील्ड्स को पिन करें — cap_flags सटीक बिट मैप,
mixed_mode, field_14/field_9c (assoc_req), sta_field_68/ic_6b8
(assoc_resp), और deauth enc_token (निकालने योग्य लेकिन इसकी कुंजी अभी तक
रिवर्स-इंजीनियर नहीं हुई है, इसलिए इसे सत्यापित नहीं किया जा सकता)। देखें
docs/ac_wire_format.md §11-§12।version < 9 AC डिकोडरों को वास्तविक कैप्चर के विरुद्ध सत्यापित करें —
TX बिल्डर केवल संस्करण 9 उत्सर्जित करता है, इसलिए निम्न-संस्करण (अटैग्ड
नाम, लापता टेल फ़ील्ड) पथ स्पेक से लागू किए गए हैं लेकिन
वायर पर असत्यापित हैं।unknown_rest में) — वर्तमान में अपारदर्शी।pcap.FrameMeta पर: चैनल, RSSI,
दर। वर्तमान में केवल टाइमस्टैम्प/MAC/BSSID भरे गए हैं।tests/samples/ में — वर्तमान में:
airmax_ac_beacon.pcap (1 फ्रेम, beacon) और
airmax_m_probe_response.pcap (1 फ्रेम, probe response)। अधिक वैरिएंट
(assoc req/resp, मल्टी-फ्रेम कैप्चर) अभी भी स्वागत योग्य हैं।scan (सक्रिय force-assoc) और emulate
कमांड scapy के माध्यम से इंजेक्ट करते हैं ([scan] / [emulate] एक्स्ट्रा)। देखें
scan.py / emulate.py।पैकेज एक उप-कमांड संचालित CLI के साथ आता है। इसे इस प्रकार चलाएँ
python -m pyrmax COMMAND ...।```
usage: python -m pyrmax [-h] [--version] COMMAND ...
COMMAND parse Print each AirMAX frame in detail. discover Summarize devices observed in the capture. scan Live-scan for AirMAX devices and flag vulnerable firmware. emulate Emulate AirMAX AC/M devices (fake targets for scanners).
`parse` और `discover` **या तो** एक pcap/pcapng फ़ाइल (positional) लेते हैं
**या** `-i / --iface IFACE` के माध्यम से एक लाइव वायरलेस इंटरफ़ेस। ये दोनों
परस्पर अनन्य हैं। `scan` समान स्रोत विकल्प स्वीकार करता है (साथ ही एक
`--active` मोड जो केवल लाइव इंटरफ़ेस पर लागू होता है); `emulate` केवल
लाइव के लिए है।```sh
python -m pyrmax parse capture.pcap # offline
python -m pyrmax discover capture.pcap
sudo python -m pyrmax parse -i wlan0mon # live (needs root)
sudo python -m pyrmax discover -i wlan0mon
लाइव कैप्चर यह मानता है कि इंटरफ़ेस रुचि के चैनल पर पहले से ही मॉनिटर मोड में है — pyrmax इनमें से किसी को भी कॉन्फ़िगर नहीं करता।
इसके लिए वैकल्पिक [live] एक्स्ट्रा की आवश्यकता होती है (pip install pyrmax[live]), जो
pcapy-ng को शामिल करता है। रोकने के लिए Ctrl-C दबाएँ: parse बताता है कि
उसने कितने फ्रेम स्ट्रीम किए; discover बाहर निकलने पर एकत्रित डिवाइस
सारांश प्रिंट करता है।
निकास कोड (दोनों कमांड और दोनों स्रोत मोड द्वारा साझा): 0 सफलता पर
(जिसमें "no AirMAX frames" — एक वैध परिणाम शामिल है), 1 कैप्चर-प्रारूप
त्रुटियों के लिए (गलत लिंक प्रकार, दूषित फ़ाइल, इंटरफ़ेस नहीं खोल सकता),
2 लापता फ़ाइल या अमान्य स्रोत तर्कों के लिए।
parse — प्रति-फ़्रेम डंप```shpython -m pyrmax parse capture.pcap
प्रत्येक 802.11 प्रबंधन फ्रेम जो AirMAX विक्रेता IE ले जाता है, एक
ब्लॉक उत्पन्न करता है: AC packet, M packet, और कोई भी Routerboard.com सहयोगी IE जो उसी फ्रेम में
पाया गया।```
Found 1 AirMAX frame(s) in capture.pcap: 0 AC, 1 M (1 with Routerboard companion).
=== Frame #0 [M] ts=1765494974.955358 ===
802.11 src=04:18:d6:0e:0c:42 dst=24:a4:3c:88:d8:22 bssid=04:18:d6:0e:0c:42
AirMAX M
version 15
msg_type BEACON (raw=1)
src_mac 04:18:d6:0e:0c:42
enable 1
unknown_rest b700000000000000000000040418d60e0c420000000000 (23B)
Routerboard.com IE
oui_type 0
unknown 0000
device_name 'AP Sur HY1315'
sub_ie subtype=1 (30B) 040000001f660902ff0f4150205375722048593133313500000000000000
वही सिंगल-पास वॉकर प्रोग्रामेटिक रूप से pyrmax.pcap.iter_airmax(path) के रूप में उपलब्ध है — यह प्रत्येक AirMAX-युक्त फ्रेम के लिए एक AirmaxRecord(meta, ac, m, routerboard) उत्पन्न करता है, इसलिए आपको M और Routerboard IEs को हाथ से मिलान करने की आवश्यकता नहीं है।
discover — डिवाइस सारांश```shpython -m pyrmax discover capture.pcap
फ्रेम्स को 802.11 सोर्स MAC द्वारा समूहीकृत किया जाता है, पीयर्स एकत्रित होते हैं, और AC
पेलोड / M पेलोड / Routerboard डिवाइस-नाम के अवलोकन एक ही ब्लॉक में समाहित हो जाते हैं
प्रति डिवाइस।```
2 device(s) observed in capture.pcap across 12 AirMAX frame(s).
24:5a:4c:44:57:fd (AC)
radioname 'LB1'
ssid 'labalUBI2'
ac_msg_types BEACON
ac_version 9
cap_flags 0x0000003e
mixed_mode 0
frames 8
first seen 1767046123.708745
last seen 1767046129.012448
peers (broadcast only)
04:18:d6:0e:0c:42 (M)
device_name 'AP Sur HY1315'
msg_types BEACON
m_version 15
m_enable 1
frames 4
first seen 1765494974.955358
last seen 1765494980.341110
peers 24:a4:3c:88:d8:22
यही एकत्रीकरण एक सार्वजनिक फ़ंक्शन के रूप में भी उपलब्ध है:```python from pyrmax.devices import summarize from pyrmax.pcap import iter_airmax
devices = summarize(iter_airmax("capture.pcap")) for mac, dev in devices.items(): print(mac.hex(":"), dev.device_name or dev.radioname, dev.peers)
## उपयोग
### एकल AirMAX AC संदेश डिकोड करें
डिकोडर 802.11 Vendor Specific IE के बाइट्स की अपेक्षा करता है **OUI से शुरू
होते हुए** — IE रैपर (Element ID `0xDD` + Length) पहले ही हटाया
जाना चाहिए। `src_mac` / `dst_mac` बाहरी 802.11 फ्रेम के
SA / DA से लिए जाते हैं।```python
from pyrmax import ac
packet = ac.decode(
data, # bytes starting at b"\x00\x27\x22"
src_mac="aa:bb:cc:dd:ee:ff", # accepts str ("aa:bb:..." or "aa-bb-..."
# or "aabbcc...") and raw 6-byte bytes
dst_mac="ff:ff:ff:ff:ff:ff", # optional — defaults to broadcast
)
packet.msg_type # <MsgType.BEACON: 1>
packet.version # 9 (the wire-format epoch / version gate)
packet.src_mac # b'\xaa\xbb\xcc\xdd\xee\xff' (integrity-checked)
packet.radioname # "lab-rx-1" (convenience prop, delegates to body)
packet.ssid # "NetA"
packet.cap_flags # 0x3e (None for msg types that have no cap_flags)