Project

General

Profile

SIMtrace » History » Version 16

laforge, 02/19/2016 10:48 PM

1 1 laforge
[[PageOutline]]
2
= Osmocom SIMtrace =
3
4
Osmocom SIMtrace is a software and hardware system for passively tracing SIM-ME communication between the SIM card and the mobile phone.
5
6
It works by utilizing the T=0 capable USART of the usb-attached AT91SAM7 microcontroller.
7
8
The USART passively receives the bytes as they are exchanged on the ISO 7816-3 / TS 11.11 interface between SIM and phone.
9
The received bytes are sent via USB to the PC, where a program called {{{simtrace}}} on the PC gathers data from the USB device,
10
parses the APDUs and forwards them via [wiki:GSMTAP] to the [wiki:wireshark] protocol analyzer.
11
12
== Features ==
13
 * Completely passive scanner
14
 * RST and ATR detection
15
 * auto-bauding with PPS / PTS support
16
 * Segmentation of APDUs
17
18
== TODO ==
19
 * Check for parity errors
20
 * Verify TCK / PCK check-bytes
21
22
== Hardware ==
23
24 16 laforge
There is no ready-built hardware for this yet, but we're workign on it; see [wiki:SIMtrace/Hardware]
25 15 laforge
26 9 tsaitgaist
The existing implementations used an Olimex SAM7-P64 development board with some of the I/O lines hooked up to the mechanical SIM card adapters from [wiki:RebelSIM_Scanner]. If the RebelSIM scanner is used, connect the USB even if just the lines are used. It needs to be powered, else the real reader will often fail to initialize the card.
27 1 laforge
28
=== Interconnections ===
29
30
The hardware schematics are very, very simple:
31
32
 * Connect SIM-RST with PA7
33
 * Connect SIM-I/O with PA6(TXD0) and PA1(TIOB0)
34
 * Connect SIM-CLK with PA2(SCK0) and PA4(TCLK0)
35
 * Connect SIM-GND with GND
