| #!/usr/bin/env python |
| |
| import argparse |
| import sniffer |
| import ccid |
| import ccid_select |
| import mitm |
| |
| import usb.core |
| import usb.util |
| import sys |
| import time |
| |
| cmd1 = {0x00, 0x10, 0x00, 0x00} |
| cmd2 = {0x00, 0x20, 0x00, 0x00, 0x02} |
| cmd_poweron = {0x62, 0x62, 0x00, 0x00} |
| cmd_poweroff = {0x63, 0x63, 0x00, 0x00} |
| cmd_get_slot_stat = {0x65, 0x65, 0x00, 0x00} |
| cmd_get_param = {0x00, 0x6C, 0x00, 0x00} |
| |
| class find_class(object): |
| def __init__(self, class_): |
| self._class = class_ |
| def __call__(self, device): |
| # first, let's check the device |
| if device.bDeviceClass == self._class: |
| return True |
| # ok, transverse all devices to find an |
| # interface that matches our class |
| for cfg in device: |
| # find_descriptor: what's it? |
| intf = usb.util.find_descriptor( |
| cfg, |
| bInterfaceClass=self._class |
| ) |
| if intf is not None: |
| return True |
| |
| return False |
| |
| def find_dev(): |
| dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004) |
| if dev is None: |
| raise ValueError("Device not found") |
| else: |
| print("Found device") |
| return dev |
| |
| # main code |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("-C", "--conf", type=int, choices=[1, 2, 3, 4], help="Set USB config") |
| parser.add_argument("-b", "--read_bin", help="read ICCID, IMSI, etc.", action='store_true') |
| parser.add_argument("-c", "--cmd", help="cmds to send to sim card (Not supported yet)", |
| choices=["cmd1", "cmd2", "cmd_poweron", "cmd_poweroff", "cmd_get_slot_stat", "cmd_get_param"]) |
| parser.add_argument("-s", "--sniff", help="Sniff communication!", action='store_true') |
| parser.add_argument("-S", "--select_file", help="Transmit SELECT cmd!", action='store_true') |
| parser.add_argument("-p", "--phone", help="Emulates simcard", action='store_true') |
| parser.add_argument("-m", "--mitm", help="Intercept communication (MITM)", action='store_true') |
| |
| args = parser.parse_args() |
| print("args: ", args) |
| |
| |
| # FIXME: why is it a ccid function? |
| if args.conf is not None: |
| #FIXME: Change means to find devices |
| dev = find_dev() |
| dev.set_configuration(args.conf) |
| # Give pcsclite time to find the device |
| time.sleep(1) |
| |
| if args.read_bin is True: |
| ccid.pySim_read() |
| |
| if args.cmd is not None: |
| #FIXME: Change means to find devices |
| devs = usb.core.find(find_all=1, custom_match=find_class(0xb)) # 0xb = Smartcard |
| for dev in devs: |
| dev.write(0x1, args.cmd) |
| ret = dev.read(0x82, 64) |
| # ret = dev.read(0x83, 64, 100) |
| print(ret) |
| if args.sniff is True: |
| sniffer.sniff() |
| if args.select_file is True: |
| ccid_select.select() |
| if args.phone is True: |
| mitm.do_mitm(sim_emul=True) |
| if args.mitm is True: |
| mitm.do_mitm(sim_emul=False) |
| |
| return |
| |
| # (epi, epo) = find_eps(dev) |
| while True: |
| #ep_out.write("Hello") |
| try: |
| ans = dev.read(0x82, 64, 1000) |
| print("".join("%02x " % b for b in ans)) |
| except KeyboardInterrupt: |
| print("Bye") |
| sys.exit() |
| except: |
| print("Timeout") |
| # print(ep_in.read(1, 5000)); |
| |
| main() |