mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
The code used a vendor and product id taken from Atmel example code. Now it is changed to the vendor and product id, which was also previously used in the original SIMtrace code.
109 lines
3.3 KiB
Python
Executable File
109 lines
3.3 KiB
Python
Executable File
#!/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=0x16c0, idProduct=0x0762)
|
|
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()
|