36
37
=== Mode of operation ===
38
39 6 tsaitgaist
The USART of the AT91SAM7S is capable of T=0. The documentation only mentions it in clock-master mode, like you
40
would run it in a smart card reader to actively talk to a smart card. However, by using the USART input clock multiplexer,
41 1 laforge
you can use an externally-generated CLK like the one from the SIM card socket of the phone.
42
43 4 laforge
Unfortunately, the Rx Timeout feature of the USART is not working in T=0 mode, so I had to re-implement Rx timeout (waiting time)
44
handling by means of the TC (timer/counter) block 0.  Due to technical limitations, we will wait up to one byte (12 etu) more
45
than we should.
46
47 1 laforge
== Firmware ==
48
49
The Firmware for the AT91SAM7S device was written by reusing a lot of the code for the [http://www.openpcd.org/ OpenPCD]
50
RFID reader.  
51
52
There is a {{{simtrace}}} branch in the git://git.gnumonks.org/openpcd.git repository containing the latest firmware code.
53
54
Eventually, the OS part of OpenPCD/OpenPICC/SIMtrace will be separated.  At that point, the firmware source can become
55
part of simtrace.git
56
57 6 tsaitgaist
=== Toolchain ===
58
59
The toolchain gnuarm-4.0.2 can be used to crosscompile the firmware.
60
61
{{{
62
wget http://www.gnuarm.com/bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4_x86-64.tar.bz2
63
tar xf bu-*_gcc-*-c-c++_nl-*_gi-*_x86-64.tar.bz2
64
mv gnuarm-* ~/gnuarm
65
}}}
66
67
To be able to use the toolchain, add the crosscompilers to your PATH
68
69
{{{
70
export PATH=~/gnuarm/bin:$PATH
71
}}}
72
73 1 laforge
=== Building the firmware ===
74 5 laforge
75 1 laforge
Precondition: You need to set your PATH in a way that contains an arm-elf toolchain, i.e. the same way that you build [OsmocomBB].
76
77
{{{
78 6 tsaitgaist
git clone git://git.gnumonks.org/openpcd.git
79
cd openpcd/firmware
80
git checkout simtrace
81
make -f Makefile.dfu BOARD=OLIMEX
82
make BOARD=SIMTRACE DEBUG=1 TARGET=main_simtrace
83
cat dfu.bin main_simtrace.bin > main_simtrace.samba
84
cd ../..
85 1 laforge
}}}
86
87 6 tsaitgaist
=== Firmware parts ===
88 1 laforge
89
The firmware build process creates two images:
90 6 tsaitgaist
 * dfu.bin -- the sam7dfu 2nd level bootloader. It implements the USB DFU (Device Firmware Upgrade) profile.
91
 * main_simtrace.bin -- the actual simtrace program. To be loaded via DFU, using [http://dfu-util.gnumonks.org/ dfu-util].
92
 * main_simtrace.samba -- [http://www.openpcd.org/Sam7dfu sam7dfu] + simtrace image. to be loaded via SAM-BA, using sam7utils (see below).
93 1 laforge
94 6 tsaitgaist
=== Flashing the firmware ===
95
96
after the firmware has been flashed, '''lsusb''' should show:
97
{{{
98
Bus 004 Device 005: ID 16c0:0762 VOTI
99
}}}
100
101 1 laforge
==== SAM-BA ====
102
103 6 tsaitgaist
The first time you flash the device, you will have to use the SAM-BA method using the '''main_simtrace.samba''' image.
104
105
To put the board into SAM-BA mode, use the following steps:
106
 * unplug the board
107 10 tsaitgaist
 * short TEST to VCC (3.3V) pin using a jumper. leave PA0,PA1,PA2 unconnected.
108 6 tsaitgaist
 * power up the board
109
 * wait 20s
110
 * unplug board
111
 * remove jumper
112
113
Now when the board is attached to USB, '''lsusb''' should show :
114
{{{
115
Bus 002 Device 015: ID 03eb:6124 Atmel Corp. at91sam SAMBA bootloader
116
}}}
117
118 1 laforge
For more information about SAM-BA, please refer to the Atmel documentation on the AT91SAM7S component.
119
120 6 tsaitgaist
==== sam7utils ====
121 1 laforge
122 6 tsaitgaist
sam7utils will be used to flash the '''main_simtrace.samba''' image over SAM-BA.
123
{{{
124
sudo aptitude install libreadline-dev
125
wget http://www.openpcd.org/dl/sam7utils-0.2.1-bm.tar.bz2
126
tar xf sam7utils-*.tar.bz2
127
cd sam7utils
128
./configure --prefix=/usr/local
129
make
130
}}}
131 1 laforge
132 11 tsaitgaist
to flash the samba image using serial :
133
{{{
134
sudo ./sam7 -l /dev/ttyUSB0 --exec set_clock --exec unlock_regions --exec "flash ../openpcd/firmware/main_simtrace.samba"
135
}}}
136
to flash the samba image using libusb :
137
{{{
138
sudo ./sam7 --exec set_clock --exec unlock_regions --exec "flash ../openpcd/firmware/main_simtrace.samba"
139
}}}
140
141 6 tsaitgaist
===== sam7utils for x86 =====
142
143
On x86, sam7utils will be compile to communicate with the board using POSIX.
144
145
The board should be attached to a node. On ubuntu 10.10, the usb device 03eb:6124 is mapped on /dev/ttyACM0 using the cdc_cam module. If not mapped, use usbserial :
146
{{{
147 1 laforge
sudo rmmod usbserial
148 6 tsaitgaist
sudo modprobe usbserial vendor=0x03EB product=0x6124
149
}}}
150 1 laforge
151 11 tsaitgaist
Now replug board. It should map to /dev/ttyUSBx (use dmesg to know which).
152 6 tsaitgaist
153
===== sam7utils for amd64 =====
154
155 11 tsaitgaist
On amd64, sam7utils will be compiled to communicate with the board using libusb.
156 6 tsaitgaist
157 11 tsaitgaist
On ubuntu 10.10 & 11.04, the usb device 03eb:6124 is mapped on /dev/ttyACMx using the cdc_cam module.
158
Remove it while the board is plugged, so sam7utils is able to communicate with it (using libusb for 10.10 and serial for 11.04).
159 6 tsaitgaist
{{{
160
sudo rmmod cdc_acm
161
}}}
162
163
==== DFU ====
164
165
TODO
166 1 laforge
167 5 laforge
== Host PC Software ==
168
169 6 tsaitgaist
The {{{simtrace}}} program is part of the git://git.osmocom.org/simtrace.git repository. It will bind to the USB device
170 5 laforge
and send GSMTAP frames using UDP/IPv4 to localhost:4729.
171 6 tsaitgaist
172 14 tsaitgaist
=== Preconditions ===
173 1 laforge
174 14 tsaitgaist
[wiki:libosmocore] and headers (simtrace_usb.h) from the firmware.
175
176
additional packages :
177 6 tsaitgaist
{{{
178 14 tsaitgaist
sudo apt-get install libusb-dev
179 6 tsaitgaist
}}}
180
181 7 tsaitgaist
=== Compiling it ===
182 1 laforge
183 6 tsaitgaist
Precondition:  [wiki:libosmocore] and headers (simtrace_usb.h) from the firmware.
184
185
{{{
186 14 tsaitgaist
git clone git://git.osmocom.org/simtrace.git
187 6 tsaitgaist
cd simtrace/at91sam7/host/
188
make
189
}}}
190
191
=== Using it ===
192
193
Simply start '''simtrace'''.
194 13 tsaitgaist
It will send the GSMTAP frames to UDP/IPv4 localhost:4729.
195 1 laforge
196
It will also print hexdumps of the frames to the console, looking like this:
197 6 tsaitgaist
{{{
198 1 laforge
sudo ./simtrace
199
APDU: (9):  a0 a4 00 00 02 6f 07 9f 0f
200
APDU: (22):  a0 c0 00 00 0f 00 00 00 09 6f 07 04 00 15 00 15 01 02 00 00 91 78
201
APDU: (9):  a0 a4 00 00 02 6f 38 9f 0f
202
APDU: (22):  a0 c0 00 00 0f 00 00 00 09 6f 38 04 00 15 00 55 01 02 00 00 91 78
203
APDU: (16):  a0 b0 00 00 09 ff 3f ff ff 00 00 3f 03 00 91 78
204
APDU: (9):  a0 a4 00 00 02 6f ad 9f 0f
205
APDU: (8):  a0 b0 00 00 01 00 91 78
206
APDU: (9):  a0 a4 00 00 02 6f 07 9f 0f
207
APDU: (16):  a0 b0 00 00 09 08 49 06 20 11 49 00 11 06 91 78
208
APDU: (9):  a0 a4 00 00 02 6f 7e 9f 0f
209
APDU: (18):  a0 b0 00 00 0b ff ff ff ff 64 f0 00 ff fe 00 03 91 78
210
APDU: (9):  a0 a4 00 00 02 6f 78 9f 0f
211
APDU: (9):  a0 b0 00 00 02 00 01 91 78
212
APDU: (9):  a0 a4 00 00 02 6f 74 9f 0f
213 2 laforge
APDU: (23):  a0 b0 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 91 78
214
APDU: (9):  a0 a4 00 00 02 6f 20 9f 0f
215
APDU: (16):  a0 b0 00 00 09 ff ff ff ff ff ff ff ff 07 91 78
216
APDU: (9):  a0 a4 00 00 02 6f 30 9f 0f
217 1 laforge
APDU: (22):  a0 c0 00 00 0f 00 00 00 f0 6f 30 04 00 11 00 55 01 02 00 00 91 78
218
}}}
219
220
== Wireshark integration ==
221
222 6 tsaitgaist
There is an experimental patch, also part of the simtrace.git package.  You will have to apply this against the latest
223 1 laforge
[wiki:wireshark] developer version.
224
225
[[Image(wireshark-sim.png)]]
226
227
Protocol parsing is far from being complete, patches are always welcome!
Add picture from clipboard (Maximum size: 48.8 MB)