Files
pm3py/.pythonstartup.py
michael e90a907630 feat: rewrite SniffSession with live streaming and REPL auto-load
Replace lightweight async SniffSession with persistent synchronous
session using raw pyserial (mirroring SimSession pattern). Background
reader thread decodes and prints trace frames live as they arrive.

API:
  session = SniffSession.open()
  session.start_15693()          # live streaming (default)
  session.start_15693(live=False) # legacy batch mode
  session.stop()                 # or button press to pause/resume
  session.entries                # all captured frames
  session.clear()

.pythonstartup.py auto-creates session in sniff mode.
2026-03-19 12:34:05 -07:00

118 lines
3.7 KiB
Python

"""Auto-imports for interactive REPL sessions.
Usage: activate — core imports (Proxmark3, Cmd, etc.)
activate sim — + SimSession, all transponder models
activate sniff — + SniffSession, trace decoders
activate all — everything
"""
import os
import sys
_MODE = os.environ.get("PM3PY_MODE", "core")
# --- Import groups ---
CORE = [
("pm3py", "Proxmark3"),
("pm3py", "Cmd"),
("pm3py", "PM3Status"),
("pm3py", "PM3Error"),
("pm3py", "PM3Response"),
]
SIM = [
("pm3py.sim", "SimSession"),
("pm3py.sim", "DualInterfaceSession"),
("pm3py.sim", "SoftwareMedium"),
("pm3py.sim", "TableCompiler"),
("pm3py.sim", "RFFrame"),
# Transponder models
("pm3py.transponders.hf.iso14443a.base", "Tag14443A_3"),
("pm3py.transponders.hf.iso14443a.base", "Tag14443A_4"),
("pm3py.transponders.hf.iso14443a.nxp.mifare_classic", "MifareClassicTag"),
("pm3py.transponders.hf.iso14443a.nxp.desfire", "DesfireTag"),
("pm3py.transponders.hf.iso14443a.ndef", "NfcType2Tag"),
("pm3py.transponders.hf.iso14443a.ndef", "NfcType4Tag"),
("pm3py.transponders.hf.iso15693.base", "Tag15693"),
("pm3py.transponders.hf.iso15693.type5", "NfcType5Tag"),
("pm3py.transponders.hf.iso15693.nxp.nxp_icode", "NxpIcodeTag"),
("pm3py.transponders.hf.iso15693.nxp.icode_slix", "IcodeSlixTag"),
("pm3py.transponders.hf.iso15693.nxp.icode_slix2", "IcodeSlix2Tag"),
("pm3py.transponders.hf.iso15693.nxp.icode3", "Icode3Tag"),
("pm3py.transponders.hf.iso15693.nxp.icode_dna", "IcodeDnaTag"),
("pm3py.transponders.hf.iso15693.nxp.ntag5_platform", "Ntag5PlatformTag"),
("pm3py.transponders.hf.iso15693.nxp.ntag5_switch", "Ntag5SwitchTag"),
("pm3py.transponders.hf.iso15693.nxp.ntag5_link", "Ntag5LinkTag"),
("pm3py.transponders.hf.iso15693.nxp.ntag5_boost", "Ntag5BoostTag"),
("pm3py.transponders.lf.em.em4100", "EM4100Tag"),
("pm3py.transponders.lf.hid.hid", "HIDProxTag"),
("pm3py.transponders.lf.atmel.t5577", "T5577Tag"),
("pm3py.transponders.implants", "xEM"),
("pm3py.transponders.implants", "xNT"),
("pm3py.transponders.implants", "xM1"),
("pm3py.transponders.implants", "FlexDF"),
("pm3py.transponders.implants", "NExT"),
]
SNIFF = [
("pm3py.sniff", "SniffSession"),
("pm3py.trace", "parse_tracelog"),
("pm3py.trace", "decode_15693"),
("pm3py.trace", "decode_ndef_annotation"),
("pm3py.trace", "format_sniff_line"),
]
# --- Mode selection ---
MODES = {
"core": [CORE],
"sim": [CORE, SIM],
"sniff": [CORE, SNIFF],
"all": [CORE, SIM, SNIFF],
}
groups = MODES.get(_MODE, [CORE])
imports = []
for group in groups:
imports.extend(group)
# --- Load ---
loaded = {}
failed = {}
for module_name, attr_name in imports:
try:
module = __import__(module_name, fromlist=[attr_name])
obj = getattr(module, attr_name)
globals()[attr_name] = obj
loaded[attr_name] = module_name
except Exception as e:
failed[attr_name] = (module_name, str(e))
# --- Report ---
if loaded:
print(f"[pm3py:{_MODE}] Loaded: {', '.join(loaded.keys())}")
if _MODE == "core":
try:
pm3 = Proxmark3.sync()
print()
print("Synchronous connection established")
print()
except Exception as e:
print(f" (Proxmark3 connection failed: {e})")
if _MODE == "sniff":
try:
session = SniffSession.open()
print("Sniff session ready -- session.start_15693()")
except Exception as e:
print(f" (Sniff session failed: {e})")
if failed:
print(f"\n[pm3py:{_MODE}] Failed:")
for name, (mod, err) in failed.items():
print(f" {name} from {mod} -> {err}")