README: quick start first, the runtime guide under Usage
The startup instructions were buried after Components/Features and mixed release/download variants with runtime detail; a reader had to scroll through the usage guide to find how to launch it, and the start scripts were only mentioned in passing. Both READMEs now lead with Prerequisites then a Quick start with three clear paths - wheel (pip), runtime zip (start.bat / ./start.sh) and a git clone (launchers, optional pip install -e .) - followed by First run (URL, capture modes, Ctrl+C). The detailed runtime guide moves under `Usage`: the server and PWA, COMPRION import, the Files view, the hosted PWA, the capture utility, the utility CLI options, output formats, the daemon, library usage and recovery. Components and Features follow the usage guide; USB device access keeps its anchor. Only the Analysis server intro gained the launcher note; every moved section is byte-identical (checked old vs new). 557 Python + 80 Node tests.
This commit is contained in:
1 parent
6ed3a7b7d6
commit
a863f66860
2 files changed
+372
-336
No files matched your search
@@ -13,73 +13,6 @@ GSMTAP into this analyser.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Components
|
|
||||||
|
|
||||||
- **Analysis server + PWA** (`simtrace-analyser-server`) — stores captured
|
|
||||||
traffic in SQLite, decodes it, and serves the PWA ([`frontend/`](frontend/))
|
|
||||||
plus the HTTP API on a single origin. Three capture modes: a GSMTAP
|
|
||||||
listener, direct SIMtrace2 hardware capture, or disabled (browse existing
|
|
||||||
captures only).
|
|
||||||
- **Capture utility** (`simtrace2-pysniff`) — captures SIMtrace2 hardware
|
|
||||||
traffic and writes it to stdout, GSMTAP (Wireshark), or PCAP files. It is
|
|
||||||
one GSMTAP source of several that the analyser accepts (see also
|
|
||||||
[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)).
|
|
||||||
- **PWA** ([`frontend/`](frontend/)) — trace browser with decoded APDU,
|
|
||||||
SIM Toolkit, SMS and SCP80 OTA detail; sessions, PCAP and COMPRION trace
|
|
||||||
import, EN/RU UI.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
**APDU decoder** (server-side, rendered by the PWA):
|
|
||||||
|
|
||||||
- Full APDU decode — CLA per ISO 7816-4 / ETSI coding with the **logical
|
|
||||||
channel 0-19** (standard channels from b2-b1, the extended channels 4-19
|
|
||||||
from b4-b1 per TS 102 221 §10.3), secure messaging and command chaining,
|
|
||||||
INS names from a spec table, SFI-aware P1/P2 for READ/UPDATE BINARY and
|
|
||||||
record commands; MANAGE CHANNEL replies show the channel the card
|
|
||||||
assigned
|
|
||||||
- Status words — full ISO 7816-4 set plus UICC-specific values:
|
|
||||||
`91XX` (proactive command pending), `62F1/F2/F3`, `63F1/F2` (more data),
|
|
||||||
`9300` (SAT busy), `9850`, `9862–64`
|
|
||||||
- SIM Toolkit — SAT (GSM 11.14), CAT (TS 102 223) and USAT (TS 31.111)
|
|
||||||
proactive commands with decoded qualifiers, TERMINAL RESPONSE, ENVELOPE
|
|
||||||
(Menu Selection, Call Control, SMS-PP download…); tolerates known
|
|
||||||
non-compliant legacy-card quirks and preserves unrecognized TLVs
|
|
||||||
- TERMINAL CAPABILITY (TS 102 221 §11.1.19) — terminal power supply
|
|
||||||
(voltage class, maximum current, clock), extended logical channels,
|
|
||||||
additional interfaces (UICC-CLF) and eUICC device capabilities
|
|
||||||
(SGP.22/SGP.32)
|
|
||||||
- SMS TPDU — SMS-DELIVER/SUBMIT, SCTS timestamps, UDH information elements
|
|
||||||
- SCP80 OTA secured packets — SPI bits (ciphering, PoR requirement/mode,
|
|
||||||
RC/CC/DS, counter), KIc/KID algorithm + key set, TAR, CNTR/PCNTR;
|
|
||||||
Response Packet (PoR) decode on GET RESPONSE; **optional client-side
|
|
||||||
decryption** of ciphered packets — paste the card's 3DES/AES key in the
|
|
||||||
detail view to reveal the real CNTR and secured application data (the
|
|
||||||
key stays in the browser, in-memory only; ciphered on-wire CNTR/PCNTR/RC
|
|
||||||
are ciphertext and labeled as such); the secured application message is
|
|
||||||
decoded as a stream of **C-APDUs** (SELECT, UPDATE BINARY, …) with
|
|
||||||
full CLA/INS/P1/P2/Lc/Le breakdown — plaintext immediately, or after
|
|
||||||
decryption for ciphered packets
|
|
||||||
- ATR parse (clock-rate conversion, Fi/Di, T-bitmask, truncated-ATR safe)
|
|
||||||
and FCP/FCI TLV; the historical bytes are decoded as the UICC's
|
|
||||||
COMPACT-TLV objects (TS 102 221 §6.3.1) — card service data, the **card
|
|
||||||
capabilities** (ISO 7816-4 §8.1.1.2.7 Table 88: the assignment methods
|
|
||||||
and the announced maximum number of logical channels, `8 or more` for the
|
|
||||||
extended-capable cards) and the trailing status indicator (LCS/SW)
|
|
||||||
|
|
||||||
**SIMtrace Analyser PWA** ([`frontend/`](frontend/)):
|
|
||||||
|
|
||||||
- Trace view with Map/List modes — proactive, TERMINAL RESPONSE, ENVELOPE
|
|
||||||
and AUTH commands get distinctive styling in map view
|
|
||||||
- Sessions with deep links (`#session=N`), PCAP import (`.pcap/.pcapng/.cap`),
|
|
||||||
COMPRION trace import (the Device Manager *ISO Protocol Layer* text export),
|
|
||||||
search and a **multi-select command filter** — pick any number of commands
|
|
||||||
and/or the conversation presets (*Proactive sessions*: FETCH, TERMINAL
|
|
||||||
PROFILE and every command answered with SW 91xx; *File operations*: SELECT,
|
|
||||||
READ/UPDATE BINARY and READ/UPDATE RECORD, with the GET RESPONSE carrying a
|
|
||||||
selected command's data)
|
|
||||||
- Installable PWA, dark theme, English/Russian UI
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- **Python 3.9+**
|
- **Python 3.9+**
|
||||||
@@ -94,22 +27,17 @@ GSMTAP into this analyser.
|
|||||||
|
|
||||||
No other dependencies. PCAP, GSMTAP, and hex dump output use only Python stdlib.
|
No other dependencies. PCAP, GSMTAP, and hex dump output use only Python stdlib.
|
||||||
|
|
||||||
## Install
|
## Quick start
|
||||||
|
|
||||||
There are two ways to get the analyser: install a release artifact (no git
|
Three ways to get it running; all of them serve the same PWA at
|
||||||
history), or clone the repository for development. Both bundle the same PWA.
|
http://127.0.0.1:8081/.
|
||||||
|
|
||||||
### From a release (no git history)
|
### 1. Wheel (pip)
|
||||||
|
|
||||||
Everything is on the
|
The wheel bundles the PWA, so the server serves the UI by itself:
|
||||||
[latest release](https://github.com/anttro/simtrace-analyser/releases/latest).
|
|
||||||
|
|
||||||
**Wheel** (the PWA is inside the package):
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install ./simtrace_analyser-2.7.13-py3-none-any.whl
|
pip install ./simtrace_analyser-2.7.13-py3-none-any.whl
|
||||||
|
|
||||||
# then run (the UI is served at http://127.0.0.1:8081/):
|
|
||||||
simtrace-analyser-server --capture gsmtap
|
simtrace-analyser-server --capture gsmtap
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -117,31 +45,43 @@ If your system Python is externally managed (PEP 668 — common on Arch and
|
|||||||
Fedora), install into a virtual environment first:
|
Fedora), install into a virtual environment first:
|
||||||
`python3 -m venv .venv && . .venv/bin/activate`.
|
`python3 -m venv .venv && . .venv/bin/activate`.
|
||||||
|
|
||||||
`pip` can also fetch the wheel straight from the release page (use the version
|
Every artifact is on the
|
||||||
shown there):
|
[latest release](https://github.com/anttro/simtrace-analyser/releases/latest).
|
||||||
|
`pip` can fetch the wheel directly (use the version shown there), or the GitHub
|
||||||
|
CLI can pick the latest one:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl
|
pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl
|
||||||
```
|
# or:
|
||||||
|
|
||||||
With the GitHub CLI, download the latest wheel without knowing the version:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
gh release download --pattern '*.whl'
|
gh release download --pattern '*.whl'
|
||||||
pip install ./simtrace_analyser-*.whl
|
pip install ./simtrace_analyser-*.whl
|
||||||
```
|
```
|
||||||
|
|
||||||
**Source archive** — the *Source code (zip / tar.gz)* assets are the full tree
|
### 2. Zip (Windows-friendly, no installer)
|
||||||
without the git history: unzip, `cd` into it and use the launchers below
|
|
||||||
(`./start.sh` on Linux/macOS, `start.bat` on Windows).
|
|
||||||
|
|
||||||
**Zip (Windows-friendly, no installer)** — `simtrace-analyser-2.7.13.zip` is
|
Download `simtrace-analyser-2.7.13.zip` from the release page and extract it
|
||||||
the runtime tree only (packages, PWA, launchers, docs; no tests, no git):
|
anywhere: it is the runtime tree (the Python packages, the PWA, the launchers
|
||||||
download it, extract it anywhere and run `start.bat` (Windows) or
|
and the docs — no tests, no git). Then run:
|
||||||
`./start.sh` (Linux/macOS). Python 3 has to be on `PATH`; `pip install pyusb`
|
|
||||||
is only needed for direct SIMtrace2 capture.
|
|
||||||
|
|
||||||
### From a git clone (development)
|
Windows:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
Linux/macOS:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Python 3 has to be on `PATH`; `pip install pyusb` is only needed for direct
|
||||||
|
SIMtrace2 capture. The launchers accept the server's options
|
||||||
|
(`start.bat --capture direct`, `./start.sh --capture direct --port 8080`).
|
||||||
|
(The release's *Source code* archive is the full tree including tests; it
|
||||||
|
works like a clone below.)
|
||||||
|
|
||||||
|
### 3. Git clone (development)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone https://github.com/anttro/simtrace-analyser.git
|
git clone https://github.com/anttro/simtrace-analyser.git
|
||||||
@@ -149,30 +89,42 @@ cd simtrace-analyser
|
|||||||
./start.sh # Linux/macOS; on Windows: start.bat
|
./start.sh # Linux/macOS; on Windows: start.bat
|
||||||
```
|
```
|
||||||
|
|
||||||
The launchers add the checkout to `PYTHONPATH` and run
|
The launchers put the checkout on `PYTHONPATH` and run
|
||||||
`python -m simtrace_analyser`, so no install step is needed for browsing and
|
`python -m simtrace_analyser`, so nothing has to be installed for browsing and
|
||||||
GSMTAP capture; they accept the server's options (`./start.sh --capture direct
|
GSMTAP capture; their options are the server's
|
||||||
--port 8080`). Direct hardware capture needs **PyUSB** (`pip install pyusb`).
|
(`./start.sh --capture direct --port 8080`). Direct hardware capture needs
|
||||||
|
**PyUSB** (`pip install pyusb`). To get the console scripts
|
||||||
To get the console scripts (`simtrace-analyser-server`, `simtrace2-pysniff`)
|
(`simtrace-analyser-server`, `simtrace2-pysniff`) install the package:
|
||||||
install the package instead:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install -e .
|
pip install -e .
|
||||||
simtrace-analyser-server --capture gsmtap
|
simtrace-analyser-server --capture gsmtap
|
||||||
```
|
```
|
||||||
|
|
||||||
On Windows the `.bat` launchers run the `python` command, so Python 3 has to be
|
### First run
|
||||||
on `PATH` (check with `python --version`); direct USB capture additionally
|
|
||||||
needs the driver swap described in [USB Device Access](#usb-device-access).
|
|
||||||
|
|
||||||
## Running
|
Open **http://127.0.0.1:8081/** — the PWA is served by the server, so the UI
|
||||||
|
and the API share an origin (no CORS/Private-Network-Access setup). `Ctrl+C`
|
||||||
|
stops the server.
|
||||||
|
|
||||||
|
- `--capture gsmtap` (default) — listen for GSMTAP-SIM on UDP 4729, e.g. from
|
||||||
|
`simtrace2-pysniff` or `sigrok_iso7816_stream`;
|
||||||
|
- `--capture direct` — read SIMtrace2 hardware directly (needs PyUSB; Windows
|
||||||
|
also needs the driver swap, see [USB Device Access](#usb-device-access));
|
||||||
|
- `--capture disabled` — only browse stored captures.
|
||||||
|
|
||||||
|
The full runtime guide (server options, the UI views, the capture utility) is
|
||||||
|
in [Usage](#usage) below.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
### Analysis server + PWA (`simtrace-analyser-server`)
|
### Analysis server + PWA (`simtrace-analyser-server`)
|
||||||
|
|
||||||
Stores captured APDU traffic in SQLite and serves it over HTTP, together with
|
Stores captured APDU traffic in SQLite and serves it over HTTP, together with
|
||||||
the bundled **SIMtrace Analyser** PWA (`frontend/` in a source checkout,
|
the bundled **SIMtrace Analyser** PWA (`frontend/` in a source checkout,
|
||||||
bundled into the package on install) on the same origin. Three
|
bundled into the package on install) on the same origin. The commands below
|
||||||
|
use the console script; from a source checkout the launchers take the same
|
||||||
|
options (`./start.sh --capture gsmtap`, `start.bat --capture gsmtap`). Three
|
||||||
capture modes:
|
capture modes:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -405,6 +357,71 @@ If installed via `pip install -e .`, use the console script directly:
|
|||||||
simtrace2-pysniff --format atr-time
|
simtrace2-pysniff --format atr-time
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Utility CLI Options
|
||||||
|
|
||||||
|
```
|
||||||
|
python -m simtrace2_pysniff [OPTIONS]
|
||||||
|
|
||||||
|
--format, -f FORMAT Output format (default: hex)
|
||||||
|
hex — plain hex dump
|
||||||
|
timestamp — TPDU lines prefixed with [HH:MM:SS.mmm]
|
||||||
|
atr-time — TPDU lines prefixed with [SSSS.mmm] from last ATR
|
||||||
|
--gsmtap HOST[:PORT] Send ATR/TPDU as GSMTAP over UDP (default port 4729)
|
||||||
|
--pcap FILE Write sniffed data to PCAP file for Wireshark
|
||||||
|
--output, -o FILE Write hex dump to file
|
||||||
|
--no-stdout Suppress hex dump to stdout
|
||||||
|
--vendor HEX USB vendor ID (default: 0x1d50)
|
||||||
|
--product HEX USB product ID (default: auto-detect)
|
||||||
|
|
||||||
|
Recovery options:
|
||||||
|
--no-reconnect Exit on USB disconnect instead of reconnecting
|
||||||
|
--reconnect-delay-min SEC Minimum reconnect delay (default: 1.0)
|
||||||
|
--reconnect-delay-max SEC Maximum reconnect delay cap (default: 30.0)
|
||||||
|
--backoff-factor N Exponential backoff multiplier (default: 1.5)
|
||||||
|
--inactivity-timeout SEC Reconnect after N seconds of silence (default: disabled)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output Formats
|
||||||
|
|
||||||
|
- **`hex`** (default): plain hex dump — `ATR: 3b 9e ...`, `TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
- **`timestamp`**: TPDU lines prefixed with local time — `[14:32:05.123] TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
- **`atr-time`**: TPDU lines prefixed with seconds since last ATR — `[0001.234] TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
|
||||||
|
Non-TPDU messages (ATR, PPS, card state changes, Fi/Di) print identically in all formats.
|
||||||
|
|
||||||
|
- **GSMTAP**: ATR and APDU messages over UDP (port 4729) to Wireshark
|
||||||
|
- **PCAP**: ATR/TPDU messages as Ethernet/IP/UDP/GSMTAP packets, openable in Wireshark
|
||||||
|
|
||||||
|
### Background / Daemon
|
||||||
|
|
||||||
|
SIGHUP is automatically ignored when stdin is not a terminal (i.e. run in
|
||||||
|
background or via a pipe). Foreground terminal sessions still respond to
|
||||||
|
SIGHUP normally.
|
||||||
|
|
||||||
|
To run persistently in the background with output to files:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nohup ./sniff-start.sh --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
||||||
|
# or
|
||||||
|
FORMAT=timestamp nohup python -m simtrace2_pysniff --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
||||||
|
```
|
||||||
|
|
||||||
|
### Library Usage
|
||||||
|
|
||||||
|
```python
|
||||||
|
from simtrace2_pysniff import SniffSession
|
||||||
|
|
||||||
|
session = SniffSession(inactivity_timeout=30.0)
|
||||||
|
for msg in session.iter_messages():
|
||||||
|
print(f"{msg.type}: {msg.data.hex()}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Recovery
|
||||||
|
|
||||||
|
The utility survives hardware resets, cable disconnects, and firmware hangs
|
||||||
|
by default — it reconnects with exponential backoff (1s → 30s cap).
|
||||||
|
Use `--inactivity-timeout` to also trigger reconnect on silent firmware hangs.
|
||||||
|
|
||||||
## USB Device Access
|
## USB Device Access
|
||||||
|
|
||||||
Required for capture from SIMtrace2 hardware (the utility and the server's
|
Required for capture from SIMtrace2 hardware (the utility and the server's
|
||||||
@@ -442,70 +459,72 @@ through: `start.bat --capture direct` starts the analyser server and
|
|||||||
Python 3 must be on `PATH` (verify with `python --version` in a new command
|
Python 3 must be on `PATH` (verify with `python --version` in a new command
|
||||||
prompt).
|
prompt).
|
||||||
|
|
||||||
## Utility CLI Options
|
## Components
|
||||||
|
|
||||||
```
|
- **Analysis server + PWA** (`simtrace-analyser-server`) — stores captured
|
||||||
python -m simtrace2_pysniff [OPTIONS]
|
traffic in SQLite, decodes it, and serves the PWA ([`frontend/`](frontend/))
|
||||||
|
plus the HTTP API on a single origin. Three capture modes: a GSMTAP
|
||||||
|
listener, direct SIMtrace2 hardware capture, or disabled (browse existing
|
||||||
|
captures only).
|
||||||
|
- **Capture utility** (`simtrace2-pysniff`) — captures SIMtrace2 hardware
|
||||||
|
traffic and writes it to stdout, GSMTAP (Wireshark), or PCAP files. It is
|
||||||
|
one GSMTAP source of several that the analyser accepts (see also
|
||||||
|
[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)).
|
||||||
|
- **PWA** ([`frontend/`](frontend/)) — trace browser with decoded APDU,
|
||||||
|
SIM Toolkit, SMS and SCP80 OTA detail; sessions, PCAP and COMPRION trace
|
||||||
|
import, EN/RU UI.
|
||||||
|
|
||||||
--format, -f FORMAT Output format (default: hex)
|
## Features
|
||||||
hex — plain hex dump
|
|
||||||
timestamp — TPDU lines prefixed with [HH:MM:SS.mmm]
|
|
||||||
atr-time — TPDU lines prefixed with [SSSS.mmm] from last ATR
|
|
||||||
--gsmtap HOST[:PORT] Send ATR/TPDU as GSMTAP over UDP (default port 4729)
|
|
||||||
--pcap FILE Write sniffed data to PCAP file for Wireshark
|
|
||||||
--output, -o FILE Write hex dump to file
|
|
||||||
--no-stdout Suppress hex dump to stdout
|
|
||||||
--vendor HEX USB vendor ID (default: 0x1d50)
|
|
||||||
--product HEX USB product ID (default: auto-detect)
|
|
||||||
|
|
||||||
Recovery options:
|
**APDU decoder** (server-side, rendered by the PWA):
|
||||||
--no-reconnect Exit on USB disconnect instead of reconnecting
|
|
||||||
--reconnect-delay-min SEC Minimum reconnect delay (default: 1.0)
|
|
||||||
--reconnect-delay-max SEC Maximum reconnect delay cap (default: 30.0)
|
|
||||||
--backoff-factor N Exponential backoff multiplier (default: 1.5)
|
|
||||||
--inactivity-timeout SEC Reconnect after N seconds of silence (default: disabled)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Output Formats
|
- Full APDU decode — CLA per ISO 7816-4 / ETSI coding with the **logical
|
||||||
|
channel 0-19** (standard channels from b2-b1, the extended channels 4-19
|
||||||
|
from b4-b1 per TS 102 221 §10.3), secure messaging and command chaining,
|
||||||
|
INS names from a spec table, SFI-aware P1/P2 for READ/UPDATE BINARY and
|
||||||
|
record commands; MANAGE CHANNEL replies show the channel the card
|
||||||
|
assigned
|
||||||
|
- Status words — full ISO 7816-4 set plus UICC-specific values:
|
||||||
|
`91XX` (proactive command pending), `62F1/F2/F3`, `63F1/F2` (more data),
|
||||||
|
`9300` (SAT busy), `9850`, `9862–64`
|
||||||
|
- SIM Toolkit — SAT (GSM 11.14), CAT (TS 102 223) and USAT (TS 31.111)
|
||||||
|
proactive commands with decoded qualifiers, TERMINAL RESPONSE, ENVELOPE
|
||||||
|
(Menu Selection, Call Control, SMS-PP download…); tolerates known
|
||||||
|
non-compliant legacy-card quirks and preserves unrecognized TLVs
|
||||||
|
- TERMINAL CAPABILITY (TS 102 221 §11.1.19) — terminal power supply
|
||||||
|
(voltage class, maximum current, clock), extended logical channels,
|
||||||
|
additional interfaces (UICC-CLF) and eUICC device capabilities
|
||||||
|
(SGP.22/SGP.32)
|
||||||
|
- SMS TPDU — SMS-DELIVER/SUBMIT, SCTS timestamps, UDH information elements
|
||||||
|
- SCP80 OTA secured packets — SPI bits (ciphering, PoR requirement/mode,
|
||||||
|
RC/CC/DS, counter), KIc/KID algorithm + key set, TAR, CNTR/PCNTR;
|
||||||
|
Response Packet (PoR) decode on GET RESPONSE; **optional client-side
|
||||||
|
decryption** of ciphered packets — paste the card's 3DES/AES key in the
|
||||||
|
detail view to reveal the real CNTR and secured application data (the
|
||||||
|
key stays in the browser, in-memory only; ciphered on-wire CNTR/PCNTR/RC
|
||||||
|
are ciphertext and labeled as such); the secured application message is
|
||||||
|
decoded as a stream of **C-APDUs** (SELECT, UPDATE BINARY, …) with
|
||||||
|
full CLA/INS/P1/P2/Lc/Le breakdown — plaintext immediately, or after
|
||||||
|
decryption for ciphered packets
|
||||||
|
- ATR parse (clock-rate conversion, Fi/Di, T-bitmask, truncated-ATR safe)
|
||||||
|
and FCP/FCI TLV; the historical bytes are decoded as the UICC's
|
||||||
|
COMPACT-TLV objects (TS 102 221 §6.3.1) — card service data, the **card
|
||||||
|
capabilities** (ISO 7816-4 §8.1.1.2.7 Table 88: the assignment methods
|
||||||
|
and the announced maximum number of logical channels, `8 or more` for the
|
||||||
|
extended-capable cards) and the trailing status indicator (LCS/SW)
|
||||||
|
|
||||||
- **`hex`** (default): plain hex dump — `ATR: 3b 9e ...`, `TPDU: a0 a4 00 00 02 3f 00`
|
**SIMtrace Analyser PWA** ([`frontend/`](frontend/)):
|
||||||
- **`timestamp`**: TPDU lines prefixed with local time — `[14:32:05.123] TPDU: a0 a4 00 00 02 3f 00`
|
|
||||||
- **`atr-time`**: TPDU lines prefixed with seconds since last ATR — `[0001.234] TPDU: a0 a4 00 00 02 3f 00`
|
|
||||||
|
|
||||||
Non-TPDU messages (ATR, PPS, card state changes, Fi/Di) print identically in all formats.
|
- Trace view with Map/List modes — proactive, TERMINAL RESPONSE, ENVELOPE
|
||||||
|
and AUTH commands get distinctive styling in map view
|
||||||
- **GSMTAP**: ATR and APDU messages over UDP (port 4729) to Wireshark
|
- Sessions with deep links (`#session=N`), PCAP import (`.pcap/.pcapng/.cap`),
|
||||||
- **PCAP**: ATR/TPDU messages as Ethernet/IP/UDP/GSMTAP packets, openable in Wireshark
|
COMPRION trace import (the Device Manager *ISO Protocol Layer* text export),
|
||||||
|
search and a **multi-select command filter** — pick any number of commands
|
||||||
## Background / Daemon
|
and/or the conversation presets (*Proactive sessions*: FETCH, TERMINAL
|
||||||
|
PROFILE and every command answered with SW 91xx; *File operations*: SELECT,
|
||||||
SIGHUP is automatically ignored when stdin is not a terminal (i.e. run in
|
READ/UPDATE BINARY and READ/UPDATE RECORD, with the GET RESPONSE carrying a
|
||||||
background or via a pipe). Foreground terminal sessions still respond to
|
selected command's data)
|
||||||
SIGHUP normally.
|
- Installable PWA, dark theme, English/Russian UI
|
||||||
|
|
||||||
To run persistently in the background with output to files:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nohup ./sniff-start.sh --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
|
||||||
# or
|
|
||||||
FORMAT=timestamp nohup python -m simtrace2_pysniff --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
|
||||||
```
|
|
||||||
|
|
||||||
## Library Usage
|
|
||||||
|
|
||||||
```python
|
|
||||||
from simtrace2_pysniff import SniffSession
|
|
||||||
|
|
||||||
session = SniffSession(inactivity_timeout=30.0)
|
|
||||||
for msg in session.iter_messages():
|
|
||||||
print(f"{msg.type}: {msg.data.hex()}")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Recovery
|
|
||||||
|
|
||||||
The utility survives hardware resets, cable disconnects, and firmware hangs
|
|
||||||
by default — it reconnects with exponential backoff (1s → 30s cap).
|
|
||||||
Use `--inactivity-timeout` to also trigger reconnect on silent firmware hangs.
|
|
||||||
|
|
||||||
## Related
|
## Related
|
||||||
|
|
||||||
|
|||||||
+190
-173
@@ -13,76 +13,6 @@ SIM/UICC из UDP-потока GSMTAP (или импортирует файлы
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Компоненты
|
|
||||||
|
|
||||||
- **Анализирующий сервер + PWA** (`simtrace-analyser-server`) — сохраняет
|
|
||||||
захваченный трафик в SQLite, декодирует его и отдаёт PWA
|
|
||||||
([`frontend/`](frontend/)) вместе с HTTP API на одном origin. Три режима
|
|
||||||
захвата: GSMTAP-листенер, захват напрямую с оборудования SIMtrace2 или
|
|
||||||
отключённый захват (только просмотр существующих записей).
|
|
||||||
- **Утилита захвата** (`simtrace2-pysniff`) — захватывает трафик
|
|
||||||
оборудования SIMtrace2 и выводит его в stdout, GSMTAP (Wireshark) или
|
|
||||||
PCAP-файлы. Это один из нескольких источников GSMTAP, которые принимает
|
|
||||||
анализатор (см. также
|
|
||||||
[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)).
|
|
||||||
- **PWA** ([`frontend/`](frontend/)) — окно трассировки с декодированными
|
|
||||||
APDU, SIM Toolkit, SMS и SCP80 OTA; сессии, импорт PCAP и трасс COMPRION,
|
|
||||||
интерфейс EN/RU.
|
|
||||||
|
|
||||||
## Возможности
|
|
||||||
|
|
||||||
**Декодер APDU** (на стороне сервера, отображается в PWA):
|
|
||||||
|
|
||||||
- Полное декодирование APDU — CLA по ISO 7816-4 / ETSI с **логическим
|
|
||||||
каналом 0-19** (стандартные каналы из b2-b1, расширенные 4-19 из b4-b1
|
|
||||||
по TS 102 221 §10.3), secure messaging и chaining команд, имена INS из
|
|
||||||
таблицы спецификаций, учёт SFI в P1/P2 для READ/UPDATE BINARY и команд
|
|
||||||
с записями; ответ MANAGE CHANNEL показывает назначенный картой канал
|
|
||||||
- Статусные слова — полный набор ISO 7816-4 плюс специфичные для UICC
|
|
||||||
значения: `91XX` (ожидается proactive-команда), `62F1/F2/F3`,
|
|
||||||
`63F1/F2` (больше данных), `9300` (SAT busy), `9850`, `9862–64`
|
|
||||||
- SIM Toolkit — SAT (GSM 11.14), CAT (TS 102 223) и USAT (TS 31.111):
|
|
||||||
proactive-команды с декодированными квалификаторами, TERMINAL RESPONSE,
|
|
||||||
ENVELOPE (Menu Selection, Call Control, SMS-PP download…); учитываются
|
|
||||||
известные несоответствия старых карт, нераспознанные TLV сохраняются
|
|
||||||
- TERMINAL CAPABILITY (TS 102 221 §11.1.19) — питание терминала (класс
|
|
||||||
напряжения, максимальный ток, тактовая частота), расширенные логические
|
|
||||||
каналы, дополнительные интерфейсы (UICC-CLF) и возможности eUICC
|
|
||||||
(SGP.22/SGP.32)
|
|
||||||
- SMS TPDU — SMS-DELIVER/SUBMIT, метки времени SCTS, информационные
|
|
||||||
элементы UDH
|
|
||||||
- SCP80 OTA secured packets — биты SPI (шифрование, требование/режим PoR,
|
|
||||||
RC/CC/DS, счётчик), алгоритм KIc/KID + набор ключей, TAR, CNTR/PCNTR;
|
|
||||||
декодирование Response Packet (PoR) по GET RESPONSE; **опциональная
|
|
||||||
расшифровка на клиенте** зашифрованных пакетов — вставьте 3DES/AES-ключ
|
|
||||||
карты в панели деталей, чтобы увидеть настоящие CNTR и защищённые данные
|
|
||||||
приложения (ключ остаётся в браузере, только в памяти; зашифрованные
|
|
||||||
в эфире CNTR/PCNTR/RC — это шифротекст, и они так и помечены); защищённое
|
|
||||||
сообщение приложения декодируется как поток **C-APDU** (SELECT,
|
|
||||||
UPDATE BINARY, …) с полной разбивкой CLA/INS/P1/P2/Lc/Le — сразу для
|
|
||||||
открытого текста или после расшифровки для зашифрованных пакетов
|
|
||||||
- Разбор ATR (пересчёт тактовой частоты, Fi/Di, битовая маска T,
|
|
||||||
безопасен для усечённых ATR) и FCP/FCI TLV; исторические байты
|
|
||||||
разбираются как COMPACT-TLV объекты UICC (TS 102 221 §6.3.1) — card
|
|
||||||
service data, **card capabilities** (ISO 7816-4 §8.1.1.2.7 таблица 88:
|
|
||||||
способы назначения и заявленное максимальное число логических каналов,
|
|
||||||
`8 or more` у карт с расширенными каналами) и завершающий индикатор
|
|
||||||
состояния (LCS/SW)
|
|
||||||
|
|
||||||
**PWA SIMtrace Analyser** ([`frontend/`](frontend/)):
|
|
||||||
|
|
||||||
- Окно трассировки с режимами «Карта»/«Список» — proactive,
|
|
||||||
TERMINAL RESPONSE, ENVELOPE и AUTH-команды выделяются в режиме карты
|
|
||||||
- Сессии с прямыми ссылками (`#session=N`), импорт PCAP
|
|
||||||
(`.pcap/.pcapng/.cap`), импорт трасс COMPRION (текстовый экспорт
|
|
||||||
«ISO Protocol Layer» из Device Manager), поиск и **фильтр команд с
|
|
||||||
множественным выбором** — любые команды и/или готовые пресеты («Проактивные
|
|
||||||
сессии»: FETCH, TERMINAL PROFILE и все команды с ответом SW 91xx;
|
|
||||||
«Файловые операции»: SELECT,
|
|
||||||
READ/UPDATE BINARY и READ/UPDATE RECORD, вместе с GET RESPONSE, несущим
|
|
||||||
данные выбранной команды)
|
|
||||||
- Устанавливаемая PWA, тёмная тема, интерфейс на английском/русском
|
|
||||||
|
|
||||||
## Требования
|
## Требования
|
||||||
|
|
||||||
- **Python 3.9+**
|
- **Python 3.9+**
|
||||||
@@ -99,23 +29,17 @@ SIM/UICC из UDP-потока GSMTAP (или импортирует файлы
|
|||||||
Других зависимостей нет. Вывод PCAP, GSMTAP и hex dump использует только
|
Других зависимостей нет. Вывод PCAP, GSMTAP и hex dump использует только
|
||||||
стандартную библиотеку Python.
|
стандартную библиотеку Python.
|
||||||
|
|
||||||
## Установка
|
## Быстрый старт
|
||||||
|
|
||||||
Есть два способа получить анализатор: установить артефакт релиза (без истории
|
Три способа запустить анализатор; все они отдают одну и ту же PWA на
|
||||||
git) или склонировать репозиторий для разработки. В обоих случаях в комплекте
|
http://127.0.0.1:8081/.
|
||||||
одна и та же PWA.
|
|
||||||
|
|
||||||
### Из релиза (без истории git)
|
### 1. Wheel (pip)
|
||||||
|
|
||||||
Всё находится на странице
|
Wheel содержит PWA внутри пакета, поэтому сервер отдаёт интерфейс сам:
|
||||||
[последнего релиза](https://github.com/anttro/simtrace-analyser/releases/latest).
|
|
||||||
|
|
||||||
**Wheel** (PWA внутри пакета):
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install ./simtrace_analyser-2.7.13-py3-none-any.whl
|
pip install ./simtrace_analyser-2.7.13-py3-none-any.whl
|
||||||
|
|
||||||
# затем запуск (интерфейс отдаётся на http://127.0.0.1:8081/):
|
|
||||||
simtrace-analyser-server --capture gsmtap
|
simtrace-analyser-server --capture gsmtap
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -123,31 +47,43 @@ simtrace-analyser-server --capture gsmtap
|
|||||||
Fedora), сначала создайте виртуальное окружение:
|
Fedora), сначала создайте виртуальное окружение:
|
||||||
`python3 -m venv .venv && . .venv/bin/activate`.
|
`python3 -m venv .venv && . .venv/bin/activate`.
|
||||||
|
|
||||||
`pip` также может скачать wheel прямо со страницы релиза (подставьте версию,
|
Все артефакты лежат на странице
|
||||||
указанную там):
|
[последнего релиза](https://github.com/anttro/simtrace-analyser/releases/latest).
|
||||||
|
`pip` может скачать wheel напрямую (подставьте версию со страницы), а GitHub
|
||||||
|
CLI — выбрать последнюю:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl
|
pip install https://github.com/anttro/simtrace-analyser/releases/download/v2.7.13/simtrace_analyser-2.7.13-py3-none-any.whl
|
||||||
```
|
# или:
|
||||||
|
|
||||||
С GitHub CLI можно скачать wheel последнего релиза, не зная версии:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
gh release download --pattern '*.whl'
|
gh release download --pattern '*.whl'
|
||||||
pip install ./simtrace_analyser-*.whl
|
pip install ./simtrace_analyser-*.whl
|
||||||
```
|
```
|
||||||
|
|
||||||
**Архив исходников** — ассеты *Source code (zip / tar.gz)* содержат полное
|
### 2. Zip (для Windows, без установки)
|
||||||
дерево без истории git: распакуйте, перейдите в каталог и используйте скрипты
|
|
||||||
запуска ниже (`./start.sh` в Linux/macOS, `start.bat` в Windows).
|
|
||||||
|
|
||||||
**Zip (для Windows, без установки)** — `simtrace-analyser-2.7.13.zip`
|
Скачайте `simtrace-analyser-2.7.13.zip` со страницы релиза и распакуйте в любое
|
||||||
содержит только рабочее дерево (пакеты, PWA, скрипты запуска, документацию;
|
место: это рабочее дерево (пакеты Python, PWA, скрипты запуска и документация —
|
||||||
без тестов и git): скачайте, распакуйте в любое место и запустите `start.bat`
|
без тестов и git). Затем запустите.
|
||||||
(Windows) или `./start.sh` (Linux/macOS). Python 3 должен быть в `PATH`;
|
|
||||||
`pip install pyusb` нужен только для прямого захвата с SIMtrace2.
|
|
||||||
|
|
||||||
### Из клона репозитория (для разработки)
|
Windows:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
start.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
Linux/macOS:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Python 3 должен быть в `PATH`; `pip install pyusb` нужен только для прямого
|
||||||
|
захвата с SIMtrace2. Скрипты принимают параметры сервера
|
||||||
|
(`start.bat --capture direct`, `./start.sh --capture direct --port 8080`).
|
||||||
|
(Архив *Source code* из релиза — это полное дерево вместе с тестами; он
|
||||||
|
работает так же, как клон ниже.)
|
||||||
|
|
||||||
|
### 3. Клон репозитория (для разработки)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone https://github.com/anttro/simtrace-analyser.git
|
git clone https://github.com/anttro/simtrace-analyser.git
|
||||||
@@ -156,31 +92,42 @@ cd simtrace-analyser
|
|||||||
```
|
```
|
||||||
|
|
||||||
Скрипты запуска добавляют каталог в `PYTHONPATH` и запускают
|
Скрипты запуска добавляют каталог в `PYTHONPATH` и запускают
|
||||||
`python -m simtrace_analyser`, поэтому для просмотра и захвата GSMTAP
|
`python -m simtrace_analyser`, поэтому для просмотра и захвата GSMTAP ничего
|
||||||
установка не нужна; они принимают параметры сервера
|
устанавливать не нужно; их параметры — это параметры сервера
|
||||||
(`./start.sh --capture direct --port 8080`). Для прямого захвата с
|
(`./start.sh --capture direct --port 8080`). Для прямого захвата с
|
||||||
оборудования нужен **PyUSB** (`pip install pyusb`).
|
оборудования нужен **PyUSB** (`pip install pyusb`). Чтобы получить консольные
|
||||||
|
команды (`simtrace-analyser-server`, `simtrace2-pysniff`), установите пакет:
|
||||||
Чтобы получить консольные команды (`simtrace-analyser-server`,
|
|
||||||
`simtrace2-pysniff`), установите пакет:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pip install -e .
|
pip install -e .
|
||||||
simtrace-analyser-server --capture gsmtap
|
simtrace-analyser-server --capture gsmtap
|
||||||
```
|
```
|
||||||
|
|
||||||
В Windows скрипты `.bat` вызывают команду `python`, поэтому Python 3 должен
|
### Первый запуск
|
||||||
быть в `PATH` (проверьте `python --version`); для прямого захвата по USB
|
|
||||||
дополнительно нужна замена драйвера, описанная в разделе
|
|
||||||
[Доступ к USB-устройству](#доступ-к-usb-устройству).
|
|
||||||
|
|
||||||
## Запуск
|
Откройте **http://127.0.0.1:8081/** — PWA отдаёт сервер, поэтому интерфейс и
|
||||||
|
API находятся на одном origin (настройка CORS/Private-Network-Access не нужна).
|
||||||
|
`Ctrl+C` останавливает сервер.
|
||||||
|
|
||||||
|
- `--capture gsmtap` (по умолчанию) — слушать GSMTAP-SIM на UDP 4729,
|
||||||
|
например от `simtrace2-pysniff` или `sigrok_iso7816_stream`;
|
||||||
|
- `--capture direct` — читать оборудование SIMtrace2 напрямую (нужен PyUSB; в
|
||||||
|
Windows также нужна замена драйвера, см.
|
||||||
|
[Доступ к USB-устройству](#доступ-к-usb-устройству));
|
||||||
|
- `--capture disabled` — только просмотр сохранённых захватов.
|
||||||
|
|
||||||
|
Полное руководство по работе (параметры сервера, экраны PWA, утилита захвата)
|
||||||
|
находится в разделе [Использование](#использование).
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
### Анализирующий сервер + PWA (`simtrace-analyser-server`)
|
### Анализирующий сервер + PWA (`simtrace-analyser-server`)
|
||||||
|
|
||||||
Сохраняет захваченный APDU-трафик в SQLite и отдаёт его по HTTP вместе
|
Сохраняет захваченный APDU-трафик в SQLite и отдаёт его по HTTP вместе
|
||||||
со встроенной PWA **SIMtrace Analyser** (`frontend/` в исходном клоне, при
|
со встроенной PWA **SIMtrace Analyser** (`frontend/` в исходном клоне, при
|
||||||
установке — внутри пакета) на том же origin.
|
установке — внутри пакета) на том же origin.
|
||||||
|
Команды ниже — консольная команда; при запуске из клона скрипты принимают те
|
||||||
|
же параметры (`./start.sh --capture gsmtap`, `start.bat --capture gsmtap`).
|
||||||
Три режима захвата:
|
Три режима захвата:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -417,6 +364,77 @@ python -m simtrace2_pysniff --pcap trace.pcap
|
|||||||
simtrace2-pysniff --format atr-time
|
simtrace2-pysniff --format atr-time
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Параметры CLI утилиты
|
||||||
|
|
||||||
|
```
|
||||||
|
python -m simtrace2_pysniff [OPTIONS]
|
||||||
|
|
||||||
|
--format, -f FORMAT Формат вывода (по умолчанию: hex)
|
||||||
|
hex — обычный hex-дамп
|
||||||
|
timestamp — строки TPDU с префиксом [ЧЧ:ММ:СС.мс]
|
||||||
|
atr-time — строки TPDU с префиксом [СССС.мс] от последнего ATR
|
||||||
|
--gsmtap HOST[:PORT] Отправлять ATR/TPDU как GSMTAP по UDP (порт по умолчанию 4729)
|
||||||
|
--pcap FILE Записывать перехваченные данные в PCAP для Wireshark
|
||||||
|
--output, -o FILE Записывать hex-дамп в файл
|
||||||
|
--no-stdout Не выводить hex-дамп в stdout
|
||||||
|
--vendor HEX USB vendor ID (по умолчанию: 0x1d50)
|
||||||
|
--product HEX USB product ID (по умолчанию: автоопределение)
|
||||||
|
|
||||||
|
Параметры восстановления:
|
||||||
|
--no-reconnect Выходить при отключении USB вместо переподключения
|
||||||
|
--reconnect-delay-min SEC Минимальная задержка переподключения (по умолчанию: 1.0)
|
||||||
|
--reconnect-delay-max SEC Максимальная задержка переподключения (по умолчанию: 30.0)
|
||||||
|
--backoff-factor N Множитель экспоненциальной задержки (по умолчанию: 1.5)
|
||||||
|
--inactivity-timeout SEC Переподключаться после N секунд тишины (по умолчанию: выключено)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Форматы вывода
|
||||||
|
|
||||||
|
- **`hex`** (по умолчанию): обычный hex-дамп — `ATR: 3b 9e ...`,
|
||||||
|
`TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
- **`timestamp`**: строки TPDU с локальным временем —
|
||||||
|
`[14:32:05.123] TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
- **`atr-time`**: строки TPDU с секундами от последнего ATR —
|
||||||
|
`[0001.234] TPDU: a0 a4 00 00 02 3f 00`
|
||||||
|
|
||||||
|
Сообщения, не являющиеся TPDU (ATR, PPS, изменения состояния карты, Fi/Di),
|
||||||
|
выводятся одинаково во всех форматах.
|
||||||
|
|
||||||
|
- **GSMTAP**: сообщения ATR и APDU по UDP (порт 4729) в Wireshark
|
||||||
|
- **PCAP**: сообщения ATR/TPDU как пакеты Ethernet/IP/UDP/GSMTAP,
|
||||||
|
открываются в Wireshark
|
||||||
|
|
||||||
|
### Фоновый режим / демон
|
||||||
|
|
||||||
|
SIGHUP автоматически игнорируется, когда stdin не является терминалом
|
||||||
|
(т.е. при запуске в фоне или через канал). Сессии в терминале на переднем
|
||||||
|
плане по-прежнему обрабатывают SIGHUP обычным образом.
|
||||||
|
|
||||||
|
Для постоянной работы в фоне с выводом в файлы:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nohup ./sniff-start.sh --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
||||||
|
# или
|
||||||
|
FORMAT=timestamp nohup python -m simtrace2_pysniff --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование как библиотеки
|
||||||
|
|
||||||
|
```python
|
||||||
|
from simtrace2_pysniff import SniffSession
|
||||||
|
|
||||||
|
session = SniffSession(inactivity_timeout=30.0)
|
||||||
|
for msg in session.iter_messages():
|
||||||
|
print(f"{msg.type}: {msg.data.hex()}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Восстановление
|
||||||
|
|
||||||
|
Утилита по умолчанию переживает сбросы оборудования, отключения кабеля
|
||||||
|
и зависания прошивки — она переподключается с экспоненциальной задержкой
|
||||||
|
(1с → 30с). Используйте `--inactivity-timeout`, чтобы также переподключаться
|
||||||
|
при «тихих» зависаниях прошивки.
|
||||||
|
|
||||||
## Доступ к USB-устройству
|
## Доступ к USB-устройству
|
||||||
|
|
||||||
Нужен для захвата с оборудования SIMtrace2 (утилита и режим
|
Нужен для захвата с оборудования SIMtrace2 (утилита и режим
|
||||||
@@ -455,76 +473,75 @@ sudo udevadm trigger
|
|||||||
Python 3 должен быть в `PATH` (проверьте `python --version` в новом окне
|
Python 3 должен быть в `PATH` (проверьте `python --version` в новом окне
|
||||||
команды).
|
команды).
|
||||||
|
|
||||||
## Параметры CLI утилиты
|
## Компоненты
|
||||||
|
|
||||||
```
|
- **Анализирующий сервер + PWA** (`simtrace-analyser-server`) — сохраняет
|
||||||
python -m simtrace2_pysniff [OPTIONS]
|
захваченный трафик в SQLite, декодирует его и отдаёт PWA
|
||||||
|
([`frontend/`](frontend/)) вместе с HTTP API на одном origin. Три режима
|
||||||
|
захвата: GSMTAP-листенер, захват напрямую с оборудования SIMtrace2 или
|
||||||
|
отключённый захват (только просмотр существующих записей).
|
||||||
|
- **Утилита захвата** (`simtrace2-pysniff`) — захватывает трафик
|
||||||
|
оборудования SIMtrace2 и выводит его в stdout, GSMTAP (Wireshark) или
|
||||||
|
PCAP-файлы. Это один из нескольких источников GSMTAP, которые принимает
|
||||||
|
анализатор (см. также
|
||||||
|
[sigrok_iso7816_stream](https://github.com/anttro/sigrok_iso7816_stream)).
|
||||||
|
- **PWA** ([`frontend/`](frontend/)) — окно трассировки с декодированными
|
||||||
|
APDU, SIM Toolkit, SMS и SCP80 OTA; сессии, импорт PCAP и трасс COMPRION,
|
||||||
|
интерфейс EN/RU.
|
||||||
|
|
||||||
--format, -f FORMAT Формат вывода (по умолчанию: hex)
|
## Возможности
|
||||||
hex — обычный hex-дамп
|
|
||||||
timestamp — строки TPDU с префиксом [ЧЧ:ММ:СС.мс]
|
|
||||||
atr-time — строки TPDU с префиксом [СССС.мс] от последнего ATR
|
|
||||||
--gsmtap HOST[:PORT] Отправлять ATR/TPDU как GSMTAP по UDP (порт по умолчанию 4729)
|
|
||||||
--pcap FILE Записывать перехваченные данные в PCAP для Wireshark
|
|
||||||
--output, -o FILE Записывать hex-дамп в файл
|
|
||||||
--no-stdout Не выводить hex-дамп в stdout
|
|
||||||
--vendor HEX USB vendor ID (по умолчанию: 0x1d50)
|
|
||||||
--product HEX USB product ID (по умолчанию: автоопределение)
|
|
||||||
|
|
||||||
Параметры восстановления:
|
**Декодер APDU** (на стороне сервера, отображается в PWA):
|
||||||
--no-reconnect Выходить при отключении USB вместо переподключения
|
|
||||||
--reconnect-delay-min SEC Минимальная задержка переподключения (по умолчанию: 1.0)
|
|
||||||
--reconnect-delay-max SEC Максимальная задержка переподключения (по умолчанию: 30.0)
|
|
||||||
--backoff-factor N Множитель экспоненциальной задержки (по умолчанию: 1.5)
|
|
||||||
--inactivity-timeout SEC Переподключаться после N секунд тишины (по умолчанию: выключено)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Форматы вывода
|
- Полное декодирование APDU — CLA по ISO 7816-4 / ETSI с **логическим
|
||||||
|
каналом 0-19** (стандартные каналы из b2-b1, расширенные 4-19 из b4-b1
|
||||||
|
по TS 102 221 §10.3), secure messaging и chaining команд, имена INS из
|
||||||
|
таблицы спецификаций, учёт SFI в P1/P2 для READ/UPDATE BINARY и команд
|
||||||
|
с записями; ответ MANAGE CHANNEL показывает назначенный картой канал
|
||||||
|
- Статусные слова — полный набор ISO 7816-4 плюс специфичные для UICC
|
||||||
|
значения: `91XX` (ожидается proactive-команда), `62F1/F2/F3`,
|
||||||
|
`63F1/F2` (больше данных), `9300` (SAT busy), `9850`, `9862–64`
|
||||||
|
- SIM Toolkit — SAT (GSM 11.14), CAT (TS 102 223) и USAT (TS 31.111):
|
||||||
|
proactive-команды с декодированными квалификаторами, TERMINAL RESPONSE,
|
||||||
|
ENVELOPE (Menu Selection, Call Control, SMS-PP download…); учитываются
|
||||||
|
известные несоответствия старых карт, нераспознанные TLV сохраняются
|
||||||
|
- TERMINAL CAPABILITY (TS 102 221 §11.1.19) — питание терминала (класс
|
||||||
|
напряжения, максимальный ток, тактовая частота), расширенные логические
|
||||||
|
каналы, дополнительные интерфейсы (UICC-CLF) и возможности eUICC
|
||||||
|
(SGP.22/SGP.32)
|
||||||
|
- SMS TPDU — SMS-DELIVER/SUBMIT, метки времени SCTS, информационные
|
||||||
|
элементы UDH
|
||||||
|
- SCP80 OTA secured packets — биты SPI (шифрование, требование/режим PoR,
|
||||||
|
RC/CC/DS, счётчик), алгоритм KIc/KID + набор ключей, TAR, CNTR/PCNTR;
|
||||||
|
декодирование Response Packet (PoR) по GET RESPONSE; **опциональная
|
||||||
|
расшифровка на клиенте** зашифрованных пакетов — вставьте 3DES/AES-ключ
|
||||||
|
карты в панели деталей, чтобы увидеть настоящие CNTR и защищённые данные
|
||||||
|
приложения (ключ остаётся в браузере, только в памяти; зашифрованные
|
||||||
|
в эфире CNTR/PCNTR/RC — это шифротекст, и они так и помечены); защищённое
|
||||||
|
сообщение приложения декодируется как поток **C-APDU** (SELECT,
|
||||||
|
UPDATE BINARY, …) с полной разбивкой CLA/INS/P1/P2/Lc/Le — сразу для
|
||||||
|
открытого текста или после расшифровки для зашифрованных пакетов
|
||||||
|
- Разбор ATR (пересчёт тактовой частоты, Fi/Di, битовая маска T,
|
||||||
|
безопасен для усечённых ATR) и FCP/FCI TLV; исторические байты
|
||||||
|
разбираются как COMPACT-TLV объекты UICC (TS 102 221 §6.3.1) — card
|
||||||
|
service data, **card capabilities** (ISO 7816-4 §8.1.1.2.7 таблица 88:
|
||||||
|
способы назначения и заявленное максимальное число логических каналов,
|
||||||
|
`8 or more` у карт с расширенными каналами) и завершающий индикатор
|
||||||
|
состояния (LCS/SW)
|
||||||
|
|
||||||
- **`hex`** (по умолчанию): обычный hex-дамп — `ATR: 3b 9e ...`,
|
**PWA SIMtrace Analyser** ([`frontend/`](frontend/)):
|
||||||
`TPDU: a0 a4 00 00 02 3f 00`
|
|
||||||
- **`timestamp`**: строки TPDU с локальным временем —
|
|
||||||
`[14:32:05.123] TPDU: a0 a4 00 00 02 3f 00`
|
|
||||||
- **`atr-time`**: строки TPDU с секундами от последнего ATR —
|
|
||||||
`[0001.234] TPDU: a0 a4 00 00 02 3f 00`
|
|
||||||
|
|
||||||
Сообщения, не являющиеся TPDU (ATR, PPS, изменения состояния карты, Fi/Di),
|
- Окно трассировки с режимами «Карта»/«Список» — proactive,
|
||||||
выводятся одинаково во всех форматах.
|
TERMINAL RESPONSE, ENVELOPE и AUTH-команды выделяются в режиме карты
|
||||||
|
- Сессии с прямыми ссылками (`#session=N`), импорт PCAP
|
||||||
- **GSMTAP**: сообщения ATR и APDU по UDP (порт 4729) в Wireshark
|
(`.pcap/.pcapng/.cap`), импорт трасс COMPRION (текстовый экспорт
|
||||||
- **PCAP**: сообщения ATR/TPDU как пакеты Ethernet/IP/UDP/GSMTAP,
|
«ISO Protocol Layer» из Device Manager), поиск и **фильтр команд с
|
||||||
открываются в Wireshark
|
множественным выбором** — любые команды и/или готовые пресеты («Проактивные
|
||||||
|
сессии»: FETCH, TERMINAL PROFILE и все команды с ответом SW 91xx;
|
||||||
## Фоновый режим / демон
|
«Файловые операции»: SELECT,
|
||||||
|
READ/UPDATE BINARY и READ/UPDATE RECORD, вместе с GET RESPONSE, несущим
|
||||||
SIGHUP автоматически игнорируется, когда stdin не является терминалом
|
данные выбранной команды)
|
||||||
(т.е. при запуске в фоне или через канал). Сессии в терминале на переднем
|
- Устанавливаемая PWA, тёмная тема, интерфейс на английском/русском
|
||||||
плане по-прежнему обрабатывают SIGHUP обычным образом.
|
|
||||||
|
|
||||||
Для постоянной работы в фоне с выводом в файлы:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nohup ./sniff-start.sh --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
|
||||||
# или
|
|
||||||
FORMAT=timestamp nohup python -m simtrace2_pysniff --output /tmp/sniff.log &> /tmp/sniff-err.log &
|
|
||||||
```
|
|
||||||
|
|
||||||
## Использование как библиотеки
|
|
||||||
|
|
||||||
```python
|
|
||||||
from simtrace2_pysniff import SniffSession
|
|
||||||
|
|
||||||
session = SniffSession(inactivity_timeout=30.0)
|
|
||||||
for msg in session.iter_messages():
|
|
||||||
print(f"{msg.type}: {msg.data.hex()}")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Восстановление
|
|
||||||
|
|
||||||
Утилита по умолчанию переживает сбросы оборудования, отключения кабеля
|
|
||||||
и зависания прошивки — она переподключается с экспоненциальной задержкой
|
|
||||||
(1с → 30с). Используйте `--inactivity-timeout`, чтобы также переподключаться
|
|
||||||
при «тихих» зависаниях прошивки.
|
|
||||||
|
|
||||||
## Связанные проекты
|
## Связанные проекты
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user