diff --git a/panda_truth_probe.py b/panda_truth_probe.py new file mode 100644 index 0000000..7433b61 --- /dev/null +++ b/panda_truth_probe.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +import pyshark +import argparse + +def analyze_radiotap_info(pcapng_path, limit=100): + cap = pyshark.FileCapture( + pcapng_path, + display_filter='radiotap.dbm_antsignal', + use_json=True, + include_raw=False, + keep_packets=False + ) + + count = 0 + valid_entries = 0 + + print(f"\nAnalyzing up to {limit} packets for signal/noise info...\n") + + for packet in cap: + try: + if not hasattr(packet, 'radiotap'): + continue + + signal = getattr(packet.radiotap, 'dbm_antsignal', None) + noise = getattr(packet.radiotap, 'dbm_antnoise', None) + + print(f"Packet #{count + 1}") + print(f" Signal: {signal} dBm") + print(f" Noise: {noise} dBm") + + if signal is not None and noise is not None: + try: + snr = int(signal) - int(noise) + print(f" SNR: {snr} dB") + except ValueError: + print(" SNR: [could not compute]") + + print("") + valid_entries += 1 + count += 1 + if count >= limit: + break + + except Exception as e: + print(f" [!] Error reading packet: {e}") + continue + + cap.close() + + if valid_entries == 0: + print("No usable radiotap signal/noise data found. Your dongle may be a liar.") + else: + print(f"Analyzed {valid_entries} packets with radiotap data.\n") + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--pcapng', required=True, help='Path to your .pcapng file') + parser.add_argument('--limit', type=int, default=100, help='Max number of packets to analyze') + args = parser.parse_args() + + analyze_radiotap_info(args.pcapng, args.limit)