编辑代码

import struct
import sys
from scapy.all import rdpcap
from scapy.config import conf

conf.manufdb = None

KEY_TYPE = ["KeyA", "KeyB"]

def main():

    if len(sys.argv) < 2:
        print("Usage: %s <file>", sys.argv[0])
        sys.exit(1)

    file_path = sys.argv[1]

    try:
        packets = rdpcap(file_path)
    except Exception as e:
        print(f"Error opening file: {e}")
        sys.exit(1)

    card_map = {}
    key_map = {}

    for packet in packets:
        b = bytes(packet)
        if len(b) == 0x11:
            if b[1] == 0xFA:  # PCD -> PICC
                if b[5] == 0x60 or b[5] == 0x61:
                    # 0x60 KeyA auth, 0x61 KeyB auth
                    uid = struct.unpack('>I', b[7:11])[0]
                    if uid not in card_map:
                        card_map[uid] = b[7:11]
                        print(f"Card UID: {uid:08X}")

                    print(f"Sector: {b[6]//4}\t{KEY_TYPE[b[5]&1]}: {b[11:17].hex().upper()}")
                    key_map[b[11:17].hex().upper()] = b[11:17]

    print("")
    for k in key_map:
        print(k)

if __name__ == "__main__":
    main